多智能体+知识图谱:打造企业级可靠RAG问答系统 简介这是一份聚焦Gemini科研应用的PDF手册面向科研新手、硕博研究生及跨学科研究者讲解如何借助Gemini与Deep Research等智能体完成选题生成、文献检索、精读分析、综述撰写、科研绘图与汇报PPT制作的全流程。核心亮点是“研究方案先行”“方案可修订”“面向研究目标的结构化输出”并兼顾学术期刊与产业投资报告的交叉扫描帮助锁定兼具新颖性与落地性的方向。资源只有1个PDF文件约12.15MB内含大量可直接复用的提示词公式与操作示例覆盖文献检索、段落反向引文、研究方案生成等场景支持PubMed、MEDLINE等数据库的真实可追溯检索。还可依托100万token上下文窗口批量处理文献并结合Canvas、Nano Banana等智能体实现从文本指令到科研产出的闭环。已有232人学习下载适合希望规范研究流程、提升科研效率与成果可视化表达能力的研究人员。1. 面向企业级复杂问答的RAG为什么多智能体与知识图谱必须同时出现把「基于多智能体与知识图谱的检索增强生成模型」这套系统架构搬进企业级复杂问答最先要认账的一件事是单机 RAG 的召回碎片化不是调参能救的。我在做设备手册问答时遇到最典型的场景——用户问 Gemini科研手册指南.pdf 里某个参数在什么条件下会变化向量检索能召回三页含该关键词的片段却拼不出一条完整因果关系。问题就出在检索增强生成只做了“相似度匹配”没做“关系复原”。多智能体负责把复杂问题拆成可验证的子问题知识图谱负责把离散片段连成路径最后再交给 Gemini 这类多模态大模型做综合推理。这套架构不是炫技是为了让企业问答的每一步都有证据、可追溯、能兜底。这篇文章适合正在做企业知识库、设备手册问答、工业知识问答的架构师与后端工程师。看完你至少能回答三个问题知识图谱在 RAG 里到底解决什么、多智能体该怎么编排、以及部署时会踩哪些用钱能买到的坑。2. 系统架构首刀检索增强生成五层拆分Gemini 在融合推理层负责什么2.1 Gemini科研手册指南.pdf 这类非结构化知识源为什么不能直接进 Prompt企业里大量的知识资产是 PDF。Gemini科研手册指南.pdf 这种手册型文档表面上是纯文本实际上混杂了三栏排版、表格、页眉页脚、跨页断句和术语缩写。把它直接切成长文本块塞进 Prompt结果通常是表格被切开同一实体的定义出现在多个 chunk页眉里的公司名污染向量索引一个完整流程被跨页拆成两半检索时只召回后半段。2026 年的多模态大模型已经能直接读图、读表格了Gemini 的上下文窗口也足够大那能不能整本 PDF 都丢进去我劝你别这么做。第一企业手册动辄几百页全量塞进 Prompt 会稀释注意力长上下文的精度在细粒度参数问答上并不理想。第二合规上很多手册不能出内网外部 API 调用有边界。第三成本不划算每次问答都带着几百页 token账单会先于系统上线让你被叫去谈话。正确做法是让 PDF 分两条路走一条是向量化后做语义召回另一条是抽取成知识图谱做结构召回。Gemini 在这里的角色不是数据库而是融合推理引擎——它读的是“按需组织的证据”不是“整个知识库”。2.2 五层架构与三条数据流多智能体不是跑酷是排队我一般会把企业级复杂问答的系统架构拆成五层避免团队各做各的最后拼不起来。层级核心组件职责接入层多智能体入口、会话管理拆解问题、识别意图、绑定企业权限解析层PDF 解析、OCR、表格还原把 Gemini科研手册指南.pdf 这类文档变成结构化文本存储层向量库 知识图谱语义召回与结构召回双通道编排层Planner、Retriever、Verifier、Synthesizer控制多智能体协同、组装证据链生成层Gemini 大模型基于证据生成回答拒绝无依据猜测这里的关键不是画架构图而是理清数据流。写入流PDF 解析成段落段落向量化同时实体关系写入图库两者共用同一份 chunk_id 便于回溯。查询流问题进入编排层由 Planner 拆解为子问题Retriever 分别查询向量与图谱Verifier 检查证据是否覆盖答案Synthesizer 汇总。反馈流人工标记错误答案回流到图谱和后处理规则形成持续修正。多智能体在这一层不是各自为战。每个智能体只负责一个动作按状态机排队执行避免自由对话式的失控调用。这很像检修工人进现场先领工单再带工具确认安全措施最后作业而不是一边走一边问“我该干嘛”。2.3 最小可跑系统Gemini API 向量库 图库的启动参数先给一个能跑通的最小配置。注意 Gemini 的 SDK 在不同版本里调用方式略有差异但核心参数大同小异。# config.py import os from google import genai class RAGConfig: def __init__(self): # 生产环境用独立的服务账号而不是个人 API Key self.llm_client genai.Client(api_keyos.environ[GEMINI_API_KEY]) # 模型名按账号实际可用型号配置常用 gemini-2.x 系列 self.llm_model os.environ[GEMINI_MODEL] # 向量化不一定要用 GeminiBGE 系列在中文手册上表现稳定 self.embedding_model bge-m3 self.vector_collection manual_chunks # Neo4j 连接企业内网注意驱动版本 self.graph_uri os.environ.get(NEO4J_URI, bolt://localhost:7687) self.graph_user os.environ.get(NEO4J_USER, neo4j) self.graph_password os.environ.get(NEO4J_PASSWORD, ) # 检索参数宁可多召回靠验证器过滤 self.vector_top_k 20 self.graph_depth 2 self.graph_limit 30 # 生成参数知识问答不要温度 self.temperature 0.0 self.max_output_tokens 1024 self.max_steps 6 cfg RAGConfig()代码逻辑说明llm_client负责所有 Gemini 调用包括抽取三元组和最终答案生成llm_model必须显式配置不要依赖 SDK 默认值因为不同项目账号开通的模型不一样。embedding_model用独立的 BGE 向量化服务这样可以把向量计算的负载从 Gemini API 挪到自己的推理机上省下按 token 计算的成本。参数说明里最值得关注的是vector_top_k和graph_depth。top_k20在手册问答里是起步值低于 10 往往会漏掉关键证据graph_depth2表示图谱查询只走两层关系超过三层召回的多是无关邻居还会让 Cypher 查询慢到秒级。这两个参数会在后续避坑章节里反复提到。3. 知识图谱构建与检索增强把 PDF 里的“隐式关系”变成可检索路径3.1 用 Gemini 抽取三元组Schema 约束与中文实体边界知识图谱构建的第一道坎是用大模型从 PDF 里抽三元组。Gemini科研手册指南.pdf 这类文档里关系经常不是明说的话。比如“当供气压力低于 0.4 MPa 时调节阀自动关闭”如果只抽“调节阀-关闭”这种字面关系后续问“为什么调节阀打不开”就查不到因果关系。我一般会强制结构化输出让模型返回可解析的 JSON而不是自然语言。from google.genai import types schema { type: OBJECT, properties: { entities: { type: ARRAY, items: {type: STRING} }, relations: { type: ARRAY, items: { type: OBJECT, properties: { head: {type: STRING}, tail: {type: STRING}, relation: {type: STRING}, condition: {type: STRING}, evidence_page: {type: STRING} }, required: [head, tail, relation] } } }, required: [entities, relations] } resp cfg.llm_client.models.generate_content( modelcfg.llm_model, contentsprompt, configtypes.GenerateContentConfig( response_mime_typeapplication/json, response_schemaschema, temperature0, ), ) relations resp.parsed[relations]代码逻辑说明response_schema是让 Gemini 按照给定结构输出 JSON 的关键比提示词里写“请返回 JSON”可靠得多。condition字段是我额外加的专门承载“低于 0.4 MPa”这种触发条件否则关系拿到了判断条件丢了。evidence_page记录页码后续 Verifier 智能体会拿着页码回原文核对。参数说明temperature0必须设置。抽取三元组不是创作温度太高会把“压力低于 0.4 MPa”扩写成“压力低”导致图谱里出现一堆语义漂移的实体。如果发现抽取结果里同义实体扎堆优先检查提示词里是否给出了领域术语边界定义而不是急着调模型。3.2 图谱模式设计与存储选型业务节点、关系与属性怎么定很多团队拿到《知识图谱应用实践指南》这类资料第一版图设计得像百科全书每个设备、每个参数、每个单位都是节点关系类型十几种。结果图谱建成后Cypher 查询写不出来索引爆炸两三万页文档就把图库跑成爬虫。我的建议是关系类型不要超过六种节点只放“值得被检索定位”的实体。比如设备手册里“调节阀”是节点“供气压力”是节点“0.4 MPa”是压力节点的一个属性而不是单独节点。关系类型保留has_part、conditioned_on、located_in、regulates、references这五类就够了。存储选型上我见过三种常见做法方案适用场景坑Neo4j企业级、需要事务与权限查询性能依赖索引设计节点多后热路径要单独调NebulaGraph超大规模图谱运维成本高小团队不推荐内存 networkx原型验证、单机知识库重启丢失不支持复杂事务工业知识图谱建议从 Neo4j 起步。它的 Cypher 对“证据链回放”非常友好能直接查出某条结论的原始路径。节点属性别忘带三件套doc_id、page、source_sentence。这不是锦上添花是没有溯源时 Verifier 根本无法跟 Gemini 争论“你依据的是哪一页”。3.3 图增强检索的实现Cypher 子图召回与向量混合排序知识图谱建好以后真正的检索增强生成逻辑是把图查询结果和向量召回结果合在一起。以“为什么调节阀打不开”为例向量可能召回“调节阀结构图”和“故障排查”两段文字图谱则能查出“调节阀 —conditioned_on→ 供气压力 0.4 MPa —regulates→ 气源开关”这条路径。MATCH (n:Entity {name: $entity}) MATCH path (n)-[r*1..2]-(m) WHERE m.doc_id IS NOT NULL RETURN m.doc_id AS doc_id, m.page AS page, m.source_sentence AS evidence, [x IN nodes(path) | x.name] AS chain, relationships(path) AS relations LIMIT $limit这段 Cypher 做的事情是从用户问题里识别出的实体出发沿关系走 1 到 2 层把路径上的所有节点和原始句子返回。[x IN nodes(path) | x.name]是拼接整条证据链比如“调节阀 - 供气压力 - 0.4 MPa”Verifier 拿到这条链就能判断回答是否完整。Python 侧的混合召回我用 RRFReciprocal Rank Fusion做合并。思路简单分别拿到图谱命中和向量命中的排序按1/(rank60)加权求和最后再输出 Top N。图召回通常数量少但精准向量召回数量多但噪声大RRF 能平衡两者避免某一边完全压制。相关参数top_k20、graph_limit30、rrf_k60。这条链路里最容易出的问题是实体名匹配不上。用户说“气压不足”图谱里存的是“供气压力低”。解决办法在 3.1 抽取时建立别名属性Cypher 查询先匹配 alias 再匹配 name否则图检索会一直空手而归。4. 多智能体编排与协同从 Planner 到 Verifier 的企业级工作流4.1 为什么多跳问题必须拆分智能体一次调用做不了两件事企业级复杂问答的典型问题是多跳的。拿 Gemini科研手册指南.pdf 里的内容举例用户会问“如果现场气源压力只有 0.3 MPa但手册要求最低 0.4 MPa调节阀是否还能可靠关断”这个问题包含三个动作找到压力条件、找到关断逻辑、对比当前压力下结论。单轮 RAG 把问题丢给检索器召回的是碎片Gemini 只能靠猜补全中间步骤。多智能体拆分的价值在于让每个动作都有明确的输入输出边界。Planner 只负责拆解问题Retriever 只负责找证据Verifier 只负责检查证据是否支撑结论Synthesizer 只负责最后生成答案。这种情况下即使最终答案错了你也能在日志里看到是哪一步判错而不是对着一个黑匣子模型头疼。我参与过的工业知识问答项目里有的场景比设备手册更严格。比如多智能体协同的电网可靠运行问答问“某条线路跳闸后哪些开关会联动”这种问题必须逐级检索保护逻辑Verifier 的作用比生成器还重要。找 AI 智能体应用案例时你会发现凡是落地效果稳定的几乎都拆了验证环节而不是让大模型一边检索一边写结论。4.2 四个智能体的职责边界与提示词模板多智能体代码写不好通常不是因为不会调用 API而是职责没划清。我用下面这张表给团队成员对齐避免你调我的工具、我调你的参数。智能体输入输出约束Planner用户原始问题子问题列表与依赖顺序单问题拆解不超过 3 个子问题Retriever子问题证据片段列表 图谱路径必须返回 doc_id 和 pageVerifier证据列表 暂定结论pass / 缺证据清单不做推测只做存在性检查Synthesizer通过验证的证据最终答案与引用没有证据就不输出结论Planner 的提示词我通常写成“把问题拆成可在知识库中独立验证的子问题每个子问题只能有一个查询意图。禁止在子问题里加入假设。”Retriever 的提示词强调“只返回检索到的内容不要用常识补全”。Verifier 的提示词最关键要写成“检查证据中是否包含回答子问题所需的全部要素如果缺少列出具体缺失项不要生成替代答案。”Synthesizer 则要提醒“只能使用给定证据证据不足时明确说不知道”。这套职责设计也决定了 Gemini 的调用方式。Function Calling 在这里扮演工具入口Gemini 决定调用哪个智能体的工具函数但每一步都被工作流状态机接管而不是让模型自己循环调用函数。说直白点Gemini 是驾驶员但方向盘上装了限位器。4.3 多智能体代码骨架状态机与 Function Calling 的结合自由 ReAct 风格的多智能体在原型阶段爽上线后很容易进入死循环模型觉得证据不够反复调用检索器最终 token 账单翻三倍回答还是一样的。我现在的做法是用状态机约束流程每个阶段有超时和最大步数。from enum import Enum class Phase(str, Enum): PLANNER planner RETRIEVER retriever VERIFIER verifier SYNTHESIZER synthesizer class AgentWorkflow: def __init__(self, max_steps6): self.max_steps max_steps self.steps 0 self.phase Phase.PLANNER def run(self, question): sub_questions self._planner(question) evidence_pool [] for sub_q in sub_questions: self.steps 1 if self.steps self.max_steps: return {error: max_steps_exceeded} evidence self._retriever(sub_q) evidence_pool.extend(evidence) decision self._verifier(sub_q, evidence) if decision[status] ! pass: evidence self._re_retrieve(decision[missing]) evidence_pool.extend(evidence) return self._synthesizer(question, evidence_pool)代码逻辑说明主流程先由 Planner 拆子问题每个子问题走 Retriever 和 Verifier。Verifier 如果没有通过不是直接重新问一遍而是根据missing清单做定向补充检索避免无脑扩大召回。所有子问题处理完后才进入 Synthesizer 生成终答。参数与实现要点max_steps6是保护值防止某个子问题反复验证导致失控。在真实日志里如果max_steps_exceeded频繁出现不要去调大这个数字而是去检查图谱是不是漏了一条关键关系或者 Verifier 的“缺失项”描述得太模糊。多智能体代码能不能收敛真正决定因素在 Verifier 的评判标准而不是模型多聪明。5. 企业级 RAG 避坑与排查从图谱漏召回、智能体死循环到 Gemini 吐假 JSON5.1 Gemini 返回 JSON 被 Markdown 污染Schema 与容错解析现象代码里json.loads(resp.text)抛异常打印出来发现 Gemini 在 JSON 前后包了 json 标记。有时候内容里还混着“这是抽取结果”这类说明文字。原因不同 SDK 版本对response_schema的支持程度不同尤其在流式输出或代理网关中转时结构化约束可能被剥离模型退化成普通文本生成。解决一是显式设置response_mime_typeapplication/json二是用 SDK 提供的resp.parsed而不是手动解析文本三是仍然保留一套容错解析函数把 Markdown 代码块标记剥掉再解析。第三点务必做因为只要上游网关升级一次结构化保证就可能会没了。5.2 知识图谱空召回实体消歧和同义词索引现象图谱里明明有“供气压力低导致调节阀关闭”用户问“气压不足会不会关阀”Cypher 查不到任何路径整条图检索通道静默失败。原因图谱查询是精确匹配用户口语化和文档书面表达之间没有连起来。向量检索可以靠语义近似容忍这种差异但图库不行差一个字符就查不到。解决在抽取入库时为实体创建alias属性把同义词都写进去。查询时先做一次实体链接将问题中的实体词映射到标准实体 ID再用 ID 去跑图谱路径检索。除此之外每次人工纠错后把新同义词回写 alias 表这是成本最低的长期收益。5.3 多智能体死循环与超时成本失控的现场排查现象日志里同一个子问题出现了十几条检索记录反馈耗时超过 60 秒月账单明显上浮。更进一步Planner 和 Verifier 反复“重新规划-重新验证”形成逻辑上的死循环。原因Verifier 输出太模糊只写“证据不足”Planner 又没有记忆于是重新拆出相同子问题又走相同的检索路径。另一个常见原因是检索工具没有去重同一证据被重复加入证据池。解决给工作流加max_steps和单阶段 timeout已经是底线。更重要的是让 Verifier 输出“缺失证据的具体定义”比如“缺少压力阈值的页码”并且让 Planner 在二次规划时接收之前的规划记录标记已尝试过的子问题。发现死循环时不要只调步数先查是不是 Verifier 和 Planner 的接口没有传历史状态。5.4 向量库与图库双写不一致先图后向量与重放队列现象图谱更新了新版本手册的数据向量库里还保留旧版片段。用户提问时图检索返回新版关系向量召回返回旧版原文两个证据互相打架Gemini 生成自相矛盾的答案。原因写入链路没有做事务控制。工程上常见做法是先写图库成功后写向量库但图写成功、向量写失败时没有补偿。解决统一走一条 Ingestion Pipeline处理顺序为“写图库 → 写向量库 → 写文档索引”每一步携带doc_version字段。任何一步失败就把任务丢进重放队列并在查询端过滤旧版本数据。这里的后悔药不是人工修数据而是在写入时保留版本号出问题能一键回退到上一版。6. 压测与验证技巧判断这套系统架构值不值得上6.1 评估集三种题型多跳、聚合、反事实做评估集至少要覆盖三类问题。多跳题用来验证图谱路径是否能串起来例如“气源压力低于阈值时哪些设备会受影响”。聚合题用来验证多智能体是否能汇总多页证据例如“手册提到的三种故障模式共同的先兆条件是什么”。反话题用来验证模型会不会被旧版知识误导例如“请问旧版手册中该参数范围是多少”这类题最能暴露版本不一致问题。6.2 联合命中率怎么算我习惯先算子问题层面的召回命中率再算最终答案准确率。如果一个复杂问题被拆成三个子问题只有全部命中才计联合命中。联合命中率低于 60%说明多智能体编排有问题子问题命中率高但终答准确率低问题大概率在 Verifier 和 Synthesizer 的提示词边界。跑一轮评估后去改图谱 schema比继续调 Embedding 更有效。6.3 成本护栏与我的收尾习惯上线前给每次问答设成本上限按“输入 token 输出 token 图库查询时间”核算复杂问题单次超过预值就降级为“仅返回证据片段”。我现在做项目的习惯是每周跑一遍 50 条压测题记录联合命中率和平均响应时间任何一项回退就回滚本周策略而不是继续加 Prompt。多智能体和知识图谱不是越复杂越好衡量标准永远是“能不能回答企业里真正被反复问的那批问题”。希望帮到你。本文还有配套的精品资源点击获取