GraphRAG查詢(Query)流程實現原理分析

文章目錄

  • 說明
  • 一 GraphRAG查詢(Query)流程
  • 二 Local Search 實現原理
  • 三 Global Search 實現原理
  • 四 GraphRAG Python API使用

說明

  • 本文學自賦范社區公開課,僅供學習和交流使用!
  • 本文重在介紹GraphRAG查詢流程,有關索引構建的詳細內容參看GraphRAG快速入門和原理理解

一 GraphRAG查詢(Query)流程

  • 完成Microsoft GraphRAG的索引構建后,Microsoft GraphRAG提供一種更為直觀、易用的查詢方式,只需要輸入自然語言查詢,即可獲得結構化的查詢結果。
  • 索引階段利用大語言模型結合提示工程,從非結構化文本(.txt.csvJson)中提取出實體(Entities)與關系(Relationships),構建出了基礎的Knowledge Graph,并且通過建立層次化的community 結構,community 以及community_report 的豐富語義。
  • 相較于傳統基于Cypher的查詢方式可以提供更多靈活性的Query操作,Microsoft GraphRAG 提供localglobal 兩種查詢方式,分別對應local searchglobal search,而后在不斷的迭代更新過程中,除了優化了local searchglobal search 的效果,還新增了DRIFT SearchMulti Index Search 作為擴展優化的可選項,以進一步豐富Query操作的多樣性。
模式核心思路場景舉例
local只查詢與“當前節點”鄰居相關的子圖“圍繞某個主題節點的局部信息”
global全局搜索,忽略當前節點,直接在所有節點里找“在整個圖中檢索最相關的節點”
hybrid先局部查詢,再全局補充“先看局部,再回溯全局補充背景”
contextual根據當前上下文,動態選擇檢索區域“根據問題類型或語境決定局部/全局混合策略”
  • Microsoft GraphRAG
    在這里插入圖片描述
  • Microsoft GraphRAG 在查詢階段構建的流程,相較于構建索引階段會更為直觀。核心的具體步驟包括:
    1. 接收用戶的查詢請求。
    2. 根據查詢所需的詳細程度,選擇合適的社區級別進行分析。
    3. 在選定的社區級別進行信息檢索。
    4. 依據社區摘要生成初步的響應。
    5. 將多個相關社區的初步響應進行整合,形成一個全面的最終答案。

  • Indexing過程中并不是在創建完第一層社區后就停止,而是分層的。當創建第一層社區(即基礎社區)后,會將這些社區視為節點,進一步構建更高層級的社區。這種方法可以實現在知識圖譜中以不同的粒度級別上組織和表示數據。比如第一層社區可以包含具體的實體或數據,而更高層級的社區則可以聚合這些基礎社區,形成更廣泛的概覽。

  • 最核心的Local SearchGlobal Search的實現,是源于不同的粒度級別而構建出來用于處理不同類型問題的Pipeline, 其中:

    • Local Search 是基于實體的檢索。
    • Global Search 則是基于社區的檢索。

二 Local Search 實現原理

  • Local Search 即本地檢索,是基于實體的檢索。本地搜索從相關實體開始,使用知識圖譜來查找最相關的信息。例如,給定查詢中的實體,使用的是連接節點的信息,通過辨識與查詢相關的實體與關系,檢索特定文本片段、摘要和關聯性資料。所以Local Search 本質上是基于實體的推理。特別適合回答“who”、“what”、“when” 類型的問題。
  • Microsoft GraphRAG 源碼中實現的內部原理如下:
    在這里插入圖片描述

graphrag query 命令參數說明

參數名稱類型描述默認值是否必需
--methodTpye可以選擇local、global、drift或basic算法。None
--queryTEXT要執行的查詢,即提出的問題。None
--configPATH要使用的配置文件路徑。None
--dataPATH索引管道輸出目錄(即包含 parquet 文件的目錄)。None
--rootPATH項目根目錄的路徑。.
--community-levelINTEGER從中加載社區報告的 Leiden 社區層級。較高的值表示來自較小社區的報告。2
--dynamic-community-selection使用動態社區選擇的全局搜索。no-dynamic-community-selection
--response-typeTEXT描述響應類型和格式的自由文本,可以是任何內容,例如多個段落、單個段落、單句、3-7點列表、單頁、多頁報告。Multiple Paragraphs
--streaming以流式方式打印響應。no-streaming
--help顯示幫助信息并退出。
  • 其中,在執行查詢時必須指定的參數是--method--query,其他參數為可選參數。其中:
    • --method 參數可以選擇localglobaldriftbasic算法。(接下來我們會依次介紹這幾種算法)
    • --query 參數是要執行的查詢,即提出的問題。

  • 通過命令行快速啟動問答檢索。local 本地搜索命令:
    graphrag query --root ./ --method local --query "蘋果公司都有哪些產品?"

