跳转至

Agent开发问题

约 1296 个字 预计阅读时间 4 分钟

1.调通API

你可以安装SDK写几行代码,把用户输入丢给大模型,拿到返回结果。如果是OpenAI的API,直接使用Cursor等工具,用自然语言描述需求,就能把脚手架搭好,然后你可以自定义几个tool,把JSON schema写好,模型就能调用了。

2.接真实API

Demo里用的是mock数据,现在得接真实数据了。

第一个问题是OAuth。

然后是API的各种边界情况。

API的速率限制也是个问题。如果你的Agent在一个复杂任务里连续调用十几次,很容易触发429(too many requests)。

接入API只是tool call的一般,tool本身怎么设计,tool schema和tool call result怎么写,这个问题不是那么容易的。Berkeley的Function-Calling测试发现,模型面对的工具数量越多、参数越复杂,调用准确率下降得越厉害。tool的粒度太细用户需求cover不住,太粗模型又hold不住,这个平衡点没有标准答案,只能在具体场景中反复测试。

tool的description也很关键,或者说是最为关键的,这是给模型调用工具的说明书。

生产级Agent系统中AI只完成了30%的工作,剩余70%是工具工程。

3.多步骤任务

当面对一个多步骤的复杂任务时,Agent可能会有灾难式的表现。

Berkeley的Function-Calling排行榜显示,最好的模型工具调用准确率也只有77.5%。这意味着每4次调用就有近1次出错。一个五步任务全部正确的概率?大概是0.775的5次方,不到28%。你的Agent有超过70%的概率在某一步翻车。

更麻烦的是Galileo的研究发现的问题:早期的一个小错误会在后续步骤中不断放大。 假设第一步查日历时模型解析时间格式出了个小bug,把周二理解成了周三,后面所有步骤都在错误的基础上继续。它会在一个不对的时间段创建会议,发给所有人一封时间错误的邮件通知。一个小幻觉触发了一连串错误操作。

这时候你开始意识到,你需要在每一步之间加校验逻辑、加回滚机制、加确认环节。而这些东西,没有任何一个LLM的API文档会教你

4.成本问题

对于简单请求,我们的想法是用简单模型,而对于复杂任务,应该用高级模型。不同的任务用不同的底座模型,这个思路很自然,但实现起来是一个很大的工程挑战。

你需要一套任务路由机制:先判断用户意图的复杂度,简单查询走便宜的小模型,复杂的多步骤推理才走大模型。但是这个复杂度谁来判断?又如何判断?

而且不同模型的tool call能力不同,tool schema也不适配,每换一个模型,之前精心调试的prompt和tool description可能都得重新调整。

5.上下文管理

为了解决Agent遗忘的问题你需要进行上下文工程,说白了就是LLM版的“内存管理”:你得动态决定每一步推理时模型能“看到”什么、该“忘掉”什么。

还有一个坑:研究发现上下文长度和幻觉率正相关。

6.测试

OK,现在Agent勉强能用了,那么如何确定它的效果呢?

传统软件开发有成熟的测试方法论:单元测试、集成测试、端到端测试,输入是确定的,预期输出也是确定的。但Agent的输入空间是开放的(用户可以说任何话),输出也是不确定的(模型每次生成的文本都不同)。LangChain的博客一针见血:"每一个输入都是边界情况",这是传统软件从未面对过的挑战。

而且实验室测试和生产环境之间可能差距甚大。

7.多Agent

多Agent之间如何沟通?如何分工?这些问题可不是那么简单。多Agent并不一定优于单Agent。

8.瓶颈

底层大模型是Agent能力的瓶颈,当上述步骤都解决后,Agent的上限来自于底层大模型的能力。

9.框架选择

框架只是工具,不是必需,Langchain,CrewAI等常常使底层prompt和响应变得不透明,增加调试难度。重点在于前面的工程思路。

10.总结

Agent与Agent之间的巨大差距,根源不在谁调的接口不同,而在接口之外的工程做得天差地别。 调接口是入门门槛,一周就能跨过去。但从Demo到产品,中间隔着的是一整套关于可靠性、可观测性、上下文管理和错误恢复的系统工程。这才是Agent开发真正难的地方。

11.Reference

agent与agent之间的差距很大,但agent开发不就是调接口吗?agent开发的难点是什么呢?