当前位置: 首页 > news >正文

Agent出现LLM因为历史工具调用消息而误解工具调用方式的问题

背景

近期在Mac mini上部署了Acbox等开发者开发的Memoh——一款基于docker容器的多智能体Agent。在使用过程中出现了问题,Agent调用工具失败,并且在聊天记录中出现了类似下面格式的文本。

<tool_call ...>{...}</tool_call>

排查

在项目仓库已有人提交了issue #437,其认为问题在于LLM-SDK缺少兜底方案,需要Agent进程在LLM返回的content中扫描tool_call字符串,并转换为正常工具调用。

但是直觉认为,这只是一种治标不治本的方法。问题关键并不在于此。


经过排查,发现<tool_call ...>{...}</tool_call>这种类似XML的格式的由来是:Agent将历史的工具调用记录转换为这种格式的字符串,再放入上下文发送给LLM。这种格式会让LLM误以为在content中写这种格式就是触发工具调用的方法,进而引发错误。

于是,在Codex的建议下,秉持着最小修改的原则,将<tool_call ...>{...}</tool_call>格式改为了更类似自然语言的格式:

[Previous assistant tool use]
Tool: exec
Input: {...}

然而,在接下来的测试中,LLM居然开始误将这种新的格式作为工具调用的方法,继续在输出的content中写入这种内容。

但是,这也印证了问题的根本原因就在于:LLM误学习了历史工具调用格式。

问题处理

考虑到处理该问题会涉及到后端的turn_response管线的大改,因而我没有参与更改。只在项目仓库提了一个issue。在第二天下午,项目的开发者便根据此issue使用Codex予以修改了,具体修改可见PR。

其修改的大致思路为:不再将工具调用记录和其他文本一样转为string放入content里,而是以完整的调用结构化数据存放,与content分离。

进一步思考

为什么会发生这样的错误

internal/pipeline/turn_response.go中可以看到,该Agent在把工具调用拼装入上下文的时候,会将其与其他对话上下文一起转换为下面的结构体:

type ContextMessage struct {
Role string `json:"role"`
Content string `json:"content"`
}

在这个结构体中,工具调用也和其他聊天文本一样被压扁成string。但是为了表示不同,还会进一步写为这种xml格式。

可能因为项目在最初没有考虑到要将工具调用引入上下文,因而上下文消息只使用string来表示。但是后期引入工具调用上下文时,可能出于方便,没有同步修改消息结构。

关于issue #437

这个issue提出了一种解决方案,让Agent在收到LLM发来的消息的时候,扫描<tool_call ...>,并将其作为触发工具调用的符号。并且指出知名的Agent项目hermes-agent也是这么做的。

但是这种做法的缺陷在于:

<tool_call ...>本身就不应该是LLM触发工具调用的方式,强行兜底处理与项目设计意图相悖。

Agent可能会在不以触发工具调用为目的的时候发出<tool_call ...>,如引用历史工具调用记录。

http://www.jsqmd.com/news/1132341/

相关文章:

  • Gromacs 分子动力学 远程安装介绍 全网最详细的Gromacs安装前说明 该怎么选择合适的安装方式 Windows直接可用的Gromacs(预编译版)有什么危害?Gromacs安装需要准备什么?
  • Langchain文本切割器在RAG中的使用
  • K/R/F/S 四大系列斜齿轮减速机的区别与选型要点?
  • Cline 配置 Claude Sonnet 5 实战指南:思考深度调优与切换 Fable 5 的时机
  • 3步解锁Text-to-CAD:如何用文字描述生成专业机械设计
  • Pandoc Lua 过滤器:免外部工具,高效处理文档转换!
  • 图最短路评测:Dijkstra 对了,也可能用错场景
  • [实例] SPI接口的ADC芯片全通道纯硬件驱动——基于HAL库和TLA2518芯片
  • 74LS73 异步计数器设计实战:2片芯片实现4位二进制与8421BCD电路对比
  • Claude Code的完美国产替代小米 MiMo Code安装指南
  • 前端应用的离线暂停更新策略:原理、实现与最佳实践
  • 星火插件:面向资深开发者的认知增强型IDE插件
  • [特殊字符] Git 协作指南
  • Recursive vs. Recurrent RNN 结构辨析:从链式到树状的3种建模范式
  • Vben精讲:06-Vben环境变量配置
  • VS code 连接 remote SSH 一些基本教程
  • CameraGraph™全域相机拓扑推理引擎 视频孪生跨镜目标连续追踪核心支撑 空间相机关系张量建模:根治跨镜头目标ID跳变、身份混淆底层算法拆解
  • 拯救开题困难户!Paperxm三步标准化,把“憋不出来”变成“一键生成”
  • 全域实景动态复刻,公安治安视频孪生快速溯源研判技术解析 跨辖区视频流时空融合 · 全域人员连续追踪管控 · 实景三维动态预警 · 城市安防一体化指挥底层全解
  • 2025反爬系统深度解析:从Canvas指纹到AI行为画像的攻防实战
  • ML预测半导体良品率——样本缺失值模式分析(Python+Pandas+Matplotlib)
  • Docker中文件修改的三种方法
  • 低代码平台与AI融合:从代码生成到智能开发的技术架构演进
  • 【硬件+APP+云平台】44.1.无线密码锁(PCB版)-基于STM32嵌入式物联网单片机软硬件毕业生系统设计
  • claude常用的cli
  • 想了解实力强的陕西GEO优化流程收费情况?这里有答案!
  • 我对NHibernate的感受(3):有些尴尬的集合支持
  • 三十多个 AI Agent,谁已经凉了
  • 立创EDA 原理图转PCB实战:3步完成转换并解决5类封装错误
  • WebPShop技术方案:Photoshop插件如何填补WebP动画与专业编码的市场空白