搞 AI Agent 开发,最近被一个事整得有点头疼。

我们的 GEO Agent 上线第一周,后台监控看到一个诡异的现象。有个用户进来,啥也没干,就说了句"你好"。

正常人的思维,Agent 回一句"你好,有什么可以帮你的"就完事了,对吧?

结果我打开后台日志一看,好家伙,这个 Agent 跟打了鸡血似的,调了十几次工具——查项目列表、查流量数据、查 API 文档,最后回了一段三百多字的"我是 GEO 智能助手,可以帮你做 GEO 分析、查看项目数据、生成报告……"

过度热情的Agent

用户没问这些。

它只是打了个招呼。

模型太"勤快"了:Agent 过度工具调用原因详解

问题出在哪?出在模型太"勤快"了。

你给它一堆工具,它总觉得不用白不用。说白了就是,模型拿到工具列表之后,有一种莫名的"我要干活"的冲动。用户说句话,它先想"这个问题可能跟项目有关",调一次项目接口;返回了一堆数据,它又想"我可以分析一下这些数据",再调一次分析工具;分析完了觉得"还可以生成个图表",又调一次渲染工具。

十次调用下来,用户等了三十秒,花了好几毛钱的 token,得到的是一段它根本不需要的自我介绍。

这个毛病不止我有。DeepSeek Harness 的实测笔记里也提到,他们早期版本有类似的问题——模型会在不需要的时候过度使用工具。尤其是推理强度开高的时候,光"思考"就能烧掉几千个 token。

真不行。

这里有个巨坑:你以为给模型更多工具是"赋能",实际上你是在给它挖坑。模型在模糊意图面前,会倾向于"广撒网",因为你没告诉它什么时候该停手。

我的解法:Agent 执行画像(Agent Run Profile)教程

DeepSeek 的解法是做了四种模式,让用户手动选。我的解法思路一样,但实现不同——我做了一个更轻量的东西:执行画像(Agent Run Profile)

简单说,就是根据用户这句话的意图,提前决定这轮对话允许多少步、能用哪些工具、最多输出多少 token。

听我一句劝,做 Agent 不搞画像,后面成本会让你哭。

我定义了八种画像,每种对应一类用户意图:

画像 用户说了什么 最大步数 首步允许的工具 策略
product_help “你好”“你能做什么” 1 无(直接回答) 不许调工具
quick “流量怎么样” 3 聚合数据接口 拿到结果就必须写结论
project_list “我有哪些项目” 3 项目列表接口 同上
report “出一份周报” 4 聚合数据接口 允许多一步容错
deep_dive “为什么流量下降了” 6 先聚合,后允许低层接口 允许多步分析
site_audit “帮我审计这个网站” 不限 审计工具 允许脚本执行
write “帮我写一篇文章” 不限 读数据→生成→检查 允许多步工作流
general 其他 8 全部工具 兜底

关键在"第一步只能调什么"这个约束。

我发现大多数过度调用都发生在第一步——模型拿到一个模糊的问题,不知道该调什么,就广撒网。如果第一步就限定它只能调那个最可能返回完整答案的接口,后面的发散就少了一大半。

适时的停步

换个角度看,这就像你安排一个新来的实习生干活。你不能把公司所有的资源权限都给他,然后说"你看着办"。你得告诉他:第一,先查 A 系统;第二,查不到再查 B;第三,查到了就写报告,别瞎翻别的东西。

Vercel AI SDK prepareStep 代码示例:Agent 步数控制与工具限制

在 Vercel AI SDK 里,这个约束是通过 prepareStep 回调实现的。这是 SDK 里我个人认为最被低估的一个钩子。

prepareStep({ stepNumber, messages }) {
  // 每一步开始前重新修剪上下文
  const trimmed = trimMessages(messages, systemTokens)
  
  // 第一步:只放行画像规定的初始工具
  if (stepNumber === 0 && profile.initialToolKeys)
    → activeTools = profile.initialToolKeys
  
  // 最后一步:收走所有工具,强制模型写总结
  if (stepNumber === MAX_STEPS - 1)
    → activeTools = []  // 模型只能输出文字
  
  // 中间步:放行画像规定的后续工具
  else
    → activeTools = profile.toolKeysAfterInitial
}

最后一步强制闭嘴这个设计特别重要。

没有这个约束,模型会在最后一步还在调工具,然后因为步数用完被硬切断,用户看到的就是一个没写完的回答,跟拉肚子拉到一半没纸了一样尴尬。

Agent 执行画像实际效果对比:耗时、成本与工具调用优化

一句话,“做了比没做强太多”。

同样一句"帮我看看流量":

没做画像 做了画像
工具调用次数 ~6 次 1 次
端到端耗时 ~25 秒 ~4 秒
token 成本 ~8 分钱 ~2 分钱

用户体验反而更好了——因为答案来得快,而且是直接回答问题的,不是一堆它没问的分析。

绝了。就减少了那么几行约束代码,速度提了 6 倍,成本降了 75%。

Agent 画像约束的微妙平衡:自动判定与手动模式选择

但这里有个微妙的平衡:约束太死,agent 就变蠢了。用户问一个确实需要多步分析的问题,画像如果只给 3 步,agent 就干不完。所以画像的判定本身也得聪明。

我的做法是看关键词和上下文。比如"为什么"“对比”"分析一下"这种词出现,就放开到"深度分析"画像,给 6 步预算。项目 ID、具体时间段这种细节出现,也倾向于放更宽。拿不准的时候,宁可给多一点预算,让模型自己决定什么时候停。

DeepSeek 的四种模式本质上也是同一个思路:不同的任务给不同的工具集和步数上限。只不过他们是让用户手动选,我是让系统自动判。各有利弊——手动选更可控,但用户得理解四种模式的区别;自动判更省事,但偶尔会判错。

我个人的执念是,能不给用户加认知负担就别加。用户就想问个流量数据,你还让他选"深度推理模式"还是"快速响应模式",这不是折腾人吗?

说到底,agent 的"聪明"不是让它想做多少做多少,是让它在该停的时候停下来。这个"该停"的边界,就是 harness 最核心的职责之一。


本文作者来自 Adgine 团队,提供 GEO 服务(让品牌被 AI 推荐),官网 https://adgine.cn

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