在這里插入圖片描述

  • 整個本地查詢過程使用起來非常簡單,但是大多數情況下基于通用流程的問答檢索,并不能滿足實際業務需求。比如檢索的效果不準確,效率不高,檢索結果不全面等,因此,需要進一步掌握Microsoft GraphRAG 的檢索原理,并根據實際業務需求,進行針對性的優化和調整。

  • Local Search 的完整實現過程:
  1. 依次讀取text_units.parententities.parentrelationships.parent communities.parentcommunity_reports.parent 的索引文件,并將其加載到內存中。
  2. 加載Lancedb 中的詞向量,準備用于后續的相似度計算。
  3. 根據社區的community_level 參數的值,對實體進行第一輪的過濾,過濾的規則是:如果實體的community_level 小于等于community_level 參數的值,則保留該實體,否則丟棄。
  4. 基于輸入的問題,進行實體的匹配,并構建完整的上下文。
    • 處理輸入問題,如果存在對話歷史記錄,則將之前的用戶問題附加到當前查詢。
    • 將輸入的問題轉化為詞向量,然后和lancedb中的實體詞向量進行相似度計算,得到與查詢最相關的實體,這個過程中會采用兩個策略:
      • 過采樣 (Oversampling) 策略,即最終檢索的實體數量是 k * oversample_scaler。
      • 如果提供了exclude_entity_names列表,則過濾掉這些實體。
    • 根據匹配到的實體,讀取該實體所屬的社區報告,這個過程會采用的策略是:
    • 統計每個社區被多少個選中實體引用(一個實體可能屬于多個社區),做基于實體歸屬的社區投票排序
    • 按匹配度和社區自身排名雙重排序
      • 主要排序標準:被實體引用的頻次(匹配度)
      • 次要排序標準:社區自身的重要性排名
    • 在 2,3 的基礎上,提取出文本單元、關系的附件屬性
    • 生成完整的數據表格
  5. 構建本地搜索的系統提示詞,將數據表格填充到系統提示詞中,引導大模型生成最終的回答。其提示詞設置在settings.yaml 文件的local_search 中。

  • 再理解Microsoft GraphRAG 給出的Local Search 原理圖。
    在這里插入圖片描述

