先说结论:调接口确实是Agent开发的全部,就像做菜确实就是把食材放锅里一样。 技术上完全正确,但它完美解释了为什么有人做出米其林,有人做出暗黑料理。
光说结论没意思,我们来实际搭一个Agent走一遍。但在动手之前,先花30秒说清楚Agent到底是什么。
◆先说说Agent到底是个什么东西
大模型最初的交互模式很简单:你问一句,它答一句。一问一答,结束。你想让它做复杂的事情,就得自己把任务拆成一个个小问题,一轮一轮地手动喂给它。本质上你才是那个"编排者",大模型只是一个被动应答的工具。
Agent做的事情说白了就一件:给这个一问一答的模式加了个循环。 大模型不再只回答你一句话,而是自己判断"我还需要做什么",调用外部工具拿到结果,把结果塞回给自己,继续思考下一步该干嘛,直到任务完成为止。这个循环让大模型从一个"应答器"变成了一个"执行者"。
概念上就这么简单。一个while循环,加上tool call的能力,Agent的骨架就搭出来了。所以很多人看完觉得,这也没什么技术含量啊?确实,骨架是简单的,但让这个循环在真实世界里稳定、可靠、高效地转起来,才是真正的工程挑战。
现在我们来实际走一遍。假设你要做一个Agent,功能很简单:帮你管理日程,能读邮件、能查日历、能帮你安排会议。听起来不复杂吧?一步一步来看,每一步会遇到什么。
◆第一步:调通API,十分钟搞定
这一步确实简单。装个SDK,写几行代码,把用户输入丢给大模型,拿到返回结果。如果你用过OpenAI或者Claude的API,闭着眼睛都能写出来。甚至你自己都不需要会写代码,打开Claude Code、Cursor之类的AI编程工具,用自然语言描述一下需求,它们就能帮你把脚手架搭好。再定义几个tool——查日历、读邮件、创建会议——把JSON schema写好,模型就能调用了。
跑起来了,你让它"帮我看看明天有什么会",它调了查日历的tool,返回了结果,还用自然语言总结了一遍。完美。你觉得Agent开发也就这样吧,可能一周就能上线了。
这种感觉我太熟悉了。十年前刚学iOS开发的时候,在Storyboard里拖几个控件就能跑出个App,也觉得移动开发不过如此。
理论上,这些AI编程Agent也能帮你把后面的每一步都做了。但实际上,后面每一步遇到的问题都不是"代码怎么写"的问题,而是"应该写什么代码"的问题。为了让你真正理解Agent开发难在哪,我们一步步往下走。
◆第二步:接真实API,噩梦开始
Demo里你用的是mock数据,现在得接真实的邮箱和日历服务了。每个用户用的可能都不一样,有人用Outlook,有人用腾讯企业邮,有人用飞书。咱们先简化一下,只对接微软家的Microsoft Graph API,毕竟国内能正常访问,Outlook在企业里也算主流。
第一个问题就来了:OAuth。你的用户得授权你的应用访问他们的微软账号,你得在Azure AD里注册应用、处理OAuth重定向、安全存储refresh token、在token过期时自动刷新。这套流程和LLM没有半毛钱关系,但不做的话你的Agent连第一步都迈不出去。光是微软的权限模型(delegated permissions vs application permissions)就够你研究半天的。
然后是API的各种边界情况。Microsoft Graph返回的邮件列表是分页的,默认每页10条,最多50条。你的Agent拿到第一页数据时并不知道后面还有多少页,它会基于这10封邮件给你一个看起来很确定的结论。 比如你问"上周有没有人给我发过关于项目A的邮件",实际上那封邮件在第三页,但Agent很自信地告诉你"没有"。
API的速率限制也是个问题。Microsoft Graph的限流策略比较复杂,按应用、按用户、按资源类型都有不同的阈值,你的Agent如果在一个复杂任务里连续调用十几次,很容易触发429。触发之后怎么办?模型不知道"429 Too Many Requests"意味着什么,它只会觉得工具调用失败了,然后开始瞎猜原因。而且别忘了,这还只是对接了微软一家。真要做成产品,腾讯企业邮、飞书、钉钉每家的认证体系和API设计都不一样,工作量是乘法关系。
而且接入API只是tool call的一半,另一半是tool本身怎么设计。这个问题比你想象的要棘手得多。
你的"查邮件"tool应该设计成什么样?如果设计得很死板,比如只支持按发件人查询,用户说"帮我找上周关于项目A的邮件"就直接歇菜了。那你加上按关键词搜索、按时间范围过滤、按是否有附件筛选?参数一多,tool的schema就变得很复杂,大模型面对一堆可选参数时反而容易填错或者漏填。Berkeley的Function-Calling测试发现,模型面对的工具数量越多、参数越复杂,调用准确率下降得越厉害。Llama 3.1 8B在46个工具时直接全军覆没,但在19个工具时却能正常工作。
反过来,如果你把tool设计得很宽泛,比如搞一个万能的"search"工具,什么都能查,那大模型又不知道该往里填什么了。它可能把日历查询的参数塞进邮件搜索的tool里,或者在该调"创建会议"的时候去调了"发邮件"。tool的粒度太细用户需求cover不住,太粗模型又hold不住,这个平衡点没有标准答案,只能在你的具体场景里反复试。
tool的描述文本也很关键。同一个功能,description写成"Search emails"和写成"Search the user's Outlook inbox by keyword, sender, date range, or attachment presence. Returns a list of matching emails sorted by date",模型的调用准确率天差地别。说白了你不光要写代码实现tool,还得学会"给模型写说明书",而且这个说明书写得好不好,你只能靠反复测试来验证。
阿里云的工程博客有个数据很能说明问题:生产级Agent系统中AI只完成了30%的工作,剩余70%是工具工程。 你以为的"调接口",其实大部分时间都花在了处理接口周围这些设计和适配的活上。
◆第三步:多步骤任务,错误开始滚雪球
好,API接通了,基本能用了。现在来个稍微复杂的需求:用户说"帮我找个下周所有人都有空的时间段,安排一个项目评审会议,然后给所有参会人发邮件通知"。
这个任务需要:查询多个人的日历空闲时间、找到交集、创建会议邀请、草拟邮件、发送邮件。五六个步骤,每一步都依赖上一步的结果。
问题来了。Berkeley的Function-Calling排行榜显示,最好的模型工具调用准确率也只有77.5% 。这意味着每4次调用就有近1次出错。五步任务全部正确的概率?大概是0.775的5次方,不到28%。你的Agent有超过70%的概率在某一步翻车。
更麻烦的是Galileo的研究发现的问题:早期的一个小错误会在后续步骤中不断放大。 假设第一步查日历时模型解析时间格式出了个小bug,把周二理解成了周三,后面所有步骤都在错误的基础上继续。它会在一个不对的时间段创建会议,发给所有人一封时间错误的邮件通知。一个小幻觉触发了一连串错误操作。
这时候你开始意识到,你需要在每一步之间加校验逻辑、加回滚机制、加确认环节。而这些东西,没有任何一个LLM的API文档会教你。
◆第四步:给用户一用,账单先把你吓醒了
前三步你都是自己在开发环境里测的,感觉还行。但你一旦把Agent开放给真实用户,噩梦是从另一个完全没预料到的方向来的:账单。
你之前开发测试用的是Claude Sonnet或者GPT-4o,效果确实好,一个复杂任务跑下来几毛钱,不痛不痒。但真实用户上来之后,每天几百个请求,每个请求平均跑个四五轮tool call,每轮都带着大量的上下文。你一看月底账单,好家伙,一个小功能每月烧掉几千块。如果用户量再涨十倍呢?
这时候你冷静下来想了想:用户说"帮我看看明天有什么会",这种简单查询真的需要动用最强模型吗?杀鸡焉用牛刀。不同的任务用不同的底座模型,这个思路很自然,但实现起来又是一个新的工程挑战。
你得搞一套任务路由机制:先判断用户意图的复杂度,简单查询走便宜的小模型(Haiku、GPT-4o mini、Gemini Flash之类的),复杂的多步骤推理才走大模型。但问题来了,谁来判断复杂度?用大模型来判断?那这个判断本身就要花钱。用规则引擎来判断?简单的case能cover住,但用户输入千变万化,规则总有漏的时候。用小模型来做分类器?那你又多了一个需要调优和维护的模型环节。
而且不同模型的tool call能力差异巨大。你在Claude Sonnet上调通的tool schema,换到Haiku上可能参数就填错了。你在GPT-4o上跑得好好的JSON格式,换到开源模型上可能直接解析失败。每换一个模型,你之前精心调试的Prompt和tool描述可能都得重新适配一遍。 这就是为什么很多团队最后发现,省下来的token钱还不够付多模型适配的人力成本。
成本优化这件事看起来是运营问题,其实是架构问题。你得在最开始就把模型调用层做成可插拔的,而大多数人在写Demo的时候根本不会想到这一层。
◆第五步:上下文管理,你的Agent开始"失忆"
用了一阵子,你发现一个诡异的问题:Agent在执行长任务的时候会"走偏"。你让它处理一个需要七八轮对话的复杂任务,到第四五轮的时候,它开始忘记最初的要求和约束条件。
这就是行业里说的"Agentic Amnesia"。研究数据很明确:当任务被分片到多轮对话中执行时,所有测试模型的性能平均下降39%。
原因在于LLM的上下文窗口是有限的。每一步工具调用的输入输出都在消耗上下文空间。你查了5个人的日历,每个人返回一大堆JSON数据,上下文窗口就被撑满了大半。Spotify的工程团队在做代码Agent时踩过同样的坑:Agent在填满上下文窗口后"迷失方向,几轮对话后就忘记了原始任务"。
这时候你得开始做上下文工程(Context Engineering) 。Anthropic把它定义为"从不断变化的信息宇宙中,精心策展哪些内容放进有限的上下文窗口"。说白了就是LLM版的"内存管理":你得动态决定每一步推理时模型能"看到"什么、该"忘掉"什么。哪些历史信息要压缩成摘要,哪些关键约束必须始终保留,哪些工具返回值可以丢弃。
Manus团队为了搞对这一点,把整个框架重建了四次。你没看错,四次。他们管这个过程叫"随机梯度下降"——不优雅,但是管用。
而且还有一个更隐蔽的坑:研究发现上下文长度和幻觉率正相关。输入越长,模型越容易产生幻觉。对需要大量上下文的Agent任务来说,这几乎是一个无解的结构性矛盾。
◆第六步:想测试?你连怎么测都不知道
到这一步,你的Agent勉强能用了。但你怎么确定它是"好用"还是"凑合能用"?
传统软件开发有成熟的测试方法论:单元测试、集成测试、端到端测试,输入是确定的,预期输出也是确定的。但Agent的输入空间是开放的(用户可以说任何话),输出也是不确定的(模型每次生成的文本都不同)。LangChain的博客一针见血: "每一个输入都是边界情况" ,这是传统软件从未面对过的挑战。
你可能想到用LLM来评估LLM的输出。Hacker News上有位开发者把这个做法的问题说得很清楚:用和被测系统相同架构的Judge来打分,等于最大化了系统性偏差的概率。Judge和被测Agent有完全相同的盲点。
Anthropic今年1月的博客也承认:Agent在多轮交互中调用工具、修改状态、根据中间结果调整行为,正是这些让Agent有用的能力,同时也让它们几乎无法被系统性地评估。
数据层面更直观。LangChain的调查显示只有52%的组织在跑离线评估,仅37%在跑在线评估。一项对12个主要Agent基准测试的分析发现,实验室测试与生产环境之间存在37%的性能差距。所以你在开发环境里测得好好的Agent,到了用户手里可能完全是另一回事。
做过客户端开发的应该特别能理解这种痛苦:你的Agent可能今天完美处理一个请求,明天对同样的请求就失败了。用户能接受功能缺失,但接受不了时灵时不灵。
◆第七步:想加几个Agent协作?复杂度爆炸
你的日程管理Agent做得不错了,你开始想:能不能再加几个专门的Agent?一个负责邮件、一个负责日历、一个负责会议纪要、一个负责总调度。分工明确,各司其职,听起来很合理吧?
微软Azure SRE团队走过这条路。他们最初搭了100多个工具和50多个子Agent的庞大系统,遇到了一堆意想不到的问题:调度Agent找不到正确的子Agent(正确的那个"埋在三跳之外")、一个出bug的子Agent不是自己挂掉就完了而是拖垮整条推理链、Agent之间互相踢皮球形成死循环。最后他们缩减到5个核心工具和几个通用Agent,系统反而更可靠了。
他们总结的核心教训:从一个Agent扩展到五个,复杂度不是增加四倍,是爆炸式增长。 UC Berkeley的MAST框架分析了1600多条Agent轨迹后发现,41-86.7%的多Agent系统在生产中失败,而且79%的问题来自规格定义和协调层面,不是技术实现。Agent之间"怎么分工"和"怎么沟通"比"怎么写代码"难太多了。
◆第八步:你开始怀疑,瓶颈到底在哪
折腾了几个月之后,你的工程做得越来越精细,但Agent的表现总有一个天花板怎么都突破不了。这时候你才意识到一个残酷的事实:所有工程优化都有一个大前提,就是底层模型得够强。
InfoQ对阿里巴巴代码平台负责人的访谈里有一段很真实的话:工程上的挑战还能克服,但模型能力方面的瓶颈更为艰巨。一个尴尬的行业现状是,几乎所有做通用Agent产品的公司都把Claude Sonnet作为首选模型,因为其他模型在复杂任务上的指令遵循差距明显。模型能遵循的指令越多,能处理的问题就越复杂。当模型连基本的指令遵循都做不好时,上层再怎么做工程优化都是白搭。
你可能想,那用推理能力更强的模型呢?o3、o4-mini、DeepSeek R1之类的。研究发现这些推理模型比基础模型更容易产生幻觉。你正是因为任务复杂才选推理模型,但它偏偏在这些场景下更不可靠。这就像你发现应用卡顿,优化了半天代码逻辑,最后发现瓶颈在硬件性能上。你能做的工程优化有边界,边界之外是底层能力的限制。
◆第九步:你开始理解框架之争
走到这一步,你一定纠结过要不要用LangChain、CrewAI之类的框架。Hacker News上的讨论已经从争论转向了共识:框架对做原型有用,到生产环境往往变成负担。
一位法律事务所CTO分享说,他不用任何框架就构建了约900个Agent,只用chat completions加structured output。Anthropic的官方指南也建议谨慎使用框架,因为框架常常让底层Prompt和响应变得不透明,增加调试难度。
但有一点你确实需要框架来解决:持久化执行和状态管理。你的Agent在等用户确认的时候需要暂停,出错了需要从检查点恢复,长任务需要断点续传。大多数轻量级方案没有这些能力,这也是Temporal之类的编排引擎在Agent领域崛起的原因。
说白了,框架选型根本不是Agent开发的核心难点。真正的难点在前面那八步,框架只是工具,工具选错了最多多花点时间,但工程思路错了方向就全错了。
◆回到最初的问题
以上这九步,不是我坐在这里凭空编的。我自己动手做过一个Agent,踩完了上面几乎每一个坑,最后那个项目算是失败了。回头复盘的时候才发现,当初觉得"调接口而已能有多难"的心态,和十年前觉得"拖几个控件就能做App"的心态一模一样。真正让我涨经验的,恰恰是这次失败。
走完这九步你会发现,"调接口"大概只占了整个Agent开发工程量的5%。剩下的95%是:工具层的OAuth和错误处理、tool设计的粒度拿捏、多步骤任务的校验和回滚、成本控制与模型路由、上下文窗口的动态管理、评估体系的从零搭建、多Agent协作的复杂度控制、模型能力瓶颈的工程绕行。
LangChain把这门新学科叫做"Agent Engineering",我觉得很准确。波士顿咨询的调研显示企业Agent项目中不到20%达到了预期ROI,LangChain的调查中32%的企业把"质量不达标"列为Agent上线的首要障碍。这些数字足以说明问题。
Agent与Agent之间的巨大差距,根源不在谁调的接口不同,而在接口之外那95%的工程做得天差地别。 调接口是入门门槛,一周就能跨过去。但从Demo到产品,中间隔着的是一整套关于可靠性、可观测性、上下文管理和错误恢复的系统工程。这才是Agent开发真正难的地方。