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