GraphRAG 知識圖譜增強檢索實作:用 Neo4j 與 LangChain 打造多跳推理 RAG 系統
如果你跟我一樣,已經把 RAG(Retrieval-Augmented Generation)玩了一陣子,大概會發現一個問題:傳統向量搜尋在處理「需要跨多個文件推理」的複雜問題時,效果其實很有限。比方說你問「哪些作者曾經在同一間公司工作過,而且都研究過 Transformer 架構?」,純粹的語義搜尋根本回答不了這種需要關聯推理的問題。
這就是 GraphRAG 出現的原因——結合知識圖譜(Knowledge Graph)與 RAG 的檢索策略,讓 LLM 不只能搜文字,還能沿著實體之間的關係進行多跳推理(multi-hop reasoning)。今天我就來分享怎麼用 Neo4j 和 LangChain 從零打造一套 GraphRAG 系統。
什麼是 GraphRAG?跟傳統 RAG 有什麼不同
傳統 RAG 的流程大家都很熟悉了:把文件切 chunk → 轉成 embedding → 存到向量資料庫 → 使用者提問時做語義搜尋 → 把相關 chunk 丟給 LLM 生成回答。這套流程對「單一事實查詢」很有效,但遇到需要跨文件、跨實體的推理問題就會卡關。
GraphRAG 在這個基礎上加了一層知識圖譜。它會:
- 從文件中抽取實體(Entity)和關係(Relationship)
- 建立一個圖結構,用節點表示實體、邊表示關係
- 檢索時不只做向量搜尋,還能沿著圖的邊做多跳遍歷
- 把「圖上下文」跟「文字上下文」一起交給 LLM
如果你之前有研究過Agentic RAG 多代理架構,GraphRAG 可以想成是另一個維度的增強——Agentic RAG 讓 AI 能自主決定搜尋策略,GraphRAG 則讓 AI 能理解實體間的結構化關係。
技術架構:Neo4j + LangChain 的 GraphRAG Pipeline
我們要建立的系統架構如下:
- 文件擷取:讀取原始文件(PDF、HTML 等)
- 實體關係抽取:用 LLM 從文本中抽取三元組(subject, predicate, object)
- 知識圖譜建構:把三元組存入 Neo4j 圖資料庫
- 混合檢索:同時做向量搜尋 + 圖遍歷
- 上下文組裝 + 生成:合併兩種檢索結果,交給 LLM
Step 1:環境準備與 Neo4j 設定
首先安裝必要的套件:
pip install langchain langchain-openai langchain-community neo4j python-dotenv你需要一個 Neo4j 實例。最簡單的方式是用 Neo4j Aura 免費方案,或者用 Docker 在本地跑:
docker run -d --name neo4j \n -p 7474:7474 -p 7687:7687 \n -e NEO4J_AUTH=neo4j/your_password \n neo4j:5.15Step 2:用 LLM 抽取實體與關係
這是 GraphRAG 最關鍵的一步。我們用 LangChain 的 LLMGraphTransformer 來把非結構化文本轉成圖結構:
from langchain_experimental.graph_transformers import LLMGraphTransformer
from langchain_openai import ChatOpenAI
from langchain_core.documents import Document
llm = ChatOpenAI(model="gpt-4o", temperature=0)
transformer = LLMGraphTransformer(llm=llm)
documents = [
Document(page_content="張三是 ABC 公司的資深工程師,"
"他在 2023 年發表了一篇關於 Transformer 優化的論文。"
"李四也在 ABC 公司工作,主要研究 RAG 系統。")
]
graph_documents = transformer.convert_to_graph_documents(documents)
print(graph_documents[0].nodes) # 實體節點
print(graph_documents[0].relationships) # 關係邊這段程式碼會自動辨識出「張三」「李四」「ABC 公司」「Transformer」等實體,以及它們之間的「任職於」「研究」等關係。說實話第一次看到輸出的時候我還蠻驚喜的,LLM 對中文實體的辨識準確度比我預期的好很多。
Step 3:存入 Neo4j 知識圖譜
把抽取出來的圖結構存入 Neo4j:
from langchain_community.graphs import Neo4jGraph
graph = Neo4jGraph(
url="bolt://localhost:7687",
username="neo4j",
password="your_password"
)
graph.add_graph_documents(graph_documents, include_source=True)
graph.refresh_schema()
print(graph.schema) # 查看當前圖的 schemaStep 4:建立混合檢索器
GraphRAG 的威力在於混合檢索——同時利用向量搜尋的語義理解能力和圖遍歷的結構推理能力:
from langchain.chains import GraphCypherQAChain
chain = GraphCypherQAChain.from_llm(
llm=llm,
graph=graph,
verbose=True,
allow_dangerous_requests=True
)
result = chain.invoke({
"query": "哪些人在同一間公司工作?他們各自研究什麼領域?"
})
print(result["result"])LLM 會自動生成 Cypher 查詢語句(Neo4j 的查詢語言),從圖中找到相關的實體和路徑。這種多跳推理是純向量搜尋做不到的。
Step 5:進階 — 混合向量 + 圖檢索
實務上我建議用「向量搜尋 + 圖遍歷」雙管齊下的策略:
from langchain_community.vectorstores import Neo4jVector
from langchain_openai import OpenAIEmbeddings
vector_index = Neo4jVector.from_existing_graph(
OpenAIEmbeddings(),
search_type="hybrid",
node_label="Document",
text_node_properties=["text"],
embedding_node_property="embedding"
)
# 先用向量找到相關節點
vector_results = vector_index.similarity_search("Transformer 優化", k=3)
# 再從這些節點出發做圖遍歷
for doc in vector_results:
neighbors = graph.query(
"MATCH (n)-[r]-(m) WHERE n.id = $id RETURN n, r, m",
{"id": doc.metadata.get("id")}
)
print(neighbors)這個策略我在之前研究Multimodal RAG 多模態檢索的時候就發現了——不同的檢索策略各有擅長,組合起來效果最好。
實務踩坑與效能優化
實體解析(Entity Resolution)很重要
LLM 抽取的實體常常會有重複問題,比如「台積電」跟「TSMC」其實是同一個實體。你需要做 entity resolution:
# 用 LLM 做實體消歧
graph.query("""
MATCH (n1:Entity), (n2:Entity)
WHERE n1.name CONTAINS '台積電' AND n2.name CONTAINS 'TSMC'
CALL apoc.refactor.mergeNodes([n1, n2]) YIELD node
RETURN node
""")Chunk 大小影響抽取品質
文件切太小,LLM 抓不到跨段落的關係;切太大,又會超出 context window。我的經驗是用 1000-1500 tokens 的 chunk size,overlap 200 tokens,效果最穩定。
快取 Cypher 查詢
生成 Cypher 的 LLM 呼叫成本不低,對於常見的查詢模式建議做快取。
什麼時候該用 GraphRAG?
不是所有場景都需要 GraphRAG,以下情況特別適合:
- 多實體關聯問答:需要理解人物、組織、事件之間的關係
- 知識密集型領域:法律、醫療、金融等有大量實體關係的領域
- 多跳推理需求:答案需要經過 2-3 步推理才能得到
如果你的場景只是簡單的文件問答,傳統 RAG 就夠了。但如果你發現使用者常常問「A 跟 B 有什麼關係」「誰做過什麼」這類問題,那 GraphRAG 就是你需要的武器。
順帶一提,如果你對 AI Agent 的自主搜尋能力也有興趣,可以看看我之前寫的LangChain Deep Agents 多步驟 AI Agent 教學,兩者搭配使用效果更好。
小結
GraphRAG 是 2026 年 RAG 技術演進中最有價值的方向之一。它不是要取代向量搜尋,而是在向量搜尋的基礎上增加了結構化推理的能力。Neo4j + LangChain 的組合讓實作門檻大幅降低,即使是個人開發者也能快速建立起一套有效的知識圖譜增強檢索系統。
下一步你可以嘗試:把你手邊的文件庫用 GraphRAG 重新索引,體驗一下多跳推理帶來的問答品質提升。相信我,一旦用過就回不去了。
繼續閱讀
MCP 協定實戰教學:用 Model Context Protocol 打造可連接任意工具的 AI Agent
相關文章
你可能也喜歡
探索其他領域的精選好文