本节摘要:智能体不是"更聪明的聊天机器人",而是结构完全不同的东西——它以目标为输入、以行动为输出,在感知、决策、行动的循环里自主推进任务。本节用一个翻车现场讲清两种形态的结构差异,并给出最小对比代码。
上午十点,产品经理把一句话丢进对话框:"帮我把上次评审的意见汇总一下,改掉方案里对应的段落,再把新版发给参会的人。"模型回了一篇情真意切的短文,标题叫《方案优化建议》,然后就没有然后了——评审意见没被读取,文档没有被改动,邮件也没有发出去。模型把它能做的部分(写一篇看起来像回事的总结)做得很漂亮,把它不能做的部分(读取、修改、发送)直接跳过了,甚至没有告诉你它跳过了。
这不是模型的失误,是使用方式的错位:你下的是一个任务指令,它却只被设计成补全一段文本。 智能体要解决的就是这个错位。
把上面那句指令拆开,会看到一次完整的任务执行至少需要这些环节:
聊天形态只覆盖第 1 步和第 3 步的"写"部分;第 2 步和第 4 步是纯行动,文本生成模型根本不参与。智能体的定义由此而来:以大模型为决策中枢,把它包在一个"感知—决策—行动"的循环里,让它能够自主调用工具、依据反馈修正方向,直到目标达成或确认无法达成。
这个循环值得背下来,因为全册的所有组件都挂在它上面:
下面的示意代码不依赖任何具体服务,只为展示结构差异。聊天形态是一次函数调用:
# 形态一:聊天——一锤子买卖,输入文本,输出文本 reply = llm.complete( system="你是一名方案撰写助手", user="帮我把评审意见汇总并修改方案,发给参会人", ) # reply 里是一段文字。文档没被打开,邮件没被发送。 # 模型把"不能做"的部分包装成了"已经说明",任务实际停留在原地。
智能体形态是一个循环,模型在其中反复做决定:
# 形态二:智能体——循环推进,直到目标完成 tools = {"read_file": read_file, "edit_doc": edit_doc, "send_mail": send_mail} messages = [system_prompt(含目标与工具清单), user("汇总评审意见并修改方案后发送")] for step in range(MAX_STEPS): # 步数上限兜底,防止无限循环 reply = llm.complete(messages) # 决策:模型输出下一步动作 action = parse_action(reply) # 解析出 工具名 + 参数 if action.name == "finish": # 模型自己判断任务完成 break observation = tools[action.name](**action.args) # 行动:程序真正执行 messages.append(observation) # 感知:把结果喂回去,供下一轮决策
两段代码的差异不在模型,在结构:循环给了模型"做完一步再看结果"的能力,工具给了它"直接影响世界"的能力。这两个能力合成一样东西——自主执行。
用"帮团队订周四下午的会议室"对比两种形态,把过程走完整。
背景:团队八人,需求是周四 14:00 到 16:00 有投影的会议室,若无空房则改期或改线上。
聊天形态的操作与结果:你把需求发给模型,它输出一段"建议您打开日历系统查看空闲会议室"的说明文字。任务零推进,所有事还是你做。
智能体形态的操作:程序把目标写进循环,模型先后产出如下动作序列——
思考: 需要先查周四下午的空闲会议室。 行动: query_rooms(date="周四", start="14:00", end="16:00") 观察: [{"room":"A302","projector":true}, {"room":"B110","projector":false}] 思考: A302 满足全部条件且有空,直接预订。 行动: book_room(room="A302", date="周四", start="14:00", end="16:00") 观察: {"status":"ok", "booking_id":"BK-2271"} 思考: 预订成功,任务完成。 行动: finish(summary="已预订 A302,周四 14:00-16:00,凭单号 BK-2271")
解读:注意三件事。模型每一步只做了一个小决定,而不是一口气写完整个计划;每个决定都基于上一轮的真实反馈(如果 A302 已被占,思考会走向备选方案);结束是模型自己声明的,且带了可核对的结果。这就是"自主"的确切含义——不是夸张的拟人智能,而是闭环里自己走完多步。
变式:如果需求加一条"优先用离电梯近的房间",要补的不是代码,是目标描述的精度——这个房间位置信息得在 query_rooms 的返回里存在,否则模型只能瞎猜。智能体项目里大量的失败,根子都在"环境里根本没有模型需要的信息"。
| 维度 | 聊天机器人 | 智能体 |
|---|---|---|
| 输入 | 一句话、一段材料 | 一个目标 + 可用的工具与环境 |
| 输出 | 文本 | 一系列动作 + 最终结果 |
| 执行步数 | 一次生成 | 多步循环,步数由任务决定 |
| 出错方式 | 说错话 | 做错事(影响真实系统) |
| 典型延迟 | 秒级 | 分钟级,不可预测 |
| 失败成本 | 用户重问 | 可能产生脏数据、误发消息 |
| 核心工程量 | 提示词调优 | 循环控制、工具设计、记忆、护栏 |
⚠️ 常见坑:把"能对话"当成"能干活"来立项。评估需求时先问一句——这件事的完成标志是"一段文字"还是"一件发生了的事"?后者必须按智能体的工程量来估,两者的人力投入往往差一个数量级。
反过来说,多数需求其实停在聊天形态就够:写周报初稿、解释一段报错、改写营销文案。判断依据有三条:任务是否需要外部信息(模型不知道的),是否需要改变外部状态(写库、发消息),是否需要超过一轮的决策。三条都不沾,就老实用对话接口,成本低、延迟稳、风险小。智能体不是升级包,是另一种架构,用它解决对话问题属于高射炮打蚊子,还容易把自己打着一堆工程复杂度。
下一节我们把"家底"摊开:模型在循环里当决策中枢时,哪些活它干得漂亮,哪些活它其实干不了。