解讀 GraphRAG

RAG 結合了大型語言模型和信息檢索模型的力量,允許它們用從大量文本數據中提取的相關事實和細節來補充生成的響應。事實證明,這種方法在提高模型輸出的實際準確性和總體質量方面是有效的。

然而,隨着 RAG 系統得到更廣泛的採用,它們的侷限性開始浮出水面,具體而言:

也就是說,對非結構化文本數據的依賴意味着這些模型很難捕捉到處理複雜查詢所必需的更深層次的語義關係和上下文細微差別。此外,爲每個查詢檢索和處理大量文本的計算成本構成了重大挑戰。

  1. 什麼是 GraphRAG

GraphRAG 是檢索增強生成領域的一個重要進展。GraphRAG 不使用非結構化的文本,而是利用知識圖譜的力量ーー實體的結構化表示、屬性以及它們之間的關係。通過以這種結構化的格式表達,GraphRAG 可以克服傳統 RAG 方法的侷限性。知識圖譜可以更精確和全面地檢索相關信息,使模型能夠產生不僅事實準確而且與上下文相關並涵蓋查詢所需方面的答覆。

1.1 GraphRAG 中的結構化表達——知識圖譜

讓我們來理解 GraphRAG 如何存儲信息,例如 “2 型糖尿病是一種擁有屬性高血糖的慢性疾病,可能導致神經損傷、腎臟疾病和心血管疾病等併發症。”

以下是 GraphRAG 如何在知識圖譜中表示這些信息:

# 實體

二型糖尿病(病況)

高血糖水平(症狀)

神經損傷(併發症)

腎臟疾病(併發症)

心血管疾病(併發症)

# 關係

2型糖尿病-> 有症狀-> 高血糖水平

2型糖尿病-> 可導致-> 神經損傷

2型糖尿病-> 可導致-> 腎臟疾病

2型糖尿病-> 可導致-> 心血管疾病

在這個知識圖譜中,實體 (節點) 表示句子中提到的關鍵概念,如病況、症狀和併發症。這些關係 (邊) 捕捉了這些實體之間的聯繫,例如,2 型糖尿病有高血糖水平的症狀,並可能導致各種併發症。這種結構化的表示允許 GraphRAG 理解句子中的語義關係和上下文,而不是僅僅將其視爲一個單詞包。當用戶問一個與 2 型糖尿病相關的問題時,比如“2 型糖尿病的併發症是什麼?”,

GraphRAG 可以快速遍歷知識圖,從 “2 型糖尿病” 實體開始,遵循 “可以導致” 關係來檢索相關併發症(神經損傷,腎臟疾病和心血管問題)。

1.2 GraphRAG 的主要特性

GraphRAG 已被證明可以顯著提高生成文本的準確性和相關性,使其成爲一個有價值的解決方案,用於準確、合理的實時答案。它還因其通過跟蹤圖中的關係鏈來處理複雜查詢的能力而受到關注,提供了對回答問題所需信息的更爲豐富的理解。

GraphRAG 的主要特性如下:

GraphRAG 的這些關鍵特性展示了它相對於傳統 RAG 模型的優勢,以及它在各種應用中革新檢索增強生成的潛力。

  1. GraphRAG 的應用場景

GraphRAG 的應用場景非常廣泛。下面簡要介紹 GraphRAG 的兩個用例,以及它們是如何在每個用例中使用的。

2.1 醫療領域

GraphRAG 可以幫助醫學專業人員從大量的醫學文獻中快速找到相關信息,以回答關於患者症狀、治療和結果的複雜問題。通過將醫學知識表示爲一個結構化的知識圖譜,GraphRAG 使得多跳推理能夠連接不同的信息並提供全面的答案。這可以導致更快和更準確的診斷,更知情的治療決定,並改善患者的結果。

2.2 銀行金融業:

GraphRAG 可以通過在知識圖譜中表示客戶交易、賬戶信息和行爲模式來幫助銀行檢測和防止欺詐。通過分析圖譜中的關係和異常,GraphRAG 可以識別可疑活動,並向銀行的欺詐檢測系統發出警報。這可以導致更快、更準確的欺詐檢測,減少財務損失,提高客戶對銀行安全措施的信任。

3.GraphRAG 的工作原理

GraphRAG 首先從輸入文檔中提取實體和關係,生成知識圖譜,然後通過圖算法檢測社區結構。接下來,使用 LLM 爲每個社區生成自然語言摘要,保留分層結構。在用戶查詢時,系統先進行局部檢索匹配高級主題,再進行全局檢索獲取詳細信息,最後由 LLM 生成準確相關的響應。GraphRAG 的局部搜索針對特定上下文提供針對性信息,而全局搜索則利用預先計算的社區摘要,回答跨多個文檔的綜合查詢。

3.1 知識圖譜構建

3.2 知識圖譜的信息摘要

3.3 檢索增強生成

其中,GraphRAG 中的局部搜索是指從特定實體或文本塊的局部上下文中檢索和使用信息。這涉及到使用知識圖譜結構來查找直接連接到當前查詢或上下文的相關實體、關係和文本單元。局部搜索允許系統檢索有針對性的相關信息,以增強語言模型對特定的本地化查詢的響應。

