☰
从大模型调用到AI Agent:核心循环、工具调用与任务拆解实战
2026/10/21 7:35:58 网站建设 项目流程

1. 今日学习目标:到底什么才算Agent

今天是我开始系统学习AI Agent的第四天。前三天基本是在搭环境、跑通一些简单的LLM调用,说实话那时候对Agent的理解还是模糊的——总觉得"能调大模型API"就是Agent了,后来才发现这个想法有点天真。

今天给自己定的目标很明确:搞清楚"Agent到底是什么、和普通的大模型调用有什么区别"。这个搞不明白,后面做任何项目都会跑偏。如果你也正卡在"模型调用我会了,但Agent不会写"这个阶段,这篇应该对你有用。

先说结论:Agent和我之前理解的"调用大模型"完全不是一回事。大模型本身只是一个会说话的脑子,但Agent是一个能行动的个体。它需要主动感知环境、做规划、调用工具、检查结果、在失败时自我修正。简单说,普通API调用是"你问它答",Agent是"你给它目标,它自己想办法做完"。

我在学习过程中发现,很多初学Agent的人最大的误区就是:把Agent等同于"Prompt写得好的大模型"。这是不对的。一个真正意义上的Agent,至少需要具备三种能力:任务拆解、工具使用、和自我纠错。今天的内容,就是围绕这三个能力逐项击破。

2. 核心概念梳理:模型、工具、循环

2.1 大模型只是Agent的"大脑",不是全部

今天学的最重要的一件事,就是把"大模型"和"Agent"这两个概念彻底分开。大模型(比如常见的GPT系列或者开源模型)本质上是一个概率生成器,它根据你输入的文本,预测下一段最合理的文本是什么。它能写诗、能写代码、能回答问题,但它不能自己去查天气、不能自己调用支付接口、不能自己打开网页——它做的事情只有一件:生成文本。

Agent是在这个大模型外面包了一层"身体"和"手脚"。这个身体包含:目标理解模块、任务拆解模块、工具调用模块、记忆模块,以及一个关键的循环控制机制。大模型在这个架构里负责"思考",而其他模块负责"行动"。

我用一个生活化的例子来理解这件事:大模型像是一个聪明但坐在轮椅上的咨询顾问,他知道很多事情,但你让他帮你倒杯水,他是做不到的,因为他的手和脚不在。而Agent是一个配备了秘书、司机、和行动力的完整团队——秘书负责理解你的需求(Prompt解析),司机负责带路(工具调用),团队成员负责执行(代码执行、API调用),整个团队围绕一个目标协同工作。

2.2 Agent的两种主流范式:Code-first和JSON-first

今天把Agent的实现方式也梳理了一遍。当前业界做Agent的框架不少,但底层范式和交互格式主要分两种。

第一种就是现在特别火的Code-first范式。典型代表是Code Interpreter那种模式。它的思路是:让大模型生成代码(Python为主),然后在沙箱环境里执行这段代码。遇到文件操作、数据分析、图像处理这类任务,这个模式特别好用,因为代码本身就是一种极强的"工具语言"。我试了一下,让Agent帮我分析一个CSV文件、统计各列相关性、画分布图,它用这个方式做得又快又好,中间完全不需要我手动干预。

第二种是JSON-first范式,也可以理解为工具调用(Function Calling)模式。它的思路是:预先定义好一堆工具函数,每个函数有名字、有参数schema,大模型输出一个结构化的JSON,里面指定要调用哪个工具、传什么参数。然后程序解析这个JSON,执行对应函数,把结果再传回给模型。这种方式思路清晰、易调试,适合需要精确控制工具调用的业务场景。

这两种方式各有优劣。Code-first灵活性强,因为代码能表达的逻辑远比结构化JSON丰富;但正因如此,它需要更谨慎的沙箱隔离,不然模型生成的恶意代码(或者无意写出的危险操作)可能会造成安全问题。JSON-first虽然灵活度低一些,但它每个动作都可预期、可审计,在金融、客服这类合规要求高的场景里更稳。我现在两个都在学,但个人感觉先理解透JSON-first对入门更友好,因为它的每个环节都是显式的,更容易建立正确的Agent心智模型。

2.3 Agent的核心循环:思考-行动-观察

