Technical Guide

09. Tools 实战:给研究型 Agent 增加一个工具能力

以研究型 Agent 为目标,设计一个低风险工具:输入清楚、输出短、失败可读、能被报告生成流程使用。

实战目标

这一篇不追求写一个复杂工具。

目标是设计一个适合研究型 Agent 的工具能力:输入清楚,输出可控,失败时能解释。

可以先做一个“资料摘要清洗工具”:给它一段抓取到的网页正文,让它返回更适合报告使用的结构化片段。

为什么选这个工具

研究型 Agent 最常见的问题不是不会写,而是资料太乱。

搜索结果、网页正文、复制出来的公告,经常混着导航、广告、脚注和重复内容。

如果直接塞给模型,报告很容易变散。

工具输入设计

输入不要太多。

source_url
raw_text
focus_question

这三个就够。

不要一开始设计十几个参数。参数越多,Agent 越容易传错。

工具输出设计

输出也要短。

建议返回:

title
source_url
key_points
evidence_snippets
unknowns

unknowns 很重要。它提醒后续报告不要把不确定信息写成事实。

放在哪里

可以参考内置工具目录:

backend/packages/harness/deerflow/tools/builtins/

真正落地时,要结合工具注册逻辑,把新工具加入 Agent 可用工具列表。

验证方式

不要直接让 Agent 写长报告。

先单独验证工具:

给一段短网页正文
看输出是否稳定
看失败信息是否可读
看 key_points 是否足够短

然后再放进完整任务流。

这一篇你要记住

自定义 Tool 不要追求“万能”。

越窄、越清楚、越容易验证,越适合交给 Agent 调用。

常见坑

第一个坑是把工具做得太大。

比如一个工具同时负责搜索、抓取、摘要、评分、写文件。看起来省事,但 Agent 一旦调用失败,你不知道是哪一步坏了。

更好的方式是拆成几个小工具,每个工具只做一件事。

第二个坑是输出太自由。

工具输出如果是一大段自然语言,后续 Agent 很难稳定使用。尽量返回结构化字段,哪怕只是简单的 JSON-like 文本。

第三个坑是没有失败样例。

工具一定会失败。网页打不开、API 超时、正文为空、权限不足,这些都要有可读的错误信息。

实践:练手小作业

给“资料摘要清洗工具”准备三组固定输入,不急着接入完整 Agent:

样例 A:一段包含标题、正文和广告的正常网页文本
样例 B:空字符串
样例 C:正文很短,无法回答 focus_question

先直接调用工具,再检查输出。

完成标准

  • 正常输入能返回 titlekey_pointsevidence_snippetsunknowns
  • key_points 数量受控,不是一整篇改写;
  • 每条证据可以回到原文核对;
  • 空正文返回可读错误,而不是堆栈;
  • 证据不足时写进 unknowns,不编造答案;
  • 输出能被下一步直接序列化或写入报告。

完成这些后,再把工具接入现有工具集合,并用同一段材料比较接入前后的报告片段。

多走一步

给输出增加一个 content_hash 或等价的来源标识。重复处理同一份正文时,检查是否能识别重复材料,避免研究报告反复引用同一来源。

做完后怎么判断有价值

一个工具是否值得保留,可以看三个问题:

它是否减少了 Agent 的猜测?
它的输出是否能被下一步直接使用?
它失败时是否方便排查?

如果三个答案都是否定的,这个工具大概率只是增加复杂度。