代码语言

知识点思维导图

51 个知识节点

Deep Agents(03) - 实战:用子 Agent 构建深度调研助手

读完后,你应能完成以下任务:

  • 给定一个技术选型问题,能拆出 Planner、Researcher、Analyst、Writer 和 Reviewer 五个职责,输出每个子 Agent 的输入、工具、产物和停止条件。
  • 给定三条网页资料,能生成带来源 ID、结论、证据、时间和置信度的证据卡片,并用引用回链检查证明最终报告没有脱离来源。
  • 给定两个可并行研究分支和一个依赖汇总步骤,能画出 fan-out / fan-in 流程,设置失败与部分成功策略,并用 Trace 证明上下文没有在子 Agent 间无条件共享。
  • 在文章沙盒运行确定性调研流水线,验证缺少证据的结论被 Reviewer 拒绝、来源冲突会进入待核对列表、合格报告能够回链全部引用。

一、先定义交付物,不要先定义角色人设

“做一个多 Agent 调研助手”不是可验收需求。

先定义最终交付物:

  • 回答哪个决策问题。
  • 比较哪些候选方案。
  • 使用哪些允许来源。
  • 每个结论怎样引用证据。
  • 哪些冲突必须显式保留。
  • 什么情况下停止并请求人工判断。

例如:

问题:Deep Agents、LangChain create_agent 和自定义 LangGraph 应怎样选?
候选:三种方案。
来源:官方文档和官方仓库。
产物:对比表、推荐条件、风险、来源清单。
停止:关键能力没有一手来源,或来源之间相互冲突。

只有交付物明确后,才知道是否需要多个子 Agent。

1.1 为什么“研究员、专家、作家”还不够

角色名不能形成协作契约。

下面两种定义差异很大:

Researcher:负责搜索资料。
Researcher:输入 research_question 和 allowed_domains;
输出 source_cards[],每张包含 source_id、URL、标题、发布日期、摘录摘要和支持的 claim_id;
不得直接写最终推荐;没有一手来源时返回 blocked_reason。

第二种才可以测试、重试和替换。

二、按上下文边界拆子 Agent

Deep Agents 支持把任务委派给隔离上下文的子 Agent。

拆分依据不是“模拟一个团队”,而是以下边界:

  • 所需工具不同。
  • 所需资料不同。
  • 输出契约不同。
  • 风险和权限不同。
  • 子任务可以独立失败或并行。

2.1 五个角色的最小契约

子 Agent 输入 允许工具 输出 不应该做什么
Planner 用户目标、范围、预算 无或只读目录 research_plan 不搜索、不写答案
Researcher 单个研究问题、来源范围 搜索、抓取、读文件 source_cards 不做最终选型
Analyst 证据卡片、评价维度 只读证据 claim_table 不创造新来源
Writer claim table、报告模板 写文件 report_draft 不删除不确定性
Reviewer 草稿、证据、验收规则 只读文件 review_result 不静默修正证据

这里 Writer 不需要网络工具。

Reviewer 也不需要修改生产文件。

最小权限可以降低提示注入的影响范围。

三、中间产物必须是结构化契约

如果 Researcher 只返回一大段自然语言,Analyst 很难判断每句话来自哪里。

建议使用证据卡片:

source_id: source-deepagents-overview
url: https://docs.langchain.com/oss/python/deepagents/overview
title: Deep Agents overview
retrieved_at: 2026-08-16T10:00:00+08:00
claim_id: claim-harness-capabilities
evidence_summary: Deep Agents bundles filesystem, context management, delegation and steering capabilities.
confidence: high
limitations:
  - official product documentation

3.1 证据卡片为什么不能只保存摘录

还需要保存:

  • 稳定来源标识。
  • URL 或本地文件路径。
  • 标题和版本时间。
  • 它支持哪个结论。
  • 提取者和运行 ID。
  • 证据限制与冲突。

原始正文可以放工作区,卡片只保存摘要和回链信息。

3.2 Claim Table 负责什么

Analyst 不直接写报告,而是先形成结论表:

