先说下事情背景。
众所周知, Agent AI 框架是 Python 的天下,其实是 TypeScript , 然而企业级编程语言的王者 JAVA,却在这个领域坐着冷板凳。
为了使用之前的记了的 Java 生态的工具和运维经验,我最近尝试重构 之前的一个智能体平台,从 Python 框架迁移到 Spring AI 。
由于这次尝试偏向实验性,所以我选择了最新的 SpringBoot 4 和 Spring AI 2.0.0-SNAPSHOT 版本。
关于用 SNAPSHOT 版本的想法,有下面几个原因:
-
• 程序功能不是很复杂,技术栈也都通用 OpenAI 兼容模型 + PgVector -
• 反正也要升级,先 SNAPSHOT 用着,两个月的时间等得起 -
• 从以往 Spring 出品的项目看来,SNAPSHOT 版本的也不会有大问题
实现过程整体都比较顺利,也就是 AI 偶尔 AI 不认识新代码。
下午的时候,在测试自主智能体的时候,出现了一个问题, 后端一直报一个 Tool 工具调用,工具名称不能为空的问题。
好歹也是程序员出身,虽然 Java 异步程序比较复杂,大概了解了出错过程。
交互流程大概是:
-
• 客户端发送消息 -
• 服务端查找知识库,给出方案 -
• 调用工具 -> 分析 -
• 重复上面流程 -
• 返回最终结果
在第二次调用工具的时候,总会出现一个有名字的工具调用,和一个没有名字但是有参数的工具调用。
我第一直觉解决的办法就是,忽略没有名字的工具调用。 但是框架本身很多类不让重写,由于我也不很熟悉,没找到能够自定义的地方。
虽然知道这个是服务端返回的工具调用,我默认以为是 SpringAI 框架或者是我程序的问题, 让 AI 改了几个版本发现没有解决,又手动调试好一会儿。
我当时是用了 qwen3-max 模型,我是实在没想到是模型本身的问题:
-
• 处于直觉对 qwen3 的最强模型的信任 -
• 我的场景还是 Demo 级别,知识库文档和问题都比较简单,而且是写好的场景 -
• 每次失败的情况一致,而且是每次都失败,不符合大模型随机性的问题 -
• 23 年底主力是 glm ,当时测试这类场景已经比较稳定了,经过这两年发展,我不认为模型简单的工具调用会有问题
然而,然而,这个世界总是会打破你的认知。
在我发现 LLM 追踪实现比较麻烦的时候, 我尝试着把模型换成了 deepseek-v3.2, 重新测试竟然正常了。
竟然正常了!!!
现在想了想,可能是我的工具名字是中文的,导致 qwen3 模型识别的不太好。 但是每次都出错,错误都一致,每次都是第二个工具调用出错。
这也是误导我浪费时间调试的主要原因。谁能想到 qwen3-max 能这么稳定的出错。
恍惚间想起来,上半年重构智能体的时候,也出现过类似的问题,重构后每次都出错,我当时还以为是 Agno 的问题, 传的上下文不对,使用 LLM 监控工具发现上下文没有问题。
现在想想可能是阿里云 qwen 的宇宙最强缓存全然我命中了,而且是给了好几版依然能命中错误的缓存。
最后我想说, DeepSeek 能把国外一众厂商打的哭爹喊娘不是没有道理的。
大家开发企业智能体,能用 DeepSeek 就用 DeepSeek 吧,官方的、三方部署的都可以。

