Multi-Agent RAG Pipeline

Guardrail → Graph Retrieval (Loop) → Vector Retrieval → Response

LangGraph · Neo4j · MCP
USER QUERY · 点击任意节点查看推理过程
"2023年东南亚台风季期间,泰国和越南的受灾情况及负责应急的部门联系方式"
↓ ENTRY
Agent 01 · Guardrail
相关性判断 & 查询路由
判断问题是否与知识库内容相关。不相关则直接回复,避免无效检索链路开销。
Intent Classification Relevance Check
✕ 不相关 → 直接回复 | ✓ 相关 → 进入检索
DYNAMIC GRAPH TRAVERSAL LOOP
Agent 02 · Graph Retrieval
自然语言 → Cypher 查询生成 & 执行
国家 灾害类型 相关部门 分析报告 应急地图
LLM 生成 Cypher,通过封装为 MCP Tool 的执行器在 Neo4j 上运行。每次仅执行单步查询,LLM 根据返回节点动态决策下一跳方向。
Text2Cypher MCP Tool Call Neo4j Single-step per call
LLM 根据返回节点 动态决定是否继续跳转,直至信息完整或达到跳数上限
↓ GRAPH RESULT
检索结果中是否包含「分析报告」实体?
✓ 包含分析报告
Agent 03 · Vector Retrieval
文档切片向量检索 & 摘要压缩
在图谱命中的报告范围内召回语义相似片段,就地摘要压缩,避免上下文窗口爆炸。
Scoped Vector Search Chunk Summarization Context Compression
OR
✕ 仅结构化节点
直接传递
③'图谱结构化结果直传
部门联系信息等结构化数据无需向量检索,直接组装传入回复 Agent。
Structured Data No RAG needed
↓ ASSEMBLED CONTEXT
Agent 04 · Response
最终回复生成
基于原始问题与组装上下文生成最终答复,支持多实体、跨文档信息整合。

Example Trace

点击左侧任意节点查看该步骤的推理过程
← CLICK NODE

点击左侧节点
查看该步骤在示例查询中的
具体推理与执行过程