明确了模型和工具的关系之后,就会自然进入Agent最核心的机制:循环。今天花了大把时间理解这个,越看越觉得这是Agent的灵魂所在。

这个循环用一句话概括就是:Agent拿到目标 -> 先思考(想一下该做什么) -> 再行动(调用工具或生成回复) -> 观察结果(看到工具返回了什么) -> 再思考(判断下一步) -> 如此往复,直到目标达成。

我第一次看到这个循环的时候,第一反应是:这不就是一个while循环套大模型调用吗?但真去做的时候才发现,"如何判断该不该终止"、"什么时候该换方案"、"同一件事试几次就该放弃"这些问题,全是学问。最经典的例子是模型在循环中调用一个API失败了,它需要判断是重试一次(可能是网络抖动),还是换一种方式调用(可能是参数格式错了),还是直接跟用户说"这事做不了"(可能是根本没有权限)。这种判断逻辑,就是Agent和普通程序最大的区别。

光有循环还不够,真正让Agent"聪明"起来的是它在每次循环后能积累信息、调整策略。这涉及到了记忆机制。今天接触到的记忆分两层:短期记忆(对话历史)和长期记忆(向量数据库或外部存储),但今天只是开了个头,后两天专门深入这个方向。

3. 实操记录:从零搭建一个带工具调用的Agent

3.1 工具选择与准备

今天没有直接上框架,因为我想先通过裸写代码的方式,把Agent的核心循环"手搓"一遍。这个建议给所有初学者:先别急着上现成的Agent框架,先用最简单的代码把原理跑通,后面用框架时才不会觉得是在黑盒操作。

我准备的环境很简单:Python 3.10 + OpenAI SDK(因为手头有可用的API key),再加上一个天气API做演示工具。为了不暴露真实key,我把密钥写在了环境变量里。这里有个小坑想提醒一下:绝对不要把你自己的API key硬编码在代码里提交到Git仓库,我见过好几个人因为这个把key泄漏出去、账单被打爆的。

先定义一个简单的工具函数,用来查询城市天气。为了演示方便,我用爬虫去请求了一个公开的天气接口,返回JSON格式的天气信息。这一步本质上是在给Agent准备"手和脚"——模型本身没有这个能力,但它通过函数调用可以间接获得。

然后我写了一个核心的循环函数,伪代码逻辑大概是这样的:先把系统提示词和用户问题拼起来,发给大模型,指定可用的工具列表;如果模型返回的是正常的文本回复,说明任务完成,直接输出;如果模型返回的是一个tool_call请求(里面包含函数名和参数),就解析出来、执行对应的真实函数、把执行结果当作一条新消息再塞回对话列表,然后继续循环调用。

这个代码第一次跑通的时候,说实话有点激动。你会看到控制台上一次次地打印"Step 1: model called get_weather"、"Step 2: function returned..."、"Step 3: model produced final answer"。这个过程就像看着一个小机器人在自己思考、自己行动、自己检查结果。

3.2 工具调用失败的常见情形

今天在写这个循环的时候,至少踩了三个坑,挨个说一下吧,这些在官方文档里都不一定写得清楚。

第一个坑是模型返回了tool_call,但参数是空的或者格式不对。比如我定义的get_weather函数要求传一个"location"字符串参数,但模型有时候会传一个空字符串,或者把参数名写成"city"。这时候如果程序不做校验,直接往函数里传,轻则报错,重则函数拿到脏数据返回一种错误的天气结果。解决办法是在执行工具前加一层参数校验和格式化,检查必填字段是否存在,不存在的话可以尝试模糊匹配或直接让模型重新生成。

第二个坑是无限循环。如果模型在某个步骤里始终无法得出最终结论,或者调用工具之后返回的结果反复让它不满意,它就会一直在循环里打转,白白消耗token。我在测试时遇到过模型对同一个城市连续调了五次天气接口,原因就是它第一次拿到的是一个异常值(比如温度为零下99度),它觉得不对劲就又查一次,结果每次都一样,它就卡住了。解决方式是要在循环里加一个最大迭代次数(比如5次),超过了就强制终止,并向用户输出当前进度和未完成的原因。这是做Agent工程时一定要有的保险丝。