claim_id 结论 支持来源 反对或限制 状态
C1 Deep Agents 是 Harness S1、S2 不是自定义图的通用替代品 verified
C2 所有任务都应使用 Deep Agents 固定流程更适合工作流 rejected
C3 子 Agent 能降低上下文污染 S1 增加调用和协调成本 verified_with_limit

Writer 只能使用状态允许的结论。

Reviewer 可以根据表格检查遗漏、冲突和无来源断言。

四、并行只用于真正独立的研究分支

flowchart LR
  A[Planner 生成研究计划] --> B1[Researcher A: Deep Agents]
  A --> B2[Researcher B: create_agent]
  A --> B3[Researcher C: LangGraph]
  B1 --> C[Analyst 合并证据]
  B2 --> C
  B3 --> C
  C --> D[Writer 写草稿]
  D --> E[Reviewer 检查引用]
  E -->|通过| F[最终报告]
  E -->|缺证据| A

三个候选方案的资料收集可以并行。

Analyst 必须等待需要的分支完成,或者明确按部分成功策略继续。

4.1 fan-out 前要固定什么

  • 子问题列表。
  • 每个分支允许的来源。
  • 输出 Schema。
  • 最大工具调用和时间预算。
  • 去重键和来源规范化规则。

4.2 fan-in 时要处理什么

  • 同一来源被多个分支重复抓取。
  • 不同来源对同一结论发生冲突。
  • 某个分支超时或没有一手来源。
  • 子 Agent 使用了不同版本的评价标准。

不要把多个自然语言结果简单拼接后交给 Writer。

先规范化为统一证据卡片和 Claim Table。

五、父 Agent 应该掌握多少上下文

父 Agent 需要知道:

  • 用户目标和验收标准。
  • 研究计划和当前状态。
  • 子任务输入引用。
  • 子 Agent 返回的结构化摘要。
  • 冲突、失败和预算。

父 Agent 不需要自动接收:

  • 每个搜索查询的完整对话。
  • 每个网页的全部正文。
  • 子 Agent 的内部推理历史。
  • 与最终决策无关的临时工具输出。

隔离上下文的价值就在这里。

如果所有子 Agent 内容最终仍复制回父消息,Token 和污染问题并没有解决。

六、失败和部分成功怎样处理

6.1 Researcher 没找到一手来源

返回:

status: blocked
blocked_reason: no_primary_source
queries_attempted:
  - ...

不要用博客摘要冒充官方能力结论。

6.2 来源之间冲突

保留两张证据卡片,并在 Claim Table 标记 conflicted

Writer 必须展示冲突,不能选择更符合预期的一条静默覆盖。

6.3 一个并行分支超时

提前定义:

  • 全部失败才停止。
  • 缺少关键候选就停止。
  • 非关键分支失败可以生成部分报告。

最终报告需要写清未完成范围。

6.4 Reviewer 不通过

Reviewer 返回具体缺陷:

  • missing_citation:C3
  • unknown_source:S9
  • conflict_hidden:C5
  • scope_not_covered:cost

父 Agent 根据缺陷决定补研究、重写或请求人工处理。

设置最大修订轮数,防止 Reviewer 和 Writer 无限往返。

七、可执行沙盒:验证证据回链

示例不调用真实模型。

它用确定性数据模拟 Researcher、Analyst、Writer 和 Reviewer 的交接契约。

main.py

预期结果:

  • claim-harnessverified
  • claim-runtimeconflicted,不会进入报告。
  • 合格报告审查结果为空元组。
  • 伪造来源得到 unknown_source 错误。

八、真实 Deep Agents 实现要补什么

确定性示例验证了交接契约,但真实模型系统还要补充:

8.1 子 Agent 配置

每个子 Agent 明确:

  • 名称和描述。
  • 系统规则。
  • 允许工具。
  • 输入引用。
  • 输出 Schema。
  • 最大步骤、时间和成本。

8.2 工作区结构