USER INPUT
原始查询
"2023年东南亚台风季期间,泰国和越南的受灾情况及负责应急的部门联系方式"
地域:东南亚 / 泰国 / 越南 时间属性:2023年 灾害类型:台风 需求①:受灾情况(分析报告) 需求②:应急部门联系方式
此查询同时涉及「分析报告」和「部门信息」两类实体,需要多跳图遍历 + 向量检索双路并行处理
Agent 01 · Guardrail
相关性判断
检测到关键词:台风、东南亚、受灾、应急部门
命中知识库覆盖范围:自然灾害分析 + 区域应急信息
✓ 相关度:HIGH ✓ 路由至图谱检索
判定通过,进入 Graph Retrieval Agent。若问题为"如何预测台风路径"等超出范围的问题,则在此直接回复。
LLM 动态选择遍历路径 · 两种策略示例
PATH AHop 1 · 定位国家节点
查询中已有明确国家名称 → 直接匹配 Country 节点
LLM 识别到「泰国 / 越南」为明确实体,无需经由灾害节点中转,直接锁定最短路径。
MATCH (c:Country) WHERE c.name IN ["泰国", "越南"] RETURN c.id, c.name, c.region
Country(泰国) · id:TH Country(越南) · id:VN
LLM 决策:国家节点已定位,用户有两个子需求 → 并行发起 Hop 2a(报告)和 Hop 2b(部门)
PATH AHop 2 · 并行跳转(2跳终止)
Country → AnalysisReport & Department(并行)
Hop 2a · -[:HAS_REPORT]→
MATCH (c:Country) -[:HAS_REPORT]->(r:AnalysisReport) WHERE c.id IN ["TH","VN"] AND r.disaster_type = "台风" AND r.year = 2023 RETURN r.id, r.title, r.date
TH-Typhoon-2023-08 TH-Typhoon-2023-10 VN-Typhoon-2023-09
Hop 2b · -[:HAS_DEPT]→
MATCH (c:Country) -[:HAS_DEPT]->(d:Department) WHERE c.id IN ["TH","VN"] AND d.type = "应急救援" RETURN d.name, d.contact, d.address, d.scope
DDPM · +66-2-637-3000 VNDMA · +84-24-3733-3415
触发条件:Hop 2a 含 AnalysisReport → 激活 Vector Retrieval;Hop 2b 含结构化节点 → 直传 Response Agent。共 2 跳完成。
PATH BHop 1 · 先定位灾害节点,按时间属性过滤
查询重心在「台风事件本身」→ 从 Disaster 节点出发
若查询描述的是"某次灾害"而非明确国家,LLM 判断从 Disaster 节点出发可同时完成事件过滤,再向下扩散至受影响国家,结果更精确。
MATCH (dis:Disaster) WHERE dis.type = "台风" AND dis.year = 2023 AND dis.region = "东南亚" RETURN dis.id, dis.name, dis.date, dis.severity
Typhoon-Doksuri-2023 Typhoon-Saola-2023 Typhoon-Haikui-2023
LLM 决策:已定位东南亚2023台风事件,沿 [:AFFECTED] 关系跳转至关联国家节点,同时携带来源灾害 ID
PATH BHop 2 · Disaster -[:AFFECTED]→ Country(按名称过滤)
沿 AFFECTED 关系扩散,过滤至目标国家
MATCH (dis:Disaster)-[:AFFECTED]->(c:Country) WHERE dis.id IN ["Typhoon-Doksuri-2023", "Typhoon-Saola-2023", "Typhoon-Haikui-2023"] AND c.name IN ["泰国", "越南"] RETURN c.id, c.name, dis.id AS source_event
Country(泰国) ← Doksuri, Saola Country(越南) ← Saola, Haikui
LLM 决策:国家节点锁定并携带来源灾害 ID,继续并行发起 Hop 3a / 3b
PATH BHop 3 · 并行跳转(3跳终止)
Country → AnalysisReport & Department(并行)
Hop 3a · -[:HAS_REPORT]→
MATCH (c:Country) -[:HAS_REPORT]->(r:AnalysisReport) WHERE c.id IN ["TH","VN"] AND r.source_event IN [ "Typhoon-Doksuri-2023", "Typhoon-Saola-2023", "Typhoon-Haikui-2023"] RETURN r.id, r.title
TH-Typhoon-2023-08 VN-Typhoon-2023-09
Hop 3b · -[:HAS_DEPT]→
MATCH (c:Country) -[:HAS_DEPT]->(d:Department) WHERE c.id IN ["TH","VN"] AND d.type = "应急救援" RETURN d.name, d.contact, d.address, d.scope
DDPM · +66-2-637-3000 VNDMA · +84-24-3733-3415
Path B vs Path A:多经由一跳(灾害节点),共 3 跳,但报告与具体台风事件的关联更精确。体现了 LLM 根据查询意图动态选择遍历起点的能力。
Agent 03 · Vector Retrieval
范围限定向量检索
输入 Report IDs:TH-2023-08, TH-2023-10, VN-2023-09
从原始问题提取语义查询:"台风受灾情况 损失 影响"
仅在三份报告的 chunks 内执行向量检索,全量语料不参与计算。
TH-08 · chunk_14:洪涝覆盖面积 / 农业损失 TH-10 · chunk_07:人员伤亡统计 VN-09 · chunk_22:基础设施损毁情况
Agent 03 · Chunk Summarization
就地摘要压缩(避免上下文爆炸)
对每个召回 chunk 独立压缩,提取关键数据字段,丢弃冗余叙述性内容。
泰国(2023-08):受灾省份 12 个,洪涝面积约 3,200 km² 农业损失估计 ¥42亿,撤离人口 18万 泰国(2023-10):死亡 23人,失踪 7人,房屋损毁 8,400户 越南(2023-09):道路中断 47处,桥梁损毁 12座 电力设施受损覆盖 320万户
原始 chunks 约 4,200 tokens → 压缩后约 280 tokens,传入 Response Agent 的上下文缩减 93%
直接传递 · 结构化数据
部门信息直传(本例中与向量检索并行)
图谱 Hop 2b 已返回完整结构化节点属性,无语义模糊,无需向量检索。
Department: DDPM (泰国灾害预防与减灾局) contact : +66-2-637-3000 address : Bangkok, Rama II Rd. scope : 全国自然灾害应急响应 Department: VNDMA (越南自然灾害管理局) contact : +84-24-3733-3415 address : Hanoi, Doi Can St. scope : 全国洪涝、台风应急管理
若查询仅涉及部门信息(不含受灾分析),则 Vector Retrieval Agent 不会被触发,直接进入 Response Agent。
Agent 04 · Response
上下文组装 → 最终生成
汇入两路结果:向量摘要(灾情数据) + 结构化节点(部门信息),结合原始问题生成回答。
Context: [灾情摘要] 泰国2023台风季:受灾12省,损失¥42亿... [灾情摘要] 越南2023台风季:道路中断47处... [部门信息] DDPM Thailand: +66-2-637-3000 [部门信息] VNDMA Vietnam: +84-24-3733-3415 → LLM 综合生成结构化答复,含数据来源溯源
泰国受灾概况(2份报告综合) 越南受灾概况 泰国应急部门联系方式 越南应急部门联系方式
完整回答涵盖用户两个子需求,来源可溯源至具体报告节点和部门节点。