第三个坑是忘记把工具调用本身也存进历史消息里。有几次我实现循环时,调用完工具之后只把工具返回的结果放进历史,没有把"模型发起的tool_call"这个动作本身也放进去。结果就是模型缺少了"我为什么调用这个工具"的上下文,下一步的推论变得莫名其妙。正确做法是:一条完整的对话历史应该交替包含——用户消息、模型思考/调用动作、工具返回结果,这三者缺一不可。

3.3 实测效果与消耗评估

跑通基础循环之后,我做了一个小测试:让Agent完成一个复合任务——"查询北京和上海今天的天气,然后告诉我去哪个城市适合户外跑步"。这个任务需要两次工具调用,然后结合结果做一次推理判断,对检验Agent能力还是比较合适的。

整个执行过程一共产生了7条消息:用户消息1条、模型第一次tool_call一条、工具返回1条、模型第二次tool_call一条、工具返回1条、模型总结回答一条。整个过程消耗了大约4200个token,耗时大概9秒。作为参考,如果只是直接用模型回答这个问题(不调用工具),token消耗会少得多,但模型会提示"我无法获取实时天气数据"。这就是工具调用的价值所在——多花的token换来了真实有效的信息。

这个测试给我的直观感受是:Agent的能力边界在"能不能拿到数据",而不是"会不会推理"。工具调用本质上是在给模型接上数据源,让它的推理有据可依。

4. 关键技术突破:让Agent具备"任务拆解"能力

4.1 从单工具调用到多步骤规划

跑通了"单次工具调用"之后,我尝试了一个难度更高的场景:让Agent完成一个需要多步骤才能做完的任务。我这里选的任务是:"帮我查一下某个城市的天气,并基于天气情况生成一份两天的旅行建议,包括是否适合出行、需要带什么衣服。"

这个任务表面上看着不复杂,但仔细一拆,里面至少有四个子任务:查天气、判断天气是否适合出行、根据天气推荐衣物、把建议整理成一段可读的文本。如果一次全部塞给模型,它很容易丢三落四,或者只做其中一两步就草草了事。

于是今天学到的另一个关键点浮出水面:任务拆解。让模型在动手前先把大目标拆成几个步骤,然后一步步执行。这个过程在学术上叫Planning(规划),是Agent区别于普通对话系统的核心能力之一。

4.2 实现方法:让模型先"想清楚再干"

在代码实现上,我采用了业界常见的做法:在Prompt里明确要求模型——如果任务复杂,请先输出一个Plan,然后再一步步执行。用系统提示词给模型设定思考框架。我用的提示词大致是:如果用户请求需要多个步骤,请先用"计划:"开头列出步骤,然后每次只执行一个步骤,完成一步后再继续下一步。

效果非常明显。模型接到任务后,先在回复里打出类似"计划:1. 查询目的地天气 2. 根据天气判断出行适合度 3. 根据气温推荐衣物 4. 输出完整建议"这样的内容,然后严格按照计划执行。每完成一步,它都会把进度更新到对话里,这样整个Agent的行为变得透明可控。

不过我也注意到一个值得警惕的现象:模型在某些步骤之间会有"跳步"倾向。比如查完天气后,它可能会直接跳到"建议带上短袖",而跳过了"判断出行适合度"这一步。这是因为模型天然倾向于"快速给结论"。要抑制这种现象,需要在每一步之间都强制要求工具调用结果的引用,且不要让模型在单条回复里同时做多个推理步骤。这算是实际调Prompt时的一个小窍门。

4.3 拆解失败的场景复盘

当然,不是所有任务模型都能拆解好。我试着让它处理一个模糊指令:"帮我安排一下周末。"这个指令的歧义太大了——是要安排学习计划?旅行计划?还是朋友聚会?模型在拿到这个指令后,拆解出来的步骤五花八门,而且每个步骤都在反问用户问题,最终一个步骤也没真正执行下去。

这个测试让我想明白了一个事情:Agent的规划能力上限,很大程度上取决于任务描述的清晰度。模型拆解能力再强,也需要用户在发起任务时提供一个定义良好的目标。如果目标本身模糊,Agent就会陷入两种状态——要么反复询问细节,要么按自己的假设执行导致结果偏离预期。这也解释了为什么好的Agent应用都有"任务向导"功能,其实就是通过表单逐步收窄目标范围,让用户的模糊需求变得可执行。

