桃子桃子快讯
返回首页
工具

Vercel AI SDK v7 隐藏陷阱:小模型多轮工具调用为何集体翻车

Vercel AI SDK v7 的弃用属性 result.response.messages 在多步工具调用中只保留末…

2026.07.08 · 周三4 分钟阅读

Vercel AI SDK 是当前 AI 智能体与多轮工具调用开发中最常用的 TypeScript SDK 之一。其 v7 版本引入了一项不易察觉的 API 语义变更:被广泛使用的 result.response.messages 属性从「完整历史」变为「仅末步助手文本」,而真正的累积历史被迁移到新的 result.responseMessages 顶层访问器。由于 4.0 迁移指南曾明确建议从 responseMessages 切换到 response.messages,v7 又把语义换了回去——同一个属性名在两次大版本中含义完全不同,却依然能通过类型检查且无任何运行时警告。

一次被误解的「小模型弱点」

作者在早期基准测试中观察到:让模型在多轮对话里执行「先创建节点,再修改该节点属性」这类简单任务时,gemini-3.5-flash 在后续回合失败率高达 96%,claude-haiku-4.5 失败 71%,而 gpt-5.4 和 claude-sonnet-4.5 几乎不受影响。114 例失败案例呈现出统一的模式:指令输入正确,模型却回复一个「DONE」后不再调用任何工具。最初被解读为「小模型多轮上下文脆弱性」,并得出了「整体重写优于细粒度工具调用 33 分」的结论。

后续的消融实验出现更异常的信号:对话深度与「重述指令后再行动」这类常规缓解策略的影响在模型间完全不一致;gpt-5.4 加上重述指令后,成功率从 100% 暴跌到 7.5%;而改用全新会话时,所有模型立刻恢复正常。

真正的元凶:历史拼接丢了一整层

作者重新审阅被发送给模型的对话历史,发现 v7 的 result.response.messages 在多步工具执行中只包含末步助手文本,模型自身的工具调用与工具结果藏在 result.steps 的更深层级。测试框架在每轮工具调用后执行了 messages.push(...result.response.messages),相当于把模型刚刚完成的 insertNode 调用和返回的节点 ID 一并擦除。从模型的视角看,上下文里只剩下「用户要求编辑」和「助手回复 DONE」这两条消息——它没有撒谎,只是在延续上下文里唯一存在的模式。

控制对照:同一任务,同一提示,同一模型

作者利用已构建好的后续研究框架,使用正确的 result.responseMessages 重新跑了完整的对照实验。修正历史后:

  • gemini-3.5-flash:3.8% → 71.2%
  • claude-haiku-4.5:28.8% → 98.8%
  • claude-sonnet-4.5:96.2% → 100%
  • gpt-5.4:96.2% → 100%

在所有 2,160 个测试单元、6 个模型、不同对话深度的全部实验臂上,修正后均为 100% 成功。一行属性名的差异,把原本看似小模型能力差距的 33 分硬生生归零。

经验:沉默的语义替换是智能体管线的最大风险

作者已将该问题作为增强请求提交上游(vercel/ai#16840),维护者按「符合文档」处理,分类为需要迁移工具与防护措施的增强项。事件的核心不在于某个 SDK 的失误,而在于「通过类型检查、零运行时信号、属性名稳定」这一类语义替换在智能体对话管线中产生的连锁反应:编译器不会提醒、CI 不会报错、生成的代码看不到 @deprecated 注解,只有模型的失败率悄悄变化。对于任何依赖多轮工具调用的智能体框架而言,拼接会话历史的逻辑都值得用受控 A/B 重新验证。

信源