GraphRAG 中的全局搜索是指利用知識圖的更廣泛的層次結構對整個數據集進行推理。這涉及到使用檢測到的 “社區” 或圖中相關實體和文本單元的集羣來生成完整數據集中關鍵主題和主題的摘要和概述。全局搜索使系統能夠回答需要跨多個文檔或實體聚合信息的查詢,例如“文檔中最重要的 5 個主題是什麼?” 通過利用預先計算的社區摘要,全局搜索可以提供全面的響應,而無需爲每個查詢從頭開始搜索整個數據集。

  1. GraphRAG 的侷限

構建全面而精確的知識圖譜不是一個簡單的過程,其質量和覆蓋率嚴重依賴於輸入數據源,隨着知識圖譜的增長,計算資源的需求也會增加,對實時應用構成挑戰。

5.GraphRAG 的實現示例

有很多種方法可以實現 GraphRAG,例如, 採用微軟開源的 GraphRAG 解決方案。爲了簡化問題, 這裏給出了兩種參考實現的示例。

5.1 基於 LLMGraphTransformer 的 GraphRAG 實現

首先需要 pip 安裝一些必要的庫:

pip install --upgrade --quiet  json-repair networkx langchain-core langchain-google-vertexai langchain-experimental langchain-community

#versions used
langchain==0.2.8
langchain-community==0.2.7
langchain-core==0.2.19
langchain-experimental==0.0.62
langchain-google-vertexai==1.0.3

當然,可以自己選擇不同的大模型來替換 google 的 verexai。

然後,導入所需的函數,初始化 LLM 對象和引用文本。使用任何 SOTA LLM 獲得最佳結果,因爲創建知識圖譜是一項複雜的任務。

import os
from langchain_experimental.graph_transformers import LLMGraphTransformer
from langchain_google_vertexai import VertexAI 
import networkx as nx
from langchain.chains import GraphQAChain
from langchain_core.documents import Document
from langchain_community.graphs.networkx_graph import NetworkxEntityGraph

llm = VertexAI(max_output_tokens=4000,model_name='text-bison-32k')

text = """
your content in details.
"""

接下來,我們需要將該文本作爲 GraphDocument 加載,並創建 LLMTransformer 對象。

documents = [Document(page_content=text)]
llm_transformer = LLMGraphTransformer(llm=llm)
graph_documents = llm_transformer.convert_to_graph_documents(documents)

創建知識圖譜的時候,最好提供一個要提取的實體和關係列表,否則 LLM 可能會將所有內容標識爲實體或關係。
llm_transformer_filtered = LLMGraphTransformer( llm=llm, allowed_nodes=["Person", "Country", "Organization"], allowed_relationships=["NATIONALITY", "LOCATED_IN", "WORKED_AT", "SPOUSE"], ) graph_documents_filtered = llm_transformer_filtered.convert_to_graph_documents( documents )

我們可以使用 Networkx Graph 工具包將上面標識的節點和邊進行可視化,當然生產環境中一般會存入圖數據庫。

graph = NetworkxEntityGraph()

# 增加節點
for node in graph_documents_filtered[0].nodes:
    graph.add_node(node.id)

# 增加邊
for edge in graph_documents_filtered[0].relationships:
    graph._graph.add_edge(
            edge.source.id,
            edge.target.id,
            relation=edge.type,
        )

現在,我們可以創建一個 GraphQAChain,它將幫助我們與知識庫進行交互。

chain = GraphQAChain.from_llm(
    llm=llm, 
    graph=graph, 
    verbose=True
)

最後,就可以使用 Query 調用 chain 的對象了。
question = """my question xxxx""" chain.run(question)

5.2 基於 GraphIndexCreator 的 GraphRAG 實現

在 LangChain 使用 GraphIndexCreator,它與上述方法非常相似。

from langchain.indexes import GraphIndexCreator
from langchain.chains import GraphQAChain

index_creator = GraphIndexCreator(llm=llm)

with open("/home/abel/sample.txt") as f:
    all_text = f.read()
    
text = "\n".join(all_text.split("\n\n"))
graph = index_creator.from_text(text)

chain = GraphQAChain.from_llm(llm, graph=graph, verbose=True)
chain.run("my question xxxx ?")

兩種方法都很容易實現。這些示例使用非常小的數據集。如果您使用大型數據集,知識圖譜的創建可能會導致大量 token 成本。

5.3 知識圖譜作爲檢索工具

特殊地,使用知識圖譜作爲 RAG 的檢索部分有三種方法:

總之,有很多方法可以將矢量數據庫和知識圖譜結合起來用於搜索、相似性和 RAG。

  1. 小結

GraphRAG 代表了檢索增強生成領域的一項重要進步。通過利用知識圖譜的力量,GraphRAG 克服了傳統 RAG 模型的侷限性,爲複雜查詢提供更準確、相關和全面的響應。

在 GraphRAG 中,結構化的知識表示使系統能夠理解不同信息片段之間的語義上下文和關係,從而輕鬆處理複雜的多主題查詢。此外,GraphRAG 的高效處理能力使其成爲實際應用程序中的實用解決方案,特別是在速度和準確性至關重要的場景中。

GraphRAG 已在各個領域被證明是有效的,包括醫療保健和銀行業,能夠提供有價值的見解並支持決策過程。其不斷學習和擴展知識的能力,使其成爲一個多功能工具,能夠適應新的信息和不斷變化的領域。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/oWL29fGunu5yF22Yd21sHQ