这里也引出一个更深的体会:做Agent应用时,不要把所有的智能都寄托在模型身上。预先定义清楚的任务模板、固定流程、条件分支,依然是工程上最可靠的手段。模型擅长的是在你搭好的脚手架上做判断,而不是凭空给你建一座楼。

5. 上下文工程的入门:Agent如何"记住"前面说过的话

5.1 Token耗尽与记忆裁剪问题

前面几轮的实操中,我其实已经遇到了一个隐蔽但致命的问题:上下文越来越长,模型开始"忘事"。

做Agent的时候,每一轮循环都会把新增的消息追加到对话历史里。任务复杂一些之后,光是历史消息可能就有几十条。但大模型的上下文窗口是有限的——当前主流模型的上下文窗口可能很大,但它昂贵且总有个上限。一旦超出限制,就需要做"截断"或"压缩",而截断一旦处理不当,模型就会忘记用户最初的目标是什么。

我在一次测试中让Agent完成一个五步任务,跑到第四步的时候,模型突然问了一句:"请问您最初想让我做什么来着?"——这明显是上下文太长了,最初的用户指令被挤出了有效窗口。这个场景在真实使用中特别常见。

5.2 解决思路:精简历史与关键信息固化

针对这个问题,今天学到的方案有两种。

第一种方案是历史消息裁剪。简单来说就是从对话历史中删掉一些不重要的中间步骤,只保留最新的几轮关键交互。但这种方案有个明显的隐患:如果被删掉的中间步骤恰好对当前步骤有参考价值,模型就会丢失部分推理依据。更好的做法是保留每轮工具调用的核心信息(做了什么、结果是什么),而把模型的推理过程文本截断或总结。

第二种方案是把用户最初目标固定在系统提示词里。这个方法真的是简单又有效,确保用户的目标在每一轮循环中都出现在模型能够看到的最前面,相当于在工作台上钉了一张便签,告诉模型"你原始的任务是这个,别跑偏"。这两个方法不仅可以同时用,而且配合起来效果非常稳。

这里还要多说一句:做Agent应用的时候,上下文管理不是"功能增强",而是"必备基础设施"。如果这一层没做好,Agent做得再聪明也会在长任务的某个阶段突然"失忆",用户体验会非常崩塌。

5.3 一个实用的小技巧:结构化信息摘要

在实验过程中,我还试了一个自己觉得特别好用的技巧:在每轮工具调用之后,不直接把原始的工具返回结果塞进对话,而是让模型先用几句话把返回结果里的关键信息提炼出来,再把摘要写进上下文。

比如天气接口返回的原始JSON有50个字段,我让模型只提取"温度、湿度、风力、降水概率"这几项,整理成一句"当前温度25度,湿度60%,东南风3级,降水概率20%",然后存进历史。这样下一轮循环中,需要处理的token数量大幅减少,而且模型对关键信息的注意力也更集中。

这个方法其实是在模拟人做笔记的行为——人在处理复杂任务时不会把每一条原始信息都记在脑子里,而是会提炼成要点。把这种"结构化摘要"机制加入Agent循环后,整个系统的效率和鲁棒性都提高了不少。这是今天实操中我觉得最值得记下来的一个经验。

6. 今日学习总结:我的Agent能力地图

四天学下来,到目前为止我在Agent方向上已经可以画出一张能力地图了。今天结束后我对Agent的理解发生了根本性的变化:它不是一个花哨的聊天机器人,而是一个需要精心设计状态管理、工具接口、循环控制和上下文管理的系统工程。

我现在掌握的:大模型基础的调用方法、Function Calling的实现逻辑、Agent循环的搭建思路、简单任务拆解的Prompt设计、基础上下文管理的方法。这些构成了Agent开发的最小可用知识集。

还欠缺的:记忆的长期化和向量检索、多Agent协同、复杂业务场景下的异常处理与补偿机制、以及Agent评测与成本控制的方法论。这些将是接下来几天的重点目标。

给同样在自学Agent的朋友一个建议:不要追求一开始就做出完美的产品,先把一个最简单的循环跑通、观察它的行为、拆解它的失败原因。这个过程会让你建立起对Agent最直观的体感,这比看十篇架构文章都管用。学到第四天的这一刻,我觉得自己终于摸到了一点门道——Agent真正难的不是"让它动起来",而是"让它在复杂、真实、动态的环境中可靠地完成任务"。这后面还有很长的路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询