一、14.2TODO 驱动流 & 14.3.1 Agent 职责划分

  • 大模型怎么当项目经理?

        TODO Planner Agent 扮演了项目经理的角色。

        当用户抛出一个宽泛的宏大主题时,Planner 不需要立刻去查阅外部资料。它凭借的是大模型在预训练阶段所积累的庞大世界知识库与常识。 它将复杂的任务“降维拆解”为3到5个具体的、可执行的子任务。

        对于每一个拆解出来的子任务,它不仅给出了清晰的任务标题,还明确了研究意图,并针对性地写好了最容易搜出干货的英文查询词。

  • 为什么不能让一个大模型干完所有事?(聊聊 Token 溢出和中间遗忘)

        Token 溢出和中间遗忘。

        1上下文窗口撑爆导致的 Token 溢出。如果把所有未经提纯的生肉数据一次性全塞给一个大模型,API 会直接因为超出 Context Window 而抛出错误,导致系统当场崩溃;即便勉强塞入,也会在生成长篇报告时触及最大输出 Token 限制而截断。

        2大模型注意力机制的中间遗忘现象。即使模型勉强装下了海量文本,当它同时面临构思文章框架、阅读大量长尾噪音数据、提取重点并排版等多重任务时,它的注意力机制会严重过载。它会过度关注文本的开头和结尾,遗忘中间的关键细节,从而导致行文逻辑混乱,甚至产生严重的幻觉。

        因此,系统必须采用多智能体解耦架构。规划专家(Planner)管列提纲,总结专家(Summarizer)像挨个提炼网页干货并保存成极简的笔记,报告专家(Reporter)读取这些高浓度的笔记来排版成文。每个模型各司其职,在自己的职责范围内保持绝对的专注,彻底解决了长文本处理的系统性瘫痪问题。

二、14.3.2 ToolAwareSimpleAgent & 14.3.3 Agent 协作模式

  • 重写 SimpleAgent 加上监听器

        核心意义在于建立系统的可观测性,从而彻底解决长时间运行任务带来的用户体验痛点。

        在深度研究场景下,大模型规划、搜索和总结往往需要数分钟。如果使用原生 SimpleAgent,前端只能采用全局阻塞等待,用户极易误认为系统卡死。加入监听器后,系统能够捕获大模型每次调用工具的动作,并结合 SSE(服务器端推送事件)技术,将“正在搜索某内容”或“任务已完成”等粒度极细的状态实时推送到前端。这使得前端可以进行局部状态渲染和步步为营的 UI 更新,将原本的黑盒等待转化为了进度透明的流式交互体验。

  • 对未来扩展的思考

        目前的顺序协作模式在执行阶段采用了一个简单的线性 for 循环,这意味着所有子任务必须挨个排队执行。

        假如系统规划出了5个完全独立的研究方向,这种阻塞式的线性执行会造成极大的计算资源浪费,导致总耗时成倍增加,这是系统落地生产环境时的最大性能瓶颈。为了突破这一限制,未来的架构可以引入异步并发机制(如 Python 的 asyncio 协程或线程池),将独立任务投入并发池中同时处理,从而大幅压缩整体研究时间。

        更进一步,对于存在数据依赖的复杂研究任务,可以引入有向无环图(DAG)调度机制,系统解析任务依赖后,在确保逻辑先后顺序的前提下,自动实现无依赖分支的最大化并行运算。