三 Global Search 實現原理

  • Microsoft GraphRAG 中的全局搜索算法旨在回答需要了解整個數據集的抽象問題,即借助社區摘要來獲取全局的答案。實現思路是通過map-reduce流程總結知識圖譜中的社群摘要,匯總社區摘要中的見解,嘗試生成文檔中元素的概述,聚合相關資料并生成針對整體數據集的高層次回答。因此全局搜索更側重于為需要更高層次理解的問題提供答案。比如數據中的前5個主題是什么?這類問題。

  • Microsoft GraphRAG 中,Map 階段會使用大模型對多個文檔或信息片段并行處理,從每個片段中提取相關信息,然后Reduce 階段會匯總所有映射操作的結果,生成最終輸出。

  • Global SearchMicrosoft GraphRAG 源碼中的實現原理圖如下:
    在這里插入圖片描述

  • 當使用Global Search 時,需要指定--method global 參數:

    graphrag query --root ./ --method global --query "文本庫的內容可以分為哪幾個主題?"
    
  • Global Search 的實現過程:

    1. 依次讀取entities.parentcommunities.parentcommunity_reports.parent 的索引文件,并將其加載到內存中。
    2. 依次創建 entities.parentcommunities.parentcommunity_reports.parent 的實體對象,并進行格式化處理。
    3. 進入到構建上下文階段。在這個階段,最關鍵的一個核心概念是:靜態與動態全局搜索策略的選擇
      • 靜態策略方法指的是知識圖譜中預定級別的社區中進行搜索來生成答案。然后,大模型合并并總結此抽象級別的所有社區報告。最后,摘要用作 大模型的附加上下文,以生成對用戶問題的響應。此為靜態方法。它存在的問題是既昂貴又低效,因為包含許多對用戶查詢沒有幫助的低級報告。
      • 動態社區選擇算法dynamic_community_selection 利用索引數據集的知識圖譜結構。從知識圖譜的根開始,使用提示工程 + 大模型來評估社區報告在回答用戶問題方面的相關性。如果報告被視為不相關,則將其及其節點(或子社區)從搜索過程中刪除。另一方面,如果報告被視為相關,將遍歷其子節點并重復該操作。最后,只有相關的報告才會傳遞給 map-reduce 操作以生成對用戶的響應。
        在這里插入圖片描述
  • 該算法類實現的核心機制并不是簡單地評估所有社區,而是采用啟發式遍歷,具體體現在:

    1. 選擇性探索: 并不是簡單地評估所有社區,而是根據當前社區的相關性決定是否探索其子社區。只有當一個社區的評分大于或等于閾值時,才會將其子社區添加到下一輪評估中。
    2. 動態隊列構建: queue = communities_to_rate表明下一輪要評估的社區完全取決于當前輪次中哪些社區被認為是相關的。這不是一個固定的或預先確定的遍歷順序。
    3. 剪枝機制: 如果一個社區的評分低于閾值,其所有子社區都會被"剪枝",不會被進一步探索。這是啟發式算法的典型特征。
    4. 自適應性: 算法的路徑會根據不同的查詢而變化,因為相關性評分依賴于具體的查詢內容。
    5. 回退策略: 如果在當前路徑上找不到相關社區,算法會嘗試探索下一個層級的所有社區,這也是一種啟發式決策。
  • 其中,用于評估社區相關性的提示詞是這樣的,其對應的中文提示如下所示:

        Rate_query = "“”——角色你是一個樂于助人的助手,負責決定所提供的信息是否有助于回答給定的問題,即使它只是部分相關。——目標在05的范圍內,請對回答問題所提供的信息的相關性或幫助程度進行評分。——信息{描述}——問題{問題}——目標回復長度和格式——請以以下JSON格式回復,包含兩個條目:-“原因”:評分的原因,請包括你考慮過的信息。-“評級”:相關度從05,其中0是最不相關的,5是最相關的。{{“理由”:str,“等級”:int。}}
    

在這里插入圖片描述

  • 然后,該輸出的結果會作為變量context_data 傳遞給global_search_reduce_system_prompt.txt 中定義的提示,并調用大模型生成最終的 Reduce 響應,同時,Reduce 響應的結果會作為變量context_text 傳遞給global_search_knowledge_system_prompt.txt 中定義的提示,引導大模型生成最終的 Knowledge 響應。
    在這里插入圖片描述

四 GraphRAG Python API使用

  • 構建索引過程
from pathlib import Path
from pprint import pprintimport pandas as pdimport graphrag.api as api
from graphrag.config.load_config import load_config
from graphrag.index.typing.pipeline_run_result import PipelineRunResultPROJECT_DIRECTORY = "./graphrag_test"
graphrag_config = load_config(Path(PROJECT_DIRECTORY))index_result: list[PipelineRunResult] = await api.build_index(config=graphrag_config)# index_result is a list of workflows that make up the indexing pipeline that was run
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}")
  • Query過程
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=1,dynamic_community_selection=False,response_type="Multiple Paragraphs",query="請幫我介紹下亞馬遜公司?",
)print(response)
  • 測試結果
## 亞馬遜公司簡介
亞馬遜(Amazon),在中文中被稱為“亞馬遜”,是一家全球公認的電子商務和云計算領域的領導者。公司成立于1994年,最初是一個在線書店,但隨著時間的推移,亞馬遜已經發展成為一個綜合性的在線市場,提供廣泛的產品和服務 [Data: Reports (0)]### 電子商務與零售
亞馬遜在電子商務領域的成功不僅體現在其廣泛的產品種類和全球市場覆蓋,還通過戰略性收購進一步鞏固了其在零售行業的地位。亞馬遜收購全食超市(Whole Foods)就是一個重要的戰略舉措。這次收購不僅擴大了亞馬遜的市場影響力,還將其電子商務能力與實體零售相結合,為消費者提供無縫的購物體驗 [Data: Reports (0)]### 云計算與技術創新
亞馬遜網絡服務(AWS)是其云計算平臺,是公司利潤的主要驅動因素,也是其商業模式的關鍵組成部分。AWS為全球的企業提供計算能力和存儲服務,顯示了亞馬遜在技術領域的強大實力 [Data: Reports (0)]。
此外,亞馬遜在技術創新方面的投入也體現在其智能助手Alexa的推出。Alexa不僅增強了亞馬遜在技術領域的影響力,還展示了其利用人工智能改善用戶體驗的能力 [Data: Reports (0)]。亞馬遜積極投資于人工智能,以提升用戶體驗,這一戰略重點使其在技術創新的前沿占據一席之地 [Data: Reports (0)]### 領導力與企業文化
杰夫·貝索斯(Jeff Bezos),亞馬遜的創始人,在將公司轉變為全球電子商務巨頭的過程中發揮了關鍵作用。他的領導和遠見在亞馬遜的擴張和創新中起到了重要作用,特別是在AWS的發展和全食超市的收購中 [Data: Reports (0)]### 競爭與合作
亞馬遜與其他科技巨頭如蘋果和谷歌的互動,突顯了科技行業內的競爭與合作動態。這些公司在多個領域展開競爭,同時也在某些項目上進行合作 [Data: Reports (0)]。綜上所述,亞馬遜通過其在電子商務、云計算和技術創新方面的戰略舉措,鞏固了其在全球市場的領導地位。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918829.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918829.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918829.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