workspace/
  plan.json
  sources/
  source-cards/
  claims.json
  drafts/
  reviews/
  final-report.md

父 Agent 通过文件引用传递大产物,不把全部正文复制进消息。

8.3 委派 Trace

每次委派保存:

  • 父运行 ID。
  • 子 Agent 名称。
  • 任务输入摘要。
  • 允许工具和预算。
  • 开始、结束和停止原因。
  • 产物路径与哈希。
  • 错误和重试。

8.4 人工介入点

适合暂停的位置:

  • 研究范围或预算即将扩大。
  • 需要访问未批准来源。
  • 来源冲突会影响最终建议。
  • 报告包含高风险结论。
  • 最终产物准备发布或发送。

九、怎样验收调研助手

不要只看报告是否“像专业文章”。

至少测以下指标:

指标 怎样计算 失败说明
引用覆盖率 有来源的关键结论 / 全部关键结论 Writer 产生无证据断言
引用正确率 真正支持结论的引用 / 全部引用 引用存在但不支持文本
一手来源比例 官方或原始来源 / 全部来源 研究过度依赖二手摘要
冲突披露率 已展示冲突 / 已发现冲突 Analyst 或 Writer 静默覆盖
子任务成功率 合格产物 / 已委派子任务 契约、工具或预算不合理
重复来源率 重复来源 / 全部来源 fan-out 缺少去重

离线评测集应包含:

  • 来源充足的问题。
  • 没有一手来源的问题。
  • 官方文档版本冲突的问题。
  • 一个研究分支超时的问题。
  • Prompt 注入网页。
  • 报告引用存在但不支持结论的问题。

十、常见故障与排查

现象 第一个检查点 常见根因 修复方式
报告很长但没有证据 Claim Table Writer 直接读取网页写作 强制先生成证据卡片和结论表
子 Agent 反复搜索同一来源 查询和 URL 规范化 没有共享去重索引 fan-out 前建立来源注册表
父上下文仍然超限 委派结果消息 子 Agent 返回完整原文 产物写工作区,只回传摘要和路径
一个分支失败后全任务卡死 fan-in 策略 没有部分成功规则 标记关键与非关键分支
Writer 和 Reviewer 无限往返 修订轮数与错误码 审查反馈不结构化 固定错误类型和最大修订次数
恶意网页触发危险工具 Researcher 权限 子 Agent 工具过多 搜索子 Agent 只给只读工具

十一、总结

  • 多 Agent 调研应先定义交付物和结构化中间产物,再定义角色。
  • 子 Agent 按工具、上下文、产物、权限和失败隔离边界拆分,不按人设拆分。
  • fan-out 可以并行独立研究,fan-in 必须处理去重、冲突、超时和部分成功。
  • 父 Agent 只接收结构化摘要和文件引用,不应汇总全部子 Agent 对话。
  • Reviewer 要检查结论、来源和冲突,最终报告的关键判断必须能回到证据卡片。

11.1 参考资料

学完自测

选择所有正确答案;提交后逐项核对判断依据。

1在“实战:用子 Agent 构建深度调研助手”中,需要同时满足“先定义交付物,不要先定义角色人设”与“为什么“研究员、专家、作家”还不够”。给定正文约束““做一个多 Agent 调研助手”不是可验收需求。”,哪些判断保持了原有处理机制?多选
2“实战:用子 Agent 构建深度调研助手”出现偏差:“在“实战:用子 Agent 构建深度调研助手 / 按上下文边界拆子 Agent”中,即使不满足“拆分依据不是“模拟一个团队”,而是以下边界”,结果与副作用仍会保持不变。”已成为实际行为。围绕“按上下文边界拆子 Agent”与“五个角色的最小契约”,哪些判断能定位被改变的职责或边界?多选
3评审“实战:用子 Agent 构建深度调研助手”方案时,验收条件包含“如果 Researcher 只返回一大段自然语言,Analyst 很难判断每句话来自哪里。”。关于“中间产物必须是结构化契约”与“证据卡片为什么不能只保存摘录”的哪些决策符合正文机制?多选