三、14.4 工具系统 & 14.5 服务层实现

  • 解耦的艺术: ToolRegistry 插板模式是怎么贯彻“开闭原则”的(14.4.3)

        ToolRegistry(工具注册表)充当了系统中的“万能插线板”,它彻底分离了“大模型呼叫工具”和“工具具体执行”这两个动作。

        大模型在需要使用工具时,只需输出一段特定格式的纯文本指令(如工具名称和参数),ToolRegistry 负责解析这段文本,并去自己的注册字典中寻找对应的工具实例来运行。

        当未来需要新增诸如发送邮件、查询天气等10个新工具时,开发者只需编写新的工具类并将其“插”入注册表即可,完全不需要去修改核心大模型 Agent 的调度逻辑,也不需要写冗长脆弱的 if-else 判断语句,保证了核心架构的极度稳定。

  • 断点与高可用: 为什么要强行把笔记写成 .md 实体文件(14.4.2),以及缓存指纹如何防串台(14.5.4)

        强行写入 .md 实体文件的核心是为了实现“断点续传与持久化”。

        深度研究任务通常耗时很长,如果所有中间总结只保存在内存变量中,一旦遇到网络闪断或程序异常,所有进度将全部丢失。将每个子任务的总结实时落盘为物理文件,不仅能防崩溃,还能让用户在研究过程中实时查看和干预,提升了系统的可观测性。

        缓存指纹防串台则是为了保证数据一致性。在生成搜索缓存的 MD5 指纹时,必须将“查询词”、“最大结果数”和“当前使用的搜索引擎 API”拼接在一起。如果不加入搜索引擎标识,系统就会把过去用免费劣质引擎搜出的旧缓存,错误地喂给现在使用付费高级引擎的用户,导致数据串台。严格的指纹生成机制完美规避了这种逻辑漏洞。

  • 防御性编程: 正则提纯 JSON 与 Pydantic 字段拦截的 Fail-Fast 思想(14.5.1)

        大模型的输出具有不可控性,经常会加上多余的礼貌性回复,或者因为长度限制导致 JSON 截断、漏掉关键的 title 或 query 字段。

        在服务层使用正则表达式强行抠出 JSON 字符串,可以剥离废话;而针对必填字段的强制校验(拦截),则是标准的 Fail-Fast(快速失败)机制。它的作用是将残缺的脏数据拦死在当前环节,直接抛出明确的 ValueError 异常,从而触发系统的自动重试机制。

        如果不做这种拦截,残缺数据就会顺着流水线流入下一个环节,引发底层报错,导致极难排查的连环崩溃。

四、Agentic Web RAG 是如何增强搜索与消除幻觉的

1. 检索与增强

一句话总结:14.4.1 SearchTool 抓取真实网页, 14.5.2截断超长网页字符(防 Token 撑爆),最终将真实数据塞进 Prompt 增强大模型上下文。

        Agentic Web RAG(智能体驱动的网络检索增强)。

        在这个架构中,14.4.1 节的 SearchTool 承担了 Retrieve(检索)的重任。它不再局限于本地死板的文档,而是通过适配器模式直接接入 Tavily 或 DuckDuckGo 等真实搜索引擎,去实时抓取广阔互联网上的活数据。

         但真实网页往往极其冗长,包含了大量无用代码和长尾废话。如果直接把生数据塞给大模型,不仅会瞬间撑爆大模型的上下文窗口导致底层直接报错崩溃,还会白白燃烧掉海量的 API Token 费用。 因此,在 14.5.2 节的总结服务中,系统做了一个极其关键的防御动作:截断超长网页字符。通过简单的估算公式(1个 Token 约等于 4 个字符),强行把超过阈值的冗余字符串截断丢弃。

        最后,系统将这些经过清洗、去重和长度限制的高浓度干货数据,通过字符串拼接的方式塞进 Prompt 里。这就是 Augment(增强)的真正面貌:用物理世界经过严格处理的真实数据,去“外挂”和增强大模型的脑容量,让它有理有据地进行思考。

2. 消除幻觉

一句话总结 在 14.5.2 与 14.5.3 的 Prompt ,逼迫LLM其输出必须带 [1], [2] 等标记。

        大模型极易产生胡编乱造的幻觉。

        在这个项目中,第一道防线建立在 Prompt 提示词工程上。在 14.5.2 的任务总结专家和 14.5.3 的报告撰写专家的系统指令中,采取了强迫溯源的策略:

        系统逼迫大模型在输出的每一个核心观点后面,必须明确标出对应的来源引用标记(如 [1]、[2])。当大模型的推理路径被强行绑定到具体的参考系上时,它发散产生幻觉的概率就会呈指数级暴跌。

         第二道防线在于打通大模型语义层与 Python 执行层的一致性。原代码中存在一个隐蔽的逻辑漏洞:Python 代码简单粗暴地提取了搜索引擎返回的所有 URL 作为参考文献,却无视了大模型在真正写总结时可能只采纳了其中 2 篇有用的文章。这会导致最终报告的文末出现大量与正文毫无关联的垃圾链接,造成严重的信用破产。

        真正的消除幻觉,不仅要求大模型在正文里打上 [1] [2] 的标记,更要求在代码设计上重构数据流向:必须让大模型自己以 JSON 的格式,精确交出它真正引用过的参考链接列表。只有当底层的 Python 代码严格按照大模型返回的真实引用去渲染参考文献时,整个 RAG 系统才算实现了100%的可信度闭环。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