服務器的安全檢測和防御技術

1. 服務器安全風險1.1 不必要的訪問(如只提供HTTP服務)若服務器僅需提供 HTTP 服務,卻開放了其他不必要的訪問途徑,會增加風險。通過應用識別、控制,可精準識別應用類型,限制非必要訪問,保障服務…

FileLink:為企業跨網文件傳輸筑牢安全與效率基石

FileLink:為企業跨網文件傳輸筑牢安全與效率基石在企業數據往來日益頻繁的今天,跨網文件傳輸的安全性和高效性是企業順暢運營的關鍵。傳統傳輸方式在安全防護、系統融合及成本控制上的短板愈發明顯,而 FileLink 憑借在這些方面的突出表現&…

java設計模式之開閉原則使用舉例

1. 輸入法皮膚擴展(抽象類實現) 場景:用戶可為輸入法更換不同皮膚(如默認皮膚、CSDN皮膚)。 實現: 抽象層:定義抽象類AbstractSkin,聲明皮膚顯示方法。擴展:新增皮膚只需…

Spark Shuffle機制原理

文章目錄1.什么是Shuffle?2.Shuffle解決什么問題?3.Shuffle Write與Shuffle Read4.Shuffle的計算需求4.1 計算需求表4.2 partitionby4.3 groupByKey4.4 reduceByKey4.5 sortByKey5.Shuffle Write框架設計與實現5.1 Shuffle Write框架實現的功能5.2 Shuffle Write的多種情況5.…

Cursor vs Trae vs VSCode:2025終極IDE橫評,誰才是開發者的效率之選?

前言 2025年的編程世界,AI不再只是輔助,而是編程工作流的核心驅動者。從微軟的VSCode 到新銳 Cursor 與國產黑馬 Trae ,三大 IDE 正在重新定義“人機協作”的邊界。本文從架構設計、AI能力、場景適配等維度,帶你看透工具本質&…

Vue 安裝指定版本依賴包、刪除某個依賴包、依賴管理

如何安裝指定版本的依賴包安裝指定版本:一旦你知道了想要的版本號,比如3.4.0,你可以使用以下命令來安裝這個版本的vue-router:npm install vue-router3.4.0 --save這里的^表示安裝3.4.0的最新小版本更新,但不會超過主版…

psycopg2 如何驗證鏈接是否有效

在 psycopg2 中,驗證數據庫連接是否有效(即連接是否仍然活躍)可以通過以下幾種方法實現:1. 使用 conn.closed 屬性 psycopg2 的連接對象有一個 closed 屬性,可以檢查連接是否已關閉: import psycopg2conn …

數據科學與計算-電商雙11美妝數據分析

一、項目背景:雙 11 美妝數據的價值所在 每年的 “雙 11” 購物節都是電商行業的盛宴,而美妝品類作為消費熱門領域,蘊含著豐富的用戶行為與市場趨勢信息。該項目聚焦雙 11 期間的美妝電商數據,旨在通過數據分析揭示以下核心問題&…

簡單了解MongoDB數據存儲

官方文檔:MongoDB中文手冊|官方文檔中文版 | MongoDB-CN-Manual 什么是MongoDB? MongnDB是一個分布式文件存儲數據庫(或叫文檔數據庫),是一個介于 關系數據庫和非關系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數…

web網站開發,在線%射擊比賽成績管理%系統開發demo,基于html,css,jquery,python,django,model,orm,mysql數據庫

