GraphRAG—基于知識圖譜的檢索增強技術
- (一)GraphRAG入門介紹
- (二)GraphRAG基本原理回顧
- (三)GraphRAG運行流程
- 3.1 索引(Indexing)過程
- 3.2 查詢(Query)過程
- 3.3 Prompt 調優
- 3.4 GraphRAG計算流程極簡示例
- (四)GraphRAG安裝與Indexing&Query流程實現
- (五)GraphRAG API使用方法
(一)GraphRAG入門介紹
發展歷程
? 2024年2月,由微軟研究院提出GraphRAG基本思路;
? 2024年4月,同樣由微軟研究院發表相關論文《From Local to Global: A Graph RAG Approach to Query-Focused Summarization》,學術角度論證GraphRAG有效性;
? 2024年6月,正式發布GraphRAG項目…
GraphRAG 項目地址:https://github.com/microsoft/graphrag/
檢索增強生成(RAG) 是一種通過結合真實世界的信息來提升大型語言模型(LLM)輸出質量的技術。RAG 技術是大多數基于 LLM 的工具中的一個重要組成部分。大多數 RAG 方法使用 向量相似性 作為檢索技術,我們將其稱為 基線 RAG(Baseline RAG)。
RAG 技術在幫助 LLM 推理私有數據集方面顯示了很大的潛力——例如,LLM 沒有在訓練時接觸過的、企業的專有研究、業務文檔或通信數據。基線 RAG 技術最初是為了解決這個問題而提出的,但我們觀察到,在某些情況下,基線 RAG 的表現并不理想。以下是幾個典型的場景:
- 基線 RAG 很難將信息串聯起來:當一個問題的答案需要通過多個不同的信息片段,并通過它們共享的屬性來連接,進而提供新的綜合見解時,基線 RAG 表現得很差。
- 例如,在回答類似“如何通過現有的數據推斷出新結論”這種問題時,基線 RAG 無法很好地處理這些散布在不同文檔中的相關信息,它可能會遺漏一些關鍵聯系點。
- 基線 RAG 無法有效理解大型數據集或單一大文檔的整體語義概念:當被要求在大量數據或復雜文檔中進行總結、提煉和理解時,基線 RAG 往往表現不佳。
- 例如,如果問題要求對整個文檔或多篇文檔的主題進行總結和理解,基線 RAG 的簡單向量檢索方法可能無法處理文檔間的復雜關系,導致對全局語義的理解不完整。
為了應對這些挑戰,技術社區正在努力開發擴展和增強 RAG 的方法。微軟研究院(Microsoft Research)提出的 GraphRAG 方法,使用 LLM 基于輸入語料庫構建 知識圖譜。這個圖譜與社區總結和圖譜機器學習輸出結合,能夠在查詢時增強提示(prompt)。GraphRAG 在回答以上兩類問題時,展示了 顯著的改進,尤其是在 復雜信息的推理能力 和 智能性 上,超越了基線 RAG 之前應用于私有數據集的其他方法。
(二)GraphRAG基本原理回顧
? GraphRAG 是微軟研究院開發的一種先進的增強檢索生成(RAG)框架,旨在提升語言模型(LLM)在處理復雜數據時的性能。與傳統的 RAG 方法依賴向量相似性檢索不同,GraphRAG 利用 知識圖譜 來顯著增強語言模型的問答能力,特別是在處理私有數據集或大型、復雜數據集時表現尤為出色。
傳統的 Baseline RAG 方法在某些情況下表現不佳,尤其是當查詢需要在不同信息片段之間建立聯系時,或是當需要對大規模數據集進行整體理解時。GraphRAG 通過以下方式克服了這些問題:
- 更好的連接信息點:GraphRAG 能夠處理那些需要從多個數據點合成新見解的任務。
- 更全面的理解能力:GraphRAG 更擅長對大型數據集進行全面理解,能夠更好地處理復雜的抽象問題。
而借助微軟開源的GeaphRAG項目,我們可以快速做到以下事項:
- 基于圖的檢索:傳統的 RAG 方法使用向量相似性進行檢索,而 GraphRAG 引入了知識圖譜來捕捉實體、關系及其他重要元數據,從而更有效地進行推理。
- 層次聚類:GraphRAG 使用 Leiden 技術進行層次聚類,將實體及其關系進行組織,提供更豐富的上下文信息來處理復雜的查詢。
- 多模式查詢:支持多種查詢模式:
- 全局搜索:通過利用社區總結來進行全局性推理。
- 局部搜索:通過擴展相關實體的鄰居和關聯概念來進行具體實體的推理。
- DRIFT 搜索:結合局部搜索和社區信息,提供更準確和相關的答案。
- 圖機器學習:集成了圖機器學習技術,提升查詢響應質量,并提供來自結構化和非結構化數據的深度洞察。
- Prompt 調優:提供調優工具,幫助根據特定數據和需求調整查詢提示,從而提高結果質量。
(三)GraphRAG運行流程
3.1 索引(Indexing)過程
- 文本單元切分:將輸入文本分割成 TextUnits,每個 TextUnit 是一個可分析的單元,用于提取關鍵信息。
- 實體和關系提取:使用 LLM 從 TextUnits 中提取實體、關系和關鍵聲明。
- 圖構建:構建知識圖譜,使用 Leiden 算法進行實體的層次聚類。每個實體用節點表示,節點的大小和顏色分別代表實體的度數和所屬社區。
- 社區總結:從下到上生成每個社區及其成員的總結,幫助全局理解數據集。
3.2 查詢(Query)過程
索引完成后,用戶可以通過不同的搜索模式進行查詢:
- 全局搜索:當我們想了解整個語料庫或數據集的整體概況時,GraphRAG 可以利用 社區總結 來快速推理和獲取信息。這種方式適用于大范圍問題,如某個主題的總體理解。
- 局部搜索:如果問題關注于某個特定的實體,GraphRAG 會向該實體的 鄰居(即相關實體)擴展搜索,以獲得更詳細和精準的答案。
- DRIFT 搜索:這是對局部搜索的增強,除了獲取鄰居和相關概念,還引入了 社區信息 的上下文,從而提供更深入的推理和連接。
3.3 Prompt 調優
為了獲得最佳性能,GraphRAG 強烈建議進行 Prompt 調優,確保模型可以根據你的特定數據和查詢需求進行優化,從而提供更準確和相關的答案。
3.4 GraphRAG計算流程極簡示例
(四)GraphRAG安裝與Indexing&Query流程實現
最新版GraphRAG特性如下:
(1)架構升級與知識圖譜構建優化
- 智能化的知識圖譜構建
GraphRAG 2.0 在數據預處理階段,通過大模型自動抽取文本中的實體及關系,構建出層次化的知識圖譜。相比傳統的簡單文本片段檢索,構建后的圖譜能夠以“社區”(topic-based clusters)的方式對數據進行組織,這樣不僅可以覆蓋全局信息,也能針對局部查詢給出更精準的答案。 - 動態社區選擇機制
新版本引入了動態社區選擇流程。系統會在生成響應之前,對知識圖譜中不同“社區”的相關性進行評估,從而僅保留與當前查詢最匹配的部分。這種機制能有效“丟棄”噪聲數據,提高檢索效率和答案的準確性。
(2)查詢流程與成本優化
- **兩階段查詢流程:**GraphRAG 2.0 將整個流程拆分為“索引階段”和“查詢階段”:
- 在索引階段,系統利用大模型對原始數據進行結構化處理,提取實體及其關系,構建分層知識圖譜;
- 在查詢階段,則先進行初步的相關性測試,再利用經過動態社區篩選的信息來生成上下文豐富、精準的回答。
這種分步處理不僅提高了檢索的廣度和深度,還能根據查詢需求靈活調用大模型。
- Token消耗大幅降低
為了應對大規模數據調用時高昂的成本,GraphRAG 2.0 對 LLM 的調用做了優化。據報道,在某些場景下整體 Token 消耗降低高達 77%,這使得系統在保證高質量回答的同時,也大幅提升了成本效率。 - LazyGraphRAG 模式
新版本還推出了“LazyGraphRAG”模式——一種結合了向量檢索和圖結構檢索優勢的方案。該模式采用迭代深化的方式,只有在必要時才調用資源密集型的大模型進行深度分析,從而實現了與傳統 GraphRAG 相比成本更低但效果相當的目標。
(3)搜索結果質量與應用擴展
- 精準且上下文豐富的答案
利用層次化的知識圖譜和動態社區篩選,GraphRAG 2.0 能夠生成更具有可解釋性和上下文關聯的答案。無論是全局性問題(例如“核心主題是什么?”)還是局部性查詢(如“誰、何時、何地”等),系統都能根據不同場景調整檢索策略,返回最相關的信息。 - 多系統和多場景集成
此外,新版本在設計上也更注重與其它系統的集成能力,例如在數字營銷場景中,通過與 URL 縮短服務、鏈接分析等工具相結合,為用戶提供定制化且綜合的查詢反饋。
# Step 1.使用pip安裝graphrag
pip install graphrag
pip show graphrag# Step 2.創建檢索項目文件夾
mkdir -p ./ragtest/input# Step 3.上傳數據集
目前GraphRAG只支持txt和csv兩種文本格式 https://whakv.xetslk.com/s/pxKHG 中會詳細介紹如何修改源碼,拓展支持文件類型。# Step 4.初始化項目文件
graphrag init --root ./ragtest# Step 5.修改項目配置
打開.env文件,填寫DeepSeek API-KEY或OpenAI API-Key
打開setting.yaml文件,填寫模型名稱和反向代理地址:# 【可選】Step 6.驗證API-KEY和反向代理地址是否可以正常運行
from openai import OpenAI
api_key = 'your-openai-api-key'
# 實例化客戶端
client = OpenAI(api_key=api_key, base_url="反向代理地址")
# 調用 GPT-4o-mini 模型
response = client.chat.completions.create(model="gpt-4o-mini",messages=[{"role": "user", "content": "你好,好久不見!"}]
)
# 輸出生成的響應內容
print(response.choices[0].message.content)
你好!好久不見!你最近怎么樣?有什么新鮮事分享嗎?
然后查看當前API-KEY可以調用的模型:models_list = client.models.list()
models_list.data# Step 7.借助GraphRAG腳本自動執行indexing
graphrag index --root ./ragtest
graphrag query --root ./ragtest --method local --query "請幫我介紹下ID3算法"
(五)GraphRAG API使用方法
## 1.初始化項目
from pathlib import Path
from pprint import pprint
import pandas as pd
import graphrag.api as api
from graphrag.config.load_config import load_config
from graphrag.index.typing.pipeline_run_result import PipelineRunResultmkdir -p ./graphrag/inputgraphrag init --root ./graphrag## 2.借助API進行Indexing過程
PROJECT_DIRECTORY = "./graphrag"
# 生成 GraphRagConfig 對象graphrag_config = load_config(Path(PROJECT_DIRECTORY))"""
索引 API
索引是指攝取原始文本數據并構建知識圖譜的過程。GraphRAG 目前支持純文本(.txt)和 .csv 文件格式。
構建索引
index_result: list[PipelineRunResult] = await api.build_index(config=graphrag_config)
[2025-03-19T13:17:26Z WARN lance::dataset::write::insert] No existing dataset at /root/autodl-
tmp/MCP/graphrag/output/lancedb/default-entity-description.lance, it will be created
[2025-03-19T13:17:28Z WARN lance::dataset::write::insert] No existing dataset at /root/autodl-
tmp/MCP/graphrag/output/lancedb/default-community-full_content.lance, it will be created
[2025-03-19T13:17:30Z WARN lance::dataset::write::insert] No existing dataset at /root/autodl-
tmp/MCP/graphrag/output/lancedb/default-text_unit-text.lance, it will be created
"""
# index_result 是一個包含索引流水線各個工作流的列表,每個工作流代表一次索引構建過程。for workflow_result in index_result:status = f"error\n{workflow_result.errors}" if workflow_result.errors else "success"print(f"Workflow Name: {workflow_result.workflow}\tStatus: {status}")
"""
Workflow Name: create_base_text_units Status: success
Workflow Name: create_final_documents Status: success
Workflow Name: extract_graph Status: success
Workflow Name: finalize_graph Status: success
Workflow Name: create_communities Status: success
Workflow Name: create_final_text_units Status: success
Workflow Name: create_community_reports Status: success
Workflow Name: generate_text_embeddings Status: success
在此循環中,遍歷 index_result 列表,并打印每個工作流的名稱及其執行狀態。如果工作流中存在錯誤,則輸出錯誤信息,否則輸出 "success"。
"""## 2.借助API進行Query過程
# 查詢索引, 在查詢索引之前,必須先將多個索引文件加載到內存中,并傳遞給查詢 API。
entities = pd.read_parquet(f"{PROJECT_DIRECTORY}/output/entities.parquet")
communities = pd.read_parquet(f"{PROJECT_DIRECTORY}/output/communities.parquet")
community_reports = pd.read_parquet(f"{PROJECT_DIRECTORY}/output/community_reports.parquet"
)
# 上述代碼讀取 .parquet 格式的索引數據,包括 實體(entities)、社群(communities) 以及 社群報告(community_reports)。
# 執行全局搜索
query = "請幫我對比下ID3和C4.5決策樹算法優劣勢。并用中文進行回答。"
response, context = await api.global_search(config=graphrag_config,entities=entities,communities=communities,community_reports=community_reports,community_level=2,dynamic_community_selection=False,response_type="Multiple Paragraphs",query=query,
)
# 在這里,我們調用 global_search 方法,使用已加載的索引數據進行查詢。
community_level=2:設定社群層級為 2 級。
dynamic_community_selection=False:禁用動態社群選擇。
response_type="Multiple Paragraphs":設置返回的查詢結果為多段落格式。
query=query:查詢問題為 **"請幫我對比下ID3和C4.5決策樹算法優劣勢。并用中文進行回答。"**。
# 解析查詢結果
print(response)"""
在決策樹算法的發展歷程中,ID3算法和C4.5算法是兩個非常重要的里程碑。它們各自具有獨特的特點和應用場景,以下是對這兩種算法優劣勢的對比分析。### ID3算法ID3算法是決策樹算法的先驅,它使用信息熵作為選擇分裂規則的標準。這種方法的優點在于其簡單性,使得算法在處理較小或者較簡單的數據集時計算效率較高。然而,ID3算法也存在一些明顯的局限性。首先,它無法直接處理連續特征,這在實際應用中是一個較大的限制。其次,ID3沒有機制來防止過擬合,這意味著在處理更復雜的數據集時,其性能可能不如預期 [Data: Reports (10)]。### C4.5算法C4.5算法在ID3的基礎上進行了顯著的改進。首先,它引入了增益率(Gain Ratio)和信息價值(Information Value)來優化數據分割過程,這不僅解決了ID3處理連續變量不足的問題,還通過引入增益率來減少對具有更多類別的屬性的偏見。其次,C4.5通過剪枝過程改善了決策樹的泛化能力,有效減少了過擬合的風險。然而,這些改進也使得C4.5算法的計算復雜度增加,尤其是在處理大規模數據集時 [Data: Reports (2, 11, +more)]。### 總結總的來說,ID3算法以其簡單高效著稱,適合于處理較小或簡單的數據集。而C4.5算法則在ID3的基礎上做了重要改進,不僅能夠處理連續變量,還通過剪枝過程減少了過擬合的風險,使其更適合處理復雜的數據集。然而,這些改進也帶來了更高的計算復雜度。因此,在選擇使用哪種算法時,需要根據實際的數據特性和應用場景做出合理的決策。
response 變量是 GraphRAG 返回的正式查詢結果。
"""print(context)
"""
{'reports': id title occurrence weight \
0 2 Evolution of Decision Tree Algorithms: From ID... 1.000000
1 3 Scikit-Learn Ecosystem: A Comprehensive Machin... 0.916667
2 11 Evolution of Decision Tree Algorithms: From C4... 0.833333
3 0 CART and Its Foundational Impact on Machine Le... 0.833333
4 13 Scikit-Learn Ecosystem 0.750000
5 5 Machine Learning Ecosystem: Scikit-Learn, CART... 0.666667
6 10 Decision Tree Models and Metrics Community 0.666667
7 21 Python Data Science Ecosystem 0.416667
8 9 Friedman and the Evolution of Boosting Algorithms 0.416667
9 15 Scikit-Learn Decision Tree Analysis 0.416667
10 22 Decision Tree Algorithms: CART and CHAID 0.333333
11 8 Statistical Measures and Predictive Modeling C... 0.333333
12 14 Scikit-learn's DecisionTreeClassifier Ecosystem 0.250000
13 4 Decision Tree Parameters and Strategies in skl... 0.250000
14 18 Decision Tree Parameters Community 0.250000
15 19 Decision Tree Model Parameters Community 0.166667
16 16 Decision Tree Model Strategies and Randomness ... 0.166667
17 20 Aurélien Géron and Machine Learning Technologies 0.083333
18 12 GR, IG, and IV in Decision Tree Algorithms 0.083333
19 7 CART and Its Foundational Impact on Machine Le... 0.500000
20 6 Decision Tree Analysis and Income-Credit Ratin... 0.333333
21 1 Logistic Regression and Its Ecosystem in Machi... 0.333333
22 17 ExtraTreeClassifier and Its Parameters in Sklearn 0.083333 content rank
0 # Evolution of Decision Tree Algorithms: From ... 8.5
1 # Scikit-Learn Ecosystem: A Comprehensive Mach... 8.5
2 # Evolution of Decision Tree Algorithms: From ... 8.5
3 # CART and Its Foundational Impact on Machine ... 8.5
4 # Scikit-Learn Ecosystem\n\nThe Scikit-Learn (... 8.5
5 # Machine Learning Ecosystem: Scikit-Learn, CA... 8.5
6 # Decision Tree Models and Metrics Community\n... 7.5
7 # Python Data Science Ecosystem\n\nThe communi... 8.5
8 # Friedman and the Evolution of Boosting Algor... 8.5
9 # Scikit-Learn Decision Tree Analysis\n\nThis ... 7.5
10 # Decision Tree Algorithms: CART and CHAID\n\n... 7.5
11 # Statistical Measures and Predictive Modeling... 7.5
12 # Scikit-learn's DecisionTreeClassifier Ecosys... 8.0
13 # Decision Tree Parameters and Strategies in s... 7.5
14 # Decision Tree Parameters Community\n\nThis c... 7.5
15 # Decision Tree Model Parameters Community\n\n... 7.5
16 # Decision Tree Model Strategies and Randomnes... 7.5
17 # Aurélien Géron and Machine Learning Technolo... 8.5
18 # GR, IG, and IV in Decision Tree Algorithms\n... 7.5
19 # CART and Its Foundational Impact on Machine ... 8.5
20 # Decision Tree Analysis and Income-Credit Rat... 7.5
21 # Logistic Regression and Its Ecosystem in Mac... 7.5
22 # ExtraTreeClassifier and Its Parameters in Sk... 7.5 }
context 變量包含關于查詢過程的詳細元數據,包括:查詢過程中檢索到的數據信息
被用于構建上下文的文本片段
其他元數據
深入分析 context 對象可以獲取更精細的信息,比如LLM 模型最終使用的文本數據來源。
"""
# 3.封裝函數完成GraphRAG Query
async def rag_ML(query: str) -> str:"""輸入機器學習領域相關問題,獲得問題答案。:param query: 機器學習領域的相關問題:return: query問題對應的答案"""PROJECT_DIRECTORY = "/root/autodl-tmp/MCP/mcp-graphrag/graphrag"graphrag_config = load_config(Path(PROJECT_DIRECTORY))# 加載實體entities = pd.read_parquet(f"{PROJECT_DIRECTORY}/output/entities.parquet")# 加載社區communities = pd.read_parquet(f"{PROJECT_DIRECTORY}/output/communities.parquet")# 加載社區報告community_reports = pd.read_parquet(f"{PROJECT_DIRECTORY}/output/community_reports.parquet")# 進行全局搜索response, context = await api.global_search(config=graphrag_config,entities=entities,communities=communities,community_reports=community_reports,community_level=2,dynamic_community_selection=False,response_type="Multiple Paragraphs",query=query,)return response
query = '請幫我對比下ID3和C4.5決策樹算法優劣勢。并用中文進行回答。'
await rag_ML(query)
"""
'### ID3算法與C4.5算法的對比\n\n#### ID3算法概述\n\nID3算法是由Ross Quinlan開發的決策樹算法的早期版本,它主要通過信息增益(Information Gain)作為選擇屬性的標準,專注于處理分類問題。ID3算法的主要優點在于其簡單直觀,易于理解和實現,使其成為決策樹算法中的一個重要基石 [Data: Reports (1, 13)]。然而,ID3算法存在幾個顯著的限制,包括無法直接處理連續屬性和缺失值,以及缺乏有效的過擬合預防措施,這些限制可能會影響算法的泛化能力和應用范圍 [Data: Reports (1, 13)]。\n\n#### C4.5算法改進\n\nC4.5算法是在ID3的基礎上進行改進的,同樣由Ross Quinlan開發。C4.5算法的主要改進包括引入信息增益率(Gain Ratio)來選擇屬性,這一改進解決了ID3算法在屬性選擇時偏向于選擇取值多的屬性的問題。此外,C4.5算法能夠處理連續屬性和缺失值,并引入了剪枝技術來減少過擬合的風險,從而提高了模型的泛化能力 [Data: Reports (1, 13)]。C4.5算法的這些改進使得它更加健壯,適用于更廣泛的數據集。然而,需要注意的是,C4.5算法的計算復雜度較高,尤其是在處理大型數據集時,這可能會成為其應用的一個限制 [Data: Reports (1, 13)]。\n\n#### 總結\n\n總的來說,C4.5算法在功能上對ID3算法進行了顯著的改進,包括處理連續屬性和缺失值的能力,以及引入剪枝策略來避免過擬合問題,這些改進顯著提高了決策樹模型的泛化能力。然而,這些改進也帶來了更高的計算復雜度,特別是在處理大規模數據集時 [Data: Reports (1, 13)]。因此,在選擇使用ID3算法還是C4.5算法時,需要根據具體的應用場景和數據集的特點來權衡算法的優勢和潛在的限制。'
"""