1. graphrag vs rag
一個(gè)典型的rag有三個(gè)步驟:
- ?? 檢索:從論文庫中找出 GNN 和推薦系統(tǒng)相關(guān)的片段
- ?? 增強(qiáng):構(gòu)造 prompt 輸入
- ?? 生成:大模型總結(jié)出 3 個(gè)主要挑戰(zhàn),如冷啟動(dòng)問題、圖結(jié)構(gòu)稀疏性、計(jì)算效率瓶頸
微軟的graphrag有什么不同呢,常用說法是它用圖數(shù)據(jù)庫存儲(chǔ)了數(shù)據(jù),能跨越多個(gè)節(jié)點(diǎn)回答問題。我認(rèn)為這種說法不足以描述graphrag的本質(zhì),也經(jīng)常將對(duì)graphrag的理解帶入誤區(qū)。相比于傳統(tǒng)的rag,graphrag在使用方面和傳統(tǒng)rag并無不同,但是在自身技術(shù)構(gòu)造上,與傳統(tǒng)的RAG系統(tǒng)有二個(gè)不同點(diǎn):
- 數(shù)據(jù)存儲(chǔ)使用圖數(shù)據(jù)庫,用節(jié)點(diǎn)和關(guān)系描述真實(shí)世界關(guān)系
- 構(gòu)造圖數(shù)據(jù)和檢索數(shù)據(jù)均有LLM參與構(gòu)造和增強(qiáng)
第一點(diǎn)讓rag系統(tǒng)能反映真實(shí)世界的關(guān)系,第二點(diǎn)是graphrag與傳統(tǒng)rag的本質(zhì)不同,某種程度上,可以理解成這是一個(gè)rag智能體。
2. microsoft graphrag
2024年4月,微軟發(fā)布了論文《From Local to Global: A GraphRAG Approach to
Query-Focused Summarization》,并在今年開源了graphrag。
2.1 graphrag建立索引
graphrag的部件圖如下,有4個(gè)部件,其中我們最關(guān)注的是索引

索引的結(jié)構(gòu)如下:

其中工作流如下:
| 步驟名稱 | 目的 | 輸出工件 |
|---|---|---|
| create_base_text_units | 將文檔分塊到文本單元中 | 基本文本單位 |
| create_final_documents | 完成文檔元數(shù)據(jù) | documents.parquet |
| extract_graph | 基于 LLM 的實(shí)體/關(guān)系提取 | 原始實(shí)體和關(guān)系 |
| finalize_graph | 清理和刪除重復(fù)的圖形數(shù)據(jù) | entities.parquet, relationships.parquet |
| extract_covariates | 提取聲明(可選) | covariates.parquet |
| create_communities | 使用 Leiden 進(jìn)行社區(qū)檢測 | communities.parquet |
| create_final_text_units | 使用圖形數(shù)據(jù)增強(qiáng)文本單元 | text_units.parquet |
| create_community_reports | 生成社區(qū)摘要 | community_reports.parquet |
| generate_text_embeddings | 創(chuàng)建向量嵌入 | 嵌入 parquet 文件 |
從工作流我們可以看到,它將文檔切成文本塊,利用大模型抽取實(shí)體和關(guān)系,建立圖,并對(duì)圖使用算法分為社區(qū),對(duì)社區(qū)用大模型生成摘要,并創(chuàng)建向量加速檢索。
這里就是graphrag和傳統(tǒng)rag不同的地方,傳統(tǒng)rag就是存儲(chǔ)成key和answer,使用向量檢索,而graphrag將數(shù)據(jù)使用大模型構(gòu)建為圖,并分為社區(qū)生成摘要,回答復(fù)雜性問題。
2.2 graphrag檢索
graphrag有四種檢索,這里我們以local檢索為例,其流程如下:

可以看到local檢索就是先聚合查詢上下文,再使用大模型結(jié)構(gòu)化生成格式。
其中形成上下文的流程實(shí)際就是圖檢索過程,首先用向量匹配實(shí)體,在用圖檢索實(shí)體相關(guān)的關(guān)系實(shí)體聚合成上下文。上下文構(gòu)造過程如下:

3. graphrag的使用
參考官網(wǎng),非常簡便:
- 建立工程:graphrag init --root /xxx/
- 建立索引:graphrag index --root /xxx/
-- 查詢:graphrag query --method local --root /xxx/
幾條命令就搞定了建立索引到查詢。
另外它是高度可配置的,搞懂怎么配置大模型、輸入配置、流程配置,參考graphrag setting.yaml配置官網(wǎng)說明
4. graphrag的問題
從上面整個(gè)graphrag的流程我們可以看到,它與傳統(tǒng)的rag天然不同,圖存儲(chǔ)是修改了存儲(chǔ)結(jié)構(gòu),更貼合世界本質(zhì),但是rag+AI才是是它與傳統(tǒng)rag的本質(zhì)不同。
rag+AI既是graphrag的優(yōu)點(diǎn)也是致命缺點(diǎn),當(dāng)面對(duì)一個(gè)比較大的輸入的時(shí)候,與大模型的交互是非常頻繁的,等待時(shí)間非常長,使用的token是巨量的,如果使用付費(fèi)大模型,是非常燒錢的。要將graphrag工程化要走到路還很長,這可能也是微軟為何要把graphrag開源的原因。