經驗心得 這個也是crud業務單子,第二個聊點其他的,從最早的無分層開發,到三層開發,工廠,各種接口,再到后面多層,代碼無痕aop,各種框架等,都是在方便我們快速打架一個程序…

[QtADS]解析ads.pro

本文來源 : 騰訊元寶subdirs : 子目錄TEMPLATE subdirs的作用????核心功能??:聲明當前項目為“多項目管理”模式。Qt 的構建系統(qmake)會遍歷 SUBDIRS中列出的子目錄,在每個子目錄中尋找 .pro文件并遞歸構建。…

三方相機問題分析六:【沒用相機,詭異的手電筒不可使用】下拉狀態欄,手電筒置灰,無法打開,提提示相機正在使用

【關注我,后續持續新增專題博文,謝謝!!!】 上一篇我們講了: 這一篇我們開始講: 三方相機問題分析六:【沒用相機,詭異的手電筒不可使用】下拉狀態欄,點擊手電筒,手電筒置灰,無法打開,提提示相機正在使用9348353 目錄 一、問題背景 二、:問題分析過程 2.1:基于…

Java Selenium 自動打開瀏覽器保存截圖

// 代碼 public class ScreenshotExample {public static void main(String[] args) {// 1. 設置瀏覽器驅動路徑(根據實際路徑修改)System.setProperty("webdriver.chrome.driver", "D:\\chromedriver-win64\\chromedriver.exe");//…

新商機:為了減少輻射,可以用座機打機房中心再轉手機

某些人痛恨自家附近有基站,說是輻射太大。你不能說人家迷信。一般解決辦法就是拆基站。而我覺得,商機來了。現在座機基本沒人裝了。新商機就是座機。附近沒有基站,又要打電話,怎么辦?裝座機。用座機打電話時&#xff0…

【Java|第十九篇】面向對象九——String類和枚舉類

&#xff08;四&#xff09;面向對象11、String類&#xff08;1&#xff09;概述<1>String是一個類&#xff0c;引用數據類型&#xff0c;用來表示字符串&#xff1b;<2>String是Lang包下的類&#xff0c;使用不需要導包&#xff1b;<3>字符串的值不能變&…

超越相似名稱:Elasticsearch semantic text 如何在簡潔、高效、集成方面超越 OpenSearch semantic 字段

作者&#xff1a;來自 Elastic Mike Pellegrini, Nick Chow 及 Libby Lin 比較 Elasticsearch 語義文本和 OpenSearch 語義字段在簡潔性、可配置性和效率方面的表現。 自己動手體驗向量搜索&#xff0c;使用這個自定進度的 Search AI 實操學習。你現在可以開始免費的云試用&am…

OpenAI發布最新大模型GPT5、本地部署GPT開源模型

OpenAI發布最新大模型GPT5、本地部署GPT開源模型 GPT-5概述 北京時間 2025年8月8日 凌晨1點 OPENAI舉行了1個小時的線上發布會&#xff0c;正式推出了其史上最聰明、最強大的大模型GPT-5。 GPT-5是OpenAI發布的最新一代大型語言模型&#xff0c;它基于Transformer架構&#xff…

容器網絡模式選擇在云服務器多節點部署中的連通性驗證方案

容器網絡模式選擇在云服務器多節點部署中的連通性驗證方案在云計算環境中&#xff0c;容器網絡模式的選擇直接影響著多節點部署的通信效率和安全性。本文將從Docker原生網絡驅動對比入手&#xff0c;深入分析Overlay、Host、Bridge等主流網絡模式在跨主機通信場景下的性能表現&…

電商雙11美妝數據分析

1、數據初步了解2.數據清洗2.1 重復值處理 直接刪除重復值。2.2 缺失值處理通過上面觀察數據發現sale_count,comment_count 存在缺失值,先觀察存在缺失值的行的基本情況存在的缺失值很可能意味著售出的數量為0或者評論的數量為0&#xff0c;所以我們用0來填補缺失值。2.3 數據挖…

Pytest項目_day14(參數化、數據驅動)

parametrize 參數化可以組裝測試數據。在測試前定義好測試數據&#xff0c;并在測試用例中使用 單參數單次循環 我們可以在裝飾器中使用mark.parametrize&#xff0c;來定義參數名和參數值列表 參數名還需要傳給函數參數名需要用字符串來定義&#xff0c;參數值列表需要用可迭代…