传统的 RAG(检索增强生成)系统通过向量相似度检索文档片段,但这种方式有一个致命缺陷:它只能找到"相似"的内容,无法理解内容之间的"关系" 。
比如,当你问"和 A 公司有业务往来的 B 公司最近有什么新闻",传统 RAG 只能分别检索 A 和 B 的新闻,却无法理解"业务往来"这个关系。GraphRAG 通过知识图谱来建模这种关系,而 MCP 则让 LLM 能像调用本地函数一样调用 GraphRAG 的检索能力。
组件 | 职责 | 关键特性 |
|---|---|---|
GraphRAG | 知识图谱构建与检索 | 向量检索 + 图关系遍历(如 NEXT_PAGE、RELATED_TO) |
MCP Server | 将 GraphRAG 能力封装为标准工具 | 暴露 search_docs、get_page 等工具给 LLM |
LLM Agent | 理解用户意图,决定调用哪些工具 | 通过 MCP 协议与 Server 通信,执行多步推理 |
数据流:用户提问 → LLM Agent 决策 → 通过 MCP 调用 GraphRAG 检索工具 → 获取带关系上下文的文档 → LLM 生成答案。
使用开源的 graphrag_mcp 项目,它同时使用 Neo4j(图数据库) 和 Qdrant(向量数据库) 实现混合检索 。
# 使用 Docker 启动 Neo4j + Qdrant
# docker-compose.yml 配置略(详见项目文档)
# 索引文档(以 Markdown 为例)
from graphrag_mcp.index_markdown import index_documents
# 将 Markdown 文件按"Page N"分块,建立三种图关系:
# - NEXT_PAGE:页面顺序流动
# - RELATED_TO:语义相似(余弦相似度阈值)
# - CONTAINS:文档归属
index_documents("./specs/") # 指定文档目录索引过程会自动:
:Document 和 :Page 节点及三种关系 # server.py —— MCP Server 入口
from mcp.server.fastmcp import FastMCP
from graphrag_mcp.search import hybrid_search, get_page, get_document_info
mcp = FastMCP("GraphRAG Server")
# 暴露核心检索工具
@mcp.tool()
async def search_docs(query: str, top_k: int = 5) -> list:
"""混合检索:向量 + 图关系扩展"""
return hybrid_search(query, top_k)
@mcp.tool()
async def get_page(doc_id: str, start_page: int, end_page: int = None) -> dict:
"""获取指定页面的内容及上下文(前后页 + 相关页)"""
return get_page(doc_id, start_page, end_page)
@mcp.tool()
async def get_document_info(doc_id: str, max_pages: int = 20) -> dict:
"""获取文档目录和统计信息"""
return get_document_info(doc_id, max_pages)
if __name__ == "__main__":
mcp.run(transport="stdio") # 标准输入输出,适配所有 MCP 客户端# agent.py —— 通过 MCP 连接 GraphRAG
import asyncio
from langgraph_mcp import MCPClient
from langgraph.prebuilt import create_react_agent
from langchain_openai import ChatOpenAI
async def main():
# 1. 连接 MCP Server(子进程启动 server.py)
async with MCPClient(server_script="python server.py") as client:
# 2. 获取所有工具(自动发现 MCP Server 暴露的 Tools)
tools = await client.get_tools()
# 3. 创建 ReAct Agent
agent = create_react_agent(
model=ChatOpenAI(model="gpt-4o"),
tools=tools,
prompt="你是一个知识检索助手,使用 GraphRAG 工具回答用户问题。"
)
# 4. 运行查询
result = await agent.ainvoke({
"messages": [("user", "介绍 MCP 协议的核心概念")]
})
print(result["messages"][-1].content)
asyncio.run(main())这里 Agent 的"思考"过程大致如下 :
用户提问 → Agent 思考:需要检索知识库
→ 调用 search_docs("MCP 协议")
→ 获得带图关系扩展的上下文(包括前/后页和相关页)
→ 判断信息是否充分
→ 若不够,调用 get_page 获取特定页面的详细上下文
→ 综合所有信息生成最终答案能力 | 实现方式 |
|---|---|
全局语义检索 | Qdrant 向量相似度搜索,召回语义相关页面 |
关系上下文扩展 | 通过 NEXT_PAGE 和 RELATED_TO 关系,自动获取相邻和相关页面 |
精准定位 | get_page 工具按页码精准获取内容,支持范围查询 |
工具标准化 | MCP 协议使 GraphRAG 能力可被任何支持 MCP 的 LLM 调用(Claude、GPT、Qwen 等) |
可观测性 | 每个 MCP 工具调用可记录审计日志 |
学术研究也验证了这一组合的有效性:CERN 的 AccGPT 系统正是通过 GraphRAG 捕捉结构关系 + Agentic 工作流进行多步推理 + MCP 访问实时数据源,显著提升了科学知识检索的质量 。
更复杂的系统(如 LangGraph-Agentic-GraphRAG)引入了动态检索路径选择 :
根据查询复杂度动态选择检索路径:
- 跳数 ≤ 2 → 纯向量检索(快)
- 跳数 3–5 → 跨引用多跳遍历(中)
- 跳数 ≥ 6 → 深度图遍历(准)并加入质量门控(Quality Gate):LLM 评估检索质量,低于阈值则触发回溯,选择其他检索路径或重新规划 。
MCP + GraphRAG + LLM 的组合,本质上是将"知识图谱的结构化理解"与"LLM 的推理能力"通过标准化协议缝合在一起。它解决了传统 RAG 的两个核心痛点:
用一句话概括:向量检索决定"在哪里找",图关系决定"找到后怎么拓展",MCP 决定"LLM 如何调用这一切"。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。