一、GraphRAG介紹
1.1 什么是 Graph RAG?
?Graph RAG(Retrieval-Augmented Generation),是一種基于知識圖譜的檢索增強技術, 通過構建圖模型的知識表達,將實體和關系之間的聯系用圖的形式進行展示,然后利用大語言模型 LLM進行檢索增強。
?GraphRAG是微軟研究院開發的一種創新型檢索增強生成(RAG)方法,基于MIT開源協議,旨在提高大語言模型LLM在處理復雜信息和私有數據集時的推理能力
1.2 GraphRAG誕生背景
?傳統RAG是將一篇文章打碎拆分為幾個小的章節(chunks),然后embedding后存入向量庫,在查詢階段,RAG將用戶指令挨個在向量庫與這些chunks的embedding向量進行相似度匹配,然后輸出最匹配的k個作為prompt的上下文(context),無論是在文檔預處理進向量庫階段,還是用戶查詢階段,都沒加考慮各個chunk之間的關聯,這就形成了普通RAG技術的先天設計缺陷。
傳統rag:
解決外部知識的詳情介紹,某些細節的檢索。
比如: 比如孔乙己是哪里人?
graphRAG:
跨多個段落,甚至多個文章。
文章中的主要主題是什么?
?GraphRAG提出了一種回答總結類問題的算法思路,下面展示了GraphRAG算法的工作流程,包括索引建立階段(index time)和查詢階段(query time)。
1.3 graphrag的基本概念
- Document(文檔)- 系統中的輸入文檔。這些文檔要么代表CSV 中的單獨行,要么代表單獨的 .txt文件。
- TextUnit(文本塊)- 要分析的文本塊。這些塊的大小、重疊以及它們是否遵守任何數據邊界可以在下面配置。一個常見的用例是設置CHUNK_BY_COLUMNS為id,以便文檔和 TextUnits 之間存在一對多關系,而不是多對多關系。
- Entity(實體)- 從 TextUnit 中提取的實體。這些實體代表人物、地點、事件或您提供的其他實體模型。
- Relationship(關系)- 兩個實體之間的關系。這些關系由協變量生成。
- Covariate(協變量)- 提取的聲明信息,其中包含可能受時間限制的實體的陳述.
- Claim(聲明)- 代表具有評估狀態和時間限制的積極事實陳述,以協變量(Covariates)的稱呼在各處使用。
- Community Report(社區報告)- 一旦生成實體,我們就對它們執行分層社區檢測,并為該層次結構中的每個社區生成報告。
- Node(節點)- 包含已嵌入和聚集的實體和文檔的呈現圖形視圖的布局信息。
1.3.1 索引建立(index time)
?索引建立階段,屬于數據預處理階段,主要目的是從提供的文檔集合中,提取出知識圖譜(Knowledge Graph),然后以聚類算法(Leiden),將知識圖譜分為數個社區(community),并總結每個社區(community)所表達的含義(community summary)。
graphRAG索引階段流程圖:
1.3.2 Querying過程
?從上面的介紹,我們了解到在構建索引的過程中,GraphRAG會生成實體關系圖、社區層級結構,以及它們的sumamry、source chunk等各種維度的信息,以向量和結構化的方式進行存儲。下面我們介紹在檢索時如何使用這些信息來做信息增強。Query分兩種類型,分別為Local Search和Global Search。
1.3.2.1 Local Search
?local Search是一種基于Entity的回答模式。它結合知識圖譜中的結構化數據和輸入文檔中的非結構化數據,在查詢時通過相關實體信息擴展 LLM 上下文。該方法非常適合回答需要理解輸入文檔中提到的具體實體的問題(例如,“孔乙己和掌柜的之間的關系?”)。
其流程圖如下所示:
?給定用戶查詢(或加上對話歷史記錄),Local Search會從知識圖譜中識別出一組與用戶輸入在語義上相關的實體。這些實體作為進入知識圖譜的入口點,能夠提取進一步相關的細節,如相連實體、關系、實體協變量(與實體相關的變量)和社區報告。此外,它還從原始輸入文檔中提取與已識別實體相關的相關文本chunk。然后對這些候選數據源進行優先級排序和過濾,以適應預定義大小的單個上下文窗口,該窗口用于生成對用戶查詢的響應。
1.3.2.2 Global Search
?Global Search是基于整個數據集的推理。常規RAG在處理需要跨數據集聚合信息后進行組合回答的場景時很難有很好的表現。例如,“本文的主題是什么?”這種問題查詢效果會很差,因為常規RAG的處理方式是:依賴于數據集中存在語意相似的文本內容的向量檢索。如果知識庫中沒有文本內容包含這個問題的答案,則無法給出高質量的回答。
?然而,使用 GraphRAG 可以回答此類問題,因為 LLM 生成的知識圖譜的結構可以告訴我們整個數據集的結構(以及主題)。這使得私有數據集能夠組織成有意義的語義clusters,并且這些clusters已被預先總結。通過使用我們的全局搜索方法,LLM 在響應用戶查詢時可以使用這些cluster來總結這些主題,并回答用戶對整個數據集的問題。
其流程圖如下所示:
?給定用戶查詢(或加上對話歷史記錄),Global Search使用從圖的社區層次結構中指定級別生成的一系列 LLM 社區報告作為上下文數據,以 map-reduce 方式生成響應。在 map 步驟中,社區報告被分割成預定義大小的文本chunks。每個文本chunk然后用于生成一個中間響應,其中包含一個要點列表,每個要點都附有一個表示該要點重要性的數值評級。在 reduce 步驟中,從中間響應中篩選出最重要的要點進行匯總,并將其用作上下文生成最終響應。
?全局搜索響應的質量會受到用于社區報告來源的社區層次結構級別的顯著影響。較低的層次級別報告更為詳細,通常會產生更為全面的響應,但由于報告數量的增加,這也可能增加生成最終響應所需的時間和 LLM 資源。
1.4 Graph RAG 思想一句話總結
Graph RAG 思想: 對用戶輸入的query提取實體,然后構造子圖形成上下文,最后送入大模型完成生成
二、知識圖譜介紹
知識圖譜(Knowledge Graph)是一種以結構化形式描述現實世界實體及其關系的技術,通過將數據組織為“節點-邊-節點”的三元組(如“北京-是-中國首都”),構建出語義關聯的網絡。
核心組成??:
- 實體(Entities)?:表示具體或抽象的事物,如“李白”“北京”。?
- 關系(Relationships)?:連接實體的邊,定義交互方式,如“出生于”“首都”。?
- 屬性(Attributes)?:描述實體的特征,如“李白-字太白”“北京-人口2170萬”。?
- 本體(Ontology)?:領域內的概念體系與關系約束,如“城市-國家”間的“首都”關系。?
示例?:在醫療領域,知識圖譜可鏈接“糖尿病”“胰島素”“高血糖”等實體,通過“治療方法”“癥狀”等關系輔助診斷。
應用場景??:
- 推薦系統?:基于用戶興趣關聯商品(如喜歡科幻電影的用戶推薦《三體》)。?
- 智能問答?:解析復雜問題(如“哪些法國導演獲得過奧斯卡獎?”)。?
- 金融風控?:通過企業關聯網絡識別欺詐風險。?
- 醫療健康?:輔助診斷(如根據癥狀推薦可能的疾病及用藥)。
三、圖數據庫與neo4j
3.1 市面上圖數據庫介紹
3.1.1 排名:
https://db-engines.com/en/ranking/graph+dbms
3.1.2 主流圖數據庫
3.2 neo4j
neo4j學習地址:
https://www.w3cschool.cn/neo4j/neo4j_need_for_graph_databses.html
3.2.1 docker安裝neo4j社區版
docker run -d -p 7474:7474 -p 7687:7687 --name neo4j -v /home/neo4j/data:/data -v /home/neo4j/logs:/logs -v /home/neo4j/conf:/var/lib/neo4j/conf -v /home/neo4j/import:/var/lib/neo4j/import neo4j:5.5.0-community
訪問地址:http://localhost:7474/
默認賬號密碼:
neo4j || neo4j
3.2.1 cql實例
簡介:
3.2.2 操作實例
增加一個節點:
create (n:Person {name:"孔乙己",age:31})
帶有關系屬性:
create (p:Person{name:"孔乙己",age:31})-[: 偷書 { 金額 :3000}]->(n:Person{name:"丁舉人",age:35})
刪除節點:
create (n:Person {name:"掌柜",age:33});match (n:Person{name:"掌柜"}) delete n;-- 根據id刪除match (n:Person) where id(n)=3 delete n
刪除關系:
MATCH (p:Person {name: "孔乙己", age: 31})-[f:`偷書`]->(n:Person {name: "丁舉人", age: 35}) DELETE f
修改:
加上標簽:
match (t:Person) where id(t)=0 set t:衣服 return t;
加上屬性:
match (a:衣服) where id(t)=0 set a.衣服="長衫" return a
修改屬性:
match (a:衣服) where id(a)=0 set a.衣服="破爛的長衫" return a
查:
match (p:Person) - [:偷書] -> (n:Person) return p,n
效果:
3.2.3 紅樓夢示例
紅樓夢知識圖譜示例:
https://grapheco.org/
賈寶玉知識圖譜
薛蟠知識圖譜
四、GraphRAG
git地址:
https://github.com/microsoft/graphrag
前置操作:
ollama pull qwen2.5:7b
ollama pull quentinz/bge-large-zh-v1.5
4.1 安裝graphRAG
4.1.1 安裝 GraphRAG
pip install graphrag
需要 Python 3.10-3.12 環境
4.1.2 創建知識數據文件夾
安裝完整后,需要創建一個文件夾,用來存儲你的知識數據,目前 GraphRAG 只支持 txt 和 csv 格式。
mkdir -p ./ragtest/input
4.1.3 準備一份數據放在 /ragtest/input 目錄下
4.1.4 初始化工作區
首先,我們需要運行以下命令來初始化:
python -m graphrag.index --init --root ./ragtest
運行完成后,在 ragtest 目錄下生成以下兩個文件:settings.yaml。ragtest 目錄下的結構如下:
- settings.yaml:GraphRAG 的核心配置文件,允許用戶自定義模型、嵌入模型、存儲設置和管道參數,通過 YAML 格式提供靈活的配置選項;
4.2 修改配置文件支持本地部署大模型
首先確保已安裝 Ollama。
安裝qwen2.5 7b和bge-large-zh-v1.5;
4.2.1 修改.setting.yaml
右邊為修改后的內容:
注意這里:默認的chunks.size是1200。 較大的塊會導致輸出保真度較低,參考文本意義較小;使用較大的塊可以大大縮短處理時間。
4.2.2 運行 GraphRAG 構建知識圖譜索引
python -m graphrag.index --root ./ragtest
構建知識圖譜的索引需要一定的時間,構建過程如下所示:
成功:
4.3 修改源碼支持本地部署大模型
接下來修改源碼,保證進行 local 和 global 查詢時給出正確的結果。
4.3.1 修改成本地的 Embedding 模型
修改源代碼的目錄和文件:
/root/miniconda3/lib/python3.10/site-packages/graphrag/llm/openai/openai_embeddings_llm.py
改動如下:
4.3.2 修改 Embedding 模型
修改源代碼的目錄和文件:
/root/miniconda3/lib/python3.10/site-packages/graphrag/query/llm/oai/embedding.py
修改如下:
4.4 GraphRAG 效果測試
4.4.1 local 查詢
執行命令:
python -m graphrag.query --root ./ragtest --method local "孔乙己和掌柜的關系是什么?"
4.4.2 global 查詢
執行命令:
python -m graphrag.query --root ./ragtest --method global "本文主題是什么?"
4.4.3 提示微調 prompt tuning
參加【提示微調 prompt tuning.txt】
五、GraphRAG詳情
?GraphRAG 采用了知識圖譜的理念,在底層實現中同時使用了圖數據庫和向量數據庫。圖數據庫存儲有關實體和實體間關系的數據,而向量數據庫則存儲與文本單元相對應的嵌入向量空間。
本地搜索(Local Search):基于實體的推理
本地搜索方法將知識圖譜中的結構化數據與輸入文檔中的非結構化數據結合起來,在查詢時用相關實體信息增強 LLM 上下文這種方法非常適合回答需要了解輸入文檔中提到的特定實體的問題(例如,"洋甘菊有哪些治療功效?)
全局搜索(Global Search): 基于全數據集推理
根據LLM生成的知識圖譜結構能知道整個數據集的結構(以及主題)這樣就可以將私有數據集組織成有意義的語義集群,并預先加以總結。LLM在響應用戶查詢時會使用這些聚類來總結這些主題;
五、將graphRAG生成的文件導入到neo4j查看
具體實現【參見demo】。
查看graphrag索引后,各個實體之間的關系:
六、GraphRAG的適用場景
6.1 總結對比:GraphRAG vs 傳統 RAG
?場景類型? | ?傳統 RAG 的局限性? | ?GraphRAG 的優勢? |
---|---|---|
?跨文檔分析? | 信息碎片化,難以關聯全局語義 | 通過知識圖譜實現全局語義關聯 |
?實時數據處理? | 全量索引重建成本高 | 支持增量更新,降低維護開銷 |
?多模態整合? | 依賴單一文本模態,異構數據處理難 | 統一圖結構融合文本/表格/圖譜數據 |
?復雜推理任務? | 單跳檢索,難以支持多步邏輯推理 | 基于圖的多跳推理能力 |