最近爆火的GraphRAG是什么,真的能用于商業(yè)應(yīng)用嗎? 原創(chuàng)
GraphRag解決了什么問(wèn)題
在樸素的RAG(自我檢索生成模型)中,我們使用一個(gè)向量庫(kù)作為我們的知識(shí)庫(kù)。當(dāng)用戶提出查詢時(shí),該系統(tǒng)從向量庫(kù)中匹配頂部K個(gè)元素作為上下文,并將這個(gè)上下文與提示和查詢一起交給大型語(yǔ)言模型(LLM)進(jìn)行回答。
現(xiàn)在,讓我們假設(shè)這個(gè)向量庫(kù)是指向企業(yè)知識(shí)的。有兩個(gè)示例查詢:
- xx產(chǎn)品的價(jià)格是多少?
- 去年技術(shù)團(tuán)隊(duì)的成果有哪些?
對(duì)于第一個(gè)問(wèn)題,由于它是非常具體的,知識(shí)庫(kù)的搜索可能會(huì)找到相應(yīng)的信息塊或常見(jiàn)問(wèn)題解答。對(duì)于這種類型的問(wèn)題,樸素的RAG通常會(huì)表現(xiàn)得很好。
對(duì)于第二個(gè)問(wèn)題,這是一個(gè)宏觀層面的查詢,需要將企業(yè)知識(shí)庫(kù)中所有與技術(shù)團(tuán)隊(duì)相關(guān)的項(xiàng)目收集起來(lái)并進(jìn)行總結(jié)。關(guān)鍵在于找到與技術(shù)團(tuán)隊(duì)成果相關(guān)的各類信息,然后以某種方式關(guān)聯(lián)起來(lái)以得出答案。這種方法也被稱為 "connecting the dots"。你可以參考這篇文章了解更多:https://blog.curiosity.ai/?-connecting-the-dots-how-to-improve-rag-with-knowledge-graphs-092c32024326
在這里,“dots”指的是分散在不同地方的關(guān)鍵信息。那么,樸素RAG能否有效解決這類問(wèn)題?雖然我們可以強(qiáng)制使用樸素RAG來(lái)尋找答案,但其效果很可能不會(huì)十分理想。
對(duì)于這類問(wèn)題,我們的一種解決策略是預(yù)先整理信息。例如,我們首先抽取與技術(shù)團(tuán)隊(duì)相關(guān)的所有信息。當(dāng)我們提出相關(guān)問(wèn)題時(shí),可以基于這些已經(jīng)抽取的信息進(jìn)一步進(jìn)行總結(jié)。這個(gè)過(guò)程實(shí)際上就是構(gòu)建知識(shí)圖譜的過(guò)程。
舉個(gè)例子,假設(shè)我們有大量文本,其中包含了技術(shù)團(tuán)隊(duì)執(zhí)行的各種項(xiàng)目的信息。在我們構(gòu)建的知識(shí)圖譜中,我們有多個(gè)節(jié)點(diǎn),代表技術(shù)團(tuán)隊(duì)和項(xiàng)目,并通過(guò)關(guān)系將它們連接起來(lái)。這樣,當(dāng)我們想了解他們完成了哪些工作時(shí),只需關(guān)注與這些節(jié)點(diǎn)相關(guān)的部分,便可獲悉技術(shù)團(tuán)隊(duì)已完成的任務(wù)。
這個(gè)構(gòu)建知識(shí)圖譜的過(guò)程通常可以用大型模型來(lái)完成,這也是GraphRAG模型提出的一個(gè)重要思想:預(yù)先提取并整理好信息,然后基于這些整理后的信息進(jìn)行回答。
進(jìn)一步來(lái)說(shuō),對(duì)于第二個(gè)問(wèn)題,相關(guān)的提問(wèn)方式有很多。例如:
- 張三的成果有哪些?我們可以找到與張三關(guān)聯(lián)的節(jié)點(diǎn),了解他相關(guān)的項(xiàng)目信息。
- 張三所在的后端團(tuán)隊(duì)的工作成果是什么?我們需要整合這個(gè)團(tuán)隊(duì)所有人員的工作成果。
- 進(jìn)一步上升層次,整個(gè)技術(shù)團(tuán)隊(duì)的成果是什么?類似地,我們需要將各個(gè)技術(shù)團(tuán)隊(duì)的成果集中起來(lái)。
這里呈現(xiàn)的是一個(gè)層次結(jié)構(gòu),因此在GraphRAG模型中,做了進(jìn)一步的操作: 創(chuàng)建這種層次結(jié)構(gòu)。我們預(yù)先整理出相關(guān)的關(guān)鍵信息,這樣的層次結(jié)構(gòu)是基于知識(shí)圖譜獲取的。因此,我們對(duì)這個(gè)知識(shí)圖進(jìn)行了類似的聚類,然后將這些實(shí)體的信息合并在一起,再對(duì)這些合并后的信息進(jìn)行整理。從知識(shí)圖譜到這里,GraphRAG采用了一些社區(qū)挖掘算法,這是GraphRAG的第二個(gè)重要思想。
那么,這套方法能否在商業(yè)環(huán)境中實(shí)施呢?我認(rèn)為目前來(lái)說(shuō)更像是一個(gè)原型。
- 首先,構(gòu)建知識(shí)圖譜的過(guò)程會(huì)產(chǎn)生大量噪聲,這需要大量的人工清洗和校正,成本高昂。
- 其次,在計(jì)算方面,聚類過(guò)程消耗資源較大。
- 再者,新數(shù)據(jù)的加入也是問(wèn)題。當(dāng)有關(guān)鍵信息加入時(shí),我們可能需要從頭開(kāi)始重建整個(gè)結(jié)構(gòu),這會(huì)產(chǎn)生大量的計(jì)算。這在知識(shí)圖譜領(lǐng)域?qū)嶋H上是一個(gè)比較難解決的問(wèn)題。
盡管如此,GraphRag作為一個(gè)新的RAG流程還是有必要學(xué)習(xí)一下的。
GraphRAG入門
環(huán)境配置
名稱 | 安裝 | 目的 |
Python 3.10 | 下載(opens in a new tab) | 該庫(kù)基于 Python 開(kāi)發(fā)。 |
Poetry | 使用說(shuō)明(opens in a new tab) | Poetry 用于 Python 代碼庫(kù)的包管理和虛擬環(huán)境管理。 |
下載源碼,安裝依賴
git clone https://github.com/microsoft/graphrag.git
cd graphrag
poetry install
如果你本地poetry install比較慢,可以在項(xiàng)目的pyproject.toml文件末尾添加:
[[tool.poetry.source]]
name = "aliyun"
url = "https://mirrors.aliyun.com/pypi/simple/"
并執(zhí)行poetry lock重新生成poetry.lock, 再執(zhí)行poetry install即可
對(duì)數(shù)據(jù)建索引
首先讓我們準(zhǔn)備一個(gè)示例數(shù)據(jù)集:
mkdir -p ./ragtest/input
現(xiàn)在讓我們從可靠的來(lái)源獲取查爾斯·狄更斯的《圣誕頌歌》的副本
curl https://www.gutenberg.org/cache/epub/24022/pg24022.txt > ./ragtest/input/book.txt
在當(dāng)前目錄準(zhǔn)備初始化:
poetry run poe index --init --root ./ragtest
它會(huì)在當(dāng)前目錄創(chuàng)建output、prompts目錄,以及.env文件和settings.yaml配置文件。
- output目錄,存儲(chǔ)生成的圖、以及總結(jié)、日志等信息。
- prompts目錄,存儲(chǔ)默認(rèn)的4個(gè)提示詞文件:claim_extraction.txt、community_report.txt、entity_extraction.txt、summarize_descriptions.txt。
- .env文件中只包含一個(gè)GRAPHRAG_API_KEY,用于設(shè)置你的LLM API_KEY。
- settings.yaml 文件較為復(fù)雜,配置項(xiàng)目也較多,運(yùn)行本項(xiàng)目只需要修改兩個(gè)llm和embeddings,我這里直接使用OpenAI, 沒(méi)錯(cuò),就是這么土豪!
接著我們執(zhí)行一條命令會(huì)自動(dòng)索引數(shù)據(jù),構(gòu)建知識(shí)圖譜,只是過(guò)程比較慢,耐心等待即可:
poetry run poe index --root ./ragtest
查詢
GraphRag的查詢分為兩種類型:
- 全局檢索:可以簡(jiǎn)單理解為 用于回答需要聚合信息的問(wèn)題
- 本地檢索/局部檢索:可以簡(jiǎn)單理解為 用于回答特定實(shí)體的問(wèn)題
全局查詢
poetry run poe query --root ./ragtest --method global '這個(gè)故事的主題是什么?'
輸出結(jié)果如下:
SUCCESS: Global Search Response: ### 故事主題概述
本故事的核心主題圍繞著**轉(zhuǎn)變與救贖**,通過(guò)Ebenezer Scrooge從吝嗇鬼到慷慨大方的典范的轉(zhuǎn)變,展現(xiàn)了個(gè)人改變的可能性和重要性。Scroogts (12, 15, 16, 20)]。
### 人物互動(dòng)與社會(huì)關(guān)系
故事通過(guò)Scrooge與Cratchit家庭以及各種鬼魂的互動(dòng),強(qiáng)調(diào)了慈悲、善良以及個(gè)人改變的重要性。這些互動(dòng)不僅展示了個(gè)人改變的可能性,還突出, 16, 18, 20)]。
### 社會(huì)影響與個(gè)人行為
Scrooge的旅程揭示了個(gè)體通過(guò)善行和慷慨對(duì)社區(qū)產(chǎn)生的積極影響。故事探討了希望、韌性和圣誕精神的主題,通過(guò)Tiny Tim和Cratchit家庭的形象,展示了即使在困難中也能體現(xiàn)出圣誕精神的典范 [Data: Reports (16, 18)]。
### 超自然引導(dǎo)與反思
故事還探討了超自然向?qū)г诖偈狗此己透淖冎械淖饔茫ㄟ^(guò)圣誕節(jié)過(guò)去、現(xiàn)在和未來(lái)的鬼魂的訪問(wèn),促使Scrooge反思自己的生活和行為。此外,故警告來(lái)體現(xiàn) [Data: Reports (12, 21)]。
### 社會(huì)正義與家庭社區(qū)的重要性
最后,故事還深入討論了社會(huì)不公和家庭及社區(qū)的重要性。Scrooge與Bob Cratchit和Tiny Tim的互動(dòng),不僅揭示了社會(huì)不公的主題,也強(qiáng)調(diào)了家庭和社區(qū)在個(gè)人生活中的價(jià)值 [Data: Reports (12)]。
綜上所述,本故事通過(guò)Scrooge的轉(zhuǎn)變之旅,探討了救贖、慈悲、社會(huì)責(zé)任和個(gè)人改變的重要性,以及這些主題如何在個(gè)人、家庭和更廣泛社區(qū)中產(chǎn)生深遠(yuǎn)影響。
局部檢索
poetry run poe query --root ./ragtest --method local 'Scrooge 這個(gè)故事的主人公是誰(shuí),他的主要關(guān)系是什么?'
輸出結(jié)果如下:
SUCCESS: Local Search Response: # 主人公與主要關(guān)系
## 主人公簡(jiǎn)介
故事的主人公是Ebenezer Scrooge,他是《A Christmas Carol》中的中心人物。Scrooge最初被描繪為一個(gè)貪婪、吝嗇的老人,對(duì)圣誕節(jié)和周圍人的苦難漠不關(guān)心。他的性格和態(tài)度通 (18, 23)]。
## 主要關(guān)系
### 與Bob Cratchit的關(guān)系
Bob Cratchit是Scrooge的職員,一個(gè)收入微薄但心地善良的人。Scrooge最初對(duì)Cratchit的待遇冷酷無(wú)情,但在故事的結(jié)尾,Scrooge提高了Cratchit的工資,并成為了他家庭的恩人 [Data: Relationships (14); Entities (9, 28)]。
### 與Jacob Marley的關(guān)系
Jacob Marley是Scrooge已故的商業(yè)伙伴,他的鬼魂在圣誕夜訪問(wèn)Scrooge,警告他改變自己的生活方式,以免死后遭受同樣的命運(yùn)。Marley的訪問(wèn)為Scrooge的轉(zhuǎn)變開(kāi)啟了序幕 [Data: Relationships (63, 41); Entities (50, 44)]。
### 與三個(gè)圣誕鬼魂的關(guān)系
三個(gè)圣誕鬼魂(圣誕節(jié)的過(guò)去、現(xiàn)在和未來(lái))分別訪問(wèn)Scrooge,展示了他的過(guò)去、現(xiàn)在和可能的未來(lái)。這些訪問(wèn)深刻影響了Scrooge,促使他反思自己的生活并最終改變了他的行為和態(tài)度 [Data: Relationships (72, 86); Entities (47)]。
### 與Tiny Tim的關(guān)系
Tiny Tim是Bob Cratchit的兒子,他的健康狀況和幸福成為Scrooge改變的一個(gè)重要?jiǎng)恿Αcrooge從一個(gè)冷漠的旁觀者變成了Tiny Tim的守護(hù)者和家庭的支持者 [Data: Relationships (86)]。
### 與侄子Fred的關(guān)系
Scrooge的侄子Fred代表了圣誕節(jié)的精神和樂(lè)觀態(tài)度,盡管Scrooge最初拒絕了Fred的圣誕邀請(qǐng),但最終他接受了Fred的善意,并與他和其他家庭成員建立了積極的關(guān)系 [Data: Entitiationships (52)]。
## 結(jié)論
Ebenezer Scrooge的故事是一個(gè)關(guān)于救贖和轉(zhuǎn)變的經(jīng)典故事。通過(guò)與Bob Cratchit、Jacob Marley、三個(gè)圣誕鬼魂、Tiny Tim和他的侄子Fred等關(guān)鍵角色的互動(dòng),Scrooge從一個(gè)孤獨(dú)、間的聯(lián)系、同情和理解的重要性。
總結(jié)
本文首先介紹了GraphRAG相比傳統(tǒng)的樸素RAG的優(yōu)勢(shì)以及其在商業(yè)落地上的局限性,然后講解了GraphRAG的基本使用,在實(shí)際操作過(guò)程中發(fā)現(xiàn)還是比較耗費(fèi)token的,那token到底耗費(fèi)在哪,其內(nèi)部運(yùn)行的流程又是怎么樣的呢?帶著這些問(wèn)題,接下來(lái)我會(huì)用兩篇圖文并茂的文章詳細(xì)介紹一下:
- GraphRAG如何構(gòu)造知識(shí)圖譜
- 全局檢索和局部檢索的流程
本文轉(zhuǎn)載自公眾號(hào)AI 博物院 作者:longyunfeigu
