🚀 Graph-Enhanced RAG: Neo4j + MCP
基于图数据库与工具调用协议(MCP)的增强型 RAG 系统
   
传统向量检索的局限性?→ 图检索 + 关系推理的增强 RAG
📖 项目简介
本项目是一个增强型 RAG(Retrieval-Augmented Generation)系统,采用 Neo4j 图数据库 + MCP(Model Context Protocol)工具调用协议,相比传统基于向量数据库的 RAG 方案,能够实现更精准的上下文检索和复杂关系推理。
🎯 核心创新点
- 📊 图检索替代向量检索:使用 Neo4j 图数据库存储结构化知识,支持关系查询和多跳推理
- 🔗 关系感知检索:不仅检索相似内容,还能发现实体间的关联关系和路径
- 🛠️ MCP 工具调用协议:通过标准化工具接口,让 LLM 能够动态查询图数据库
- 🧠 智能检索策略:支持实体历史、关系路径、时序查询等多种检索模式
- ⚡ 实时知识更新:持续从财经新闻中抽取事件,构建动态知识图谱
🆚 对比传统 RAG
| 特性 | 传统向量 RAG | 本项目的图增强 RAG |
|---|---|---|
| 检索方式 | 语义相似度检索 | 图关系检索 + 语义检索 |
| 关系理解 | ❌ 无法理解实体关系 | ✅ 支持多跳关系推理 |
| 查询能力 | 关键词/语义匹配 | 关系路径、最短路径、时序查询 |
| 结构化 | 非结构化文档块 | 结构化事件-实体-关系 |
| 复杂查询 | "A 和 B 的关系?" ❌ | "A 和 B 的关系?" ✅ |
🏗️ 系统架构
增强 RAG 架构图
┌─────────────────────────────────────────────────────────┐
│ 用户查询 │
│ "宁德时代和比亚迪有什么关系?" │
└────────────────────┬────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ LLM (Qwen) + Tool Calling │
│ ┌────────────────────────────────────────────────┐ │
│ │ 理解查询意图 → 决定调用哪个检索工具 │ │
│ └────────────────────────────────────────────────┘ │
└────────────────────┬────────────────────────────────────┘
│
▼ (MCP Tool Call)
┌─────────────────────────────────────────────────────────┐
│ Neo4j 图数据库 (检索层) │
│ ┌────────────────────────────────────────────────┐ │
│ │ Cypher 查询: │ │
│ │ MATCH path = shortestPath( │ │
│ │ (a:Entity {name:"宁德时代"})-[*]-( │ │
│ │ b:Entity {name:"比亚迪"}) │ │
│ │ ) │ │
│ └────────────────────────────────────────────────┘ │
│ │
│ (Entity) ──[竞争关系]──> (Entity) │
│ 宁德时代 比亚迪 │
│ │ │ │
│ └─[投资]─> (Event) (e:Event)
WHERE ent.name CONTAINS $name
ORDER BY e.timestamp DESC应用场景:回答"宁德时代最近有什么动态?"、"茅台的财务数据?"
工具 3: 关系检索 - find_relationships
# 查找两个实体之间的最短路径(关系推理)
MATCH p = shortestPath(
(e1:Entity {name: $n1})-[*]-(e2:Entity {name: $n2})
)
RETURN p应用场景:回答"A 和 B 有什么关系?"、"如何从 A 关联到 B?"
2. 图增强检索的优势
传统向量 RAG 的限制
# 只能做相似度检索
query_vector = encode("宁德时代和比亚迪的关系")
results = vector_db.similarity_search(query_vector, k=5)
# ❌ 问题:无法理解"关系"的含义,只能返回包含这两个词的文档图增强 RAG 的实现
# 能够进行关系推理
cypher = """
MATCH p = shortestPath(
(a:Entity {name: "宁德时代"})-[*]-(b:Entity {name: "比亚迪"})
)
RETURN p, relationships(p) as rels
"""
# ✅ 优势:直接返回实体间的路径和关系类型3. MCP 协议集成
通过 OpenAI Tool Calling 兼容协议(类似 MCP),实现 LLM 与图数据库的交互:
TOOLS_SCHEMA = [
{
"type": "function",
"function": {
"name": "find_relationships",
"description": "分析两个实体之间的关系路径",
"parameters": {
"type": "object",
"properties": {
"entity1": {"type": "string"},
"entity2": {"type": "string"}
}
}
}
}
]
# LLM 自动决定调用哪个工具
response = client.chat.completions.create(
model="qwen-max",
messages=messages,
tools=TOOLS_SCHEMA, # 提供工具定义
tool_choice="auto" # 让 LLM 自主决定
)🛠️ 技术栈
| 组件 | 技术选型 | 作用 |
|---|---|---|
| 检索层 | Neo4j | 图数据库,存储结构化知识 |
| LLM | Qwen (DashScope) | 生成模型 + Tool Calling |
| 协议 | OpenAI Tool Calling | MCP 兼容的工具调用协议 |
| 数据抽取 | LLM + Transformers | 从非结构化文本抽取结构化事件 |
| 数据源 | akshare | 实时财经新闻 |
📁 项目结构
finance_graph_agent/
├── ingest_service.py # 数据抽取与图谱构建服务
├── agent_client.py # RAG Agent 客户端(工具调用)
├── mcp_server.py # MCP 工具定义(检索策略)
├── database.py # Neo4j 连接层
├── requirements.txt
└── README.md 🚀 快速开始
1. 环境准备
# 安装依赖
pip install -r requirements.txt
# 启动 Neo4j(Docker 方式)
docker run -d \
--name neo4j \
-p 7474:7474 -p 7687:7687 \
-e NEO4J_AUTH=neo4j/password \
neo4j:latest2. 配置环境变量
创建 .env 文件:
# Neo4j
NEO4J_URI=bolt://localhost:7687
NEO4J_USER=neo4j
NEO4J_PASSWORD=password
# LLM API
DASHSCOPE_API_KEY=your_key
DASHSCOPE_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
LLM_MODEL=qwen-max3. 启动服务
# 终端1: 启动数据抽取服务(构建知识图谱)
python ingest_service.py
# 终端2: 启动 RAG Agent(支持工具调用)
python agent_client.py💡 使用示例
示例 1: 关系推理查询
User: 宁德时代和比亚迪有什么关系?
Agent 思考过程:
1. 识别实体: "宁德时代"、"比亚迪"
2. 调用工具: find_relationships(entity1="宁德时代", entity2="比亚迪")
3. Neo4j 查询: 最短路径算法
4. 返回结果: 路径包含 [竞争关系]、[同行业]、[投资关系] 等
Agent 回答:
根据知识图谱查询,宁德时代和比亚迪之间存在以下关系:
- 直接关系:同属锂电池行业,存在竞争关系
- 间接关系:都投资了上游产业链(如锂矿、正极材料)
- 关联事件:在多个新能源汽车项目中同时出现示例 2: 时序检索
User: 最近有什么重要的财经事件?
Agent:
⚙️ 调用工具: get_latest_market_events(limit=5)
🔍 执行 Cypher 查询...
根据最新数据,最近发生了以下重要事件:
1. 宁德时代宣布投资100亿建设新工厂(2024-01-15)
2. 茅台发布三季度财报,净利润增长15%(2024-01-14)
...示例 3: 实体历史检索
User: 宁德时代最近有什么动态?
Agent:
⚙️ 调用工具: search_entity_history(entity_name="宁德时代")
宁德时代最近的动态包括:
- 2024-01-15:宣布投资100亿建设新工厂(主体角色)
- 2024-01-10: 与某公司达成战略合作(主体角色)
- 2024-01-05: 发布新技术突破(主体角色)🎨 技术亮点
1. 图检索 vs 向量检索
传统向量 RAG:
- 只能做语义相似度匹配
- 无法理解实体关系
- 返回的是文档片段,需要 LLM 自行理解
图增强 RAG(本项目):
- 结构化存储:Event + Entity + Relation
- 关系推理:支持多跳查询、最短路径
- 精确检索:直接返回结构化关系数据
2. 多维度检索策略
系统支持三种检索模式,对应不同的查询需求:
| 检索模式 | 适用场景 | Cypher 查询类型 |
|---|---|---|
| 时序检索 | "最近发生了什么?" | ORDER BY timestamp |
| 实体检索 | "A公司的情况?" | WHERE name CONTAINS |
| 关系检索 | "A和B的关系?" | shortestPath() |
3. MCP 协议的优势
- 标准化接口:工具定义遵循标准格式,易于扩展
- LLM 自主决策:让模型自己决定调用哪个工具
- 灵活组合:支持多工具链式调用
- 易于维护:工具逻辑与 LLM 逻辑解耦
4. 实时知识更新
- 持续从新闻源抽取事件
- 自动构建知识图谱
- 支持增量更新和去重
- 时间戳管理,支持时序查询
📊 知识图谱模型
数据模型
(Entity {name: "宁德时代"})
-[:PARTICIPATES_IN {role: "主体"}]->
(Event {type: "投资", trigger: "宣布", timestamp: "2024-01-15"})
(Entity {name: "比亚迪"})检索查询示例
-- 关系路径查询
MATCH p = shortestPath(
(a:Entity {name: "宁德时代"})-[*]-(b:Entity {name: "比亚迪"})
)
RETURN [n in nodes(p) | labels(n)[0] + ':' + coalesce(n.name, n.type)] as path
-- 实体历史查询
MATCH (ent:Entity)-[r:PARTICIPATES_IN]->(e:Event)
WHERE ent.name CONTAINS "宁德时代"
RETURN e.timestamp, e.type, e.trigger, r.role
ORDER BY e.timestamp DESC
-- 时序查询
MATCH (e:Event)
WHERE e.timestamp >= date() - duration({days: 7})
RETURN e
ORDER BY e.timestamp DESC🔬 对比实验
查询:"宁德时代和比亚迪有什么关系?"
传统向量 RAG:
检索结果:
- "宁德时代是锂电池龙头企业..."
- "比亚迪也从事锂电池生产..."
- "两者在新能源汽车领域..."
❌ LLM 需要自行推理关系,可能不准确本项目的图增强 RAG:
Neo4j 查询结果:
路径: 宁德时代 -[COMPETES_WITH]-> 比亚迪
路径: 宁德时代 -[INVEST]-> Event -[INVEST]-> 比亚迪
✅ 直接返回结构化关系,LLM 直接使用🎯 适用场景
- 金融领域:公司关系分析、事件追踪
- 知识问答:需要关系推理的复杂查询
- 企业图谱:供应链、投资关系分析
- 学术研究:论文引用关系、作者合作网络
🔮 未来规划
- [ ] 支持向量 + 图混合检索(Hybrid Search)
- [ ] 实现更复杂的图算法(PageRank、社区发现)
- [ ] 支持自然语言到 Cypher 的自动转换
- [ ] 添加查询结果缓存和优化
- [ ] 支持更多数据源和知识抽取策略
- [ ] Web 界面和可视化展示
📚 相关技术
- Neo4j Graph Database
- Retrieval-Augmented Generation (RAG)
- Model Context Protocol (MCP)
- Graph Neural Networks
🤝 贡献
欢迎提交 Issue 和 Pull Request!
📄 License
MIT License
👤 作者
fu4geliu - - Email
🙏 致谢
- akshare - 金融数据接口
- Neo4j - 图数据库
- Qwen - 通义千问大语言模型
- Transformers - Hugging Face模型库
⭐ 如果这个项目对你有帮助,请给个Star支持一下!
