一个 Agent 拆到底就四件东西:目标、模型、工具、循环。 少一件都不是少一点功能,是整件事换个性质——缺目标它会一直干,缺工具它只能说,缺循环它只走一步, 缺模型它只会照旧执行。 这一节把这四件摆齐,再用一个开关表把每一件拿掉跑一遍。
上一节划了「什么值得做成 Agent」的线,这一节讲「Agent 由什么构成」。 四件的说法在本书里不叫这个名字——教材讲的是智能体的人设、技能、工作流,但底下就是这四件。 名字先记住,后面看平台界面时能对上号。 再往后第 4 章整章讲工作流,第 16 章讲多个 Agent 怎么分工,都是在这四件上做加法。
一、先说不它是什么
Agent 不是更聪明的模型。 上一节已经说过,这里再说一遍,因为这是最贵的误会: 换模型改的是单步质量,改不了它走不走得到终点。 Agent 也不是插件合集。挂十个插件但它不知道该在什么时候用哪个,结果是一边超时一边乱调。 Agent 更不是一段长提示词。 把「你要先查天气再给建议」写进提示词,模型大概率会照做, 但它也可以不照做——提示词是请求,不是保证。
这三样都是零件,不是整机。整机得四件齐全,缺一件就退化成另一种东西。
二、四件:目标、模型、工具、循环
目标说清什么算干完了。这句话写起来最像废话,出事最多。 「帮我整理一下这批简历」——整理成什么样算好?按什么排?缺什么字段要标出来? 模型负责根据当前状态挑下一个动作。 它还缺什么、该用哪个工具、这一步的输出够不够——这三个判断都是它做的。 工具是真正动手的那一下。查天气、读文件、写数据库、发消息,没有工具,模型的手伸不出对话框。
循环允许它再来一次。第一次没做对,能看见、能改、能再验一遍。 这一条是最容易被省掉的,因为它看起来像「重复劳动」。 四件里,目标和循环是设计者定的,模型和工具是平台或供应商给的。 你能改的那两件,恰好是决定成败的那两件。
三、缺一件会怎样
演示里五个组合各跑了一次,症状分得很开。 缺目标:它一直在干,因为没人告诉它什么叫干完了,一直跑到轮数上限。 真机上这表现为「对话停不下来」或者「反复说要确认」。 缺工具:它知道自己该看年限,但手上没有能看年限的东西,只能凭记忆编。 这是所有「一本正经胡说」的根子——不是它想骗你,是它没有别的办法。
缺循环:它排完就交,没有回头确认这一步。排错了也当成功。 真机上表现为「一次比一次自信,但一次都没对过」。 缺模型:动作表写死,第一次碰到不一样的数据就照旧执行。 这其实就是工作流——工作流不是残缺的 Agent,它是另一种东西,靠「不变」换「稳」。
四、第五件:边界
教材在讲完四件之后没停,后面每一章都在补同一件事:它能碰到什么、碰不到什么。 这就是第五件,不属于 Agent 本身,属于它外面那圈: 允许调哪几个工具、单个任务能花多少钱、什么动作必须先问人。 为什么它比前四件还容易被忽略? 因为前四件缺了当场就能看出来,边界缺了要等出事——等到它真的把一封邮件发给全体客户。
所以后面读案例时留意一个细节:每个项目都有一段「发布与授权」。那不是走流程,那是第五件在落地。
五、合起来是一句话
Agent 是一个朝目标自己决定下一步、并且手上有工具能动手的程序。 这句话里有三个词要紧:朝目标(不是朝「把话说漂亮」)、自己决定(不是按脚本)、 能动手(不是只输出文字)。 拿这三个词去量市面上叫「智能体」的东西,能筛掉一大半。剩下的那一小半,才是这本书要教你怎么做的。
也正因为只有这一小半值得做,后面才不用每个项目都上 Agent。 能用工作流说清的,就别让模型猜——这句话第 4 章还会再讲一次。
六、动手 Demo:四件逐个拿掉
写一个带四个开关的跑法:目标、模型、工具、循环,各能单独关掉。 五种组合各跑一次,看最后停在哪一步、停的时候在干什么。
DATA = [('张三', 5), ('李四', 12), ('王五', 3)]
def run(goal=True, model=True, tools=True, loop=True, cap=6):
order = [n for n, _ in DATA]
log = []
for k in range(1, cap + 1):
if not model: # 动作表写死,不看状态
log.append('写死:按固定顺序执行'); break
if not goal: # 不知道算不算完
log.append('接着干'); continue
if not tools: # 手伸不出去
log.append('凭记忆答'); break
yrs = [dict(DATA)[x] for x in order]
if all(yrs[i] >= yrs[i+1] for i in range(len(yrs) - 1)):
log.append('校验通过,停'); break
order = [n for n, _ in sorted(DATA, key=lambda x: -x[1])]
log.append('重排')
if not loop: # 只走一步就交
break
return log
实跑输出:
--------------------------------------------------------------------
四件缺一不可:逐个拿掉看症状
--------------------------------------------------------------------
① 一个最小 Agent 的四个零件
--------------------------------------------------------------------
| 零件 | 管什么 | 本例里长什么样 |
|---|---|---|
| 目标 | 要说清「什么算干完了」,否则循环不知道停 | 把这批简历按年限排好 |
| 模型 | 根据当前状态挑下一个动作 | 看还缺什么,选一个工具 |
| 工具 | 真正动手的那一下 | 读字段、排序、校验 |
| 循环 | 允许它再试一次 | 最多四轮 |
② 四种残缺,各跑一次
--------------------------------------------------------------------
| 缺哪件 | 几步 | 最后一步在干什么 | 结果 |
|---|---:|---|---|
| 四件都在 | 2 | 校验通过,停 | 正常 |
| 缺目标 | 4 | 不知道算不算完,接着干 | 不对 |
| 缺工具 | 1 | 想读字段,但没有工具,只能凭记忆答 | 不对 |
| 缺循环 | 1 | 排序:李四 > 张三 > 王五 | 不对 |
| 缺模型 | 1 | 写死:直接输出原名顺序 | 不对 |
缺目标:它一直在干,因为没人告诉它什么叫干完了——跑到上限才停。
缺工具:它知道自己该看年限,但手上没有能看年限的东西,只能凭记忆编。
缺循环:它排完就交,没有回头确认这一步——排错了也当成功。
缺模型:动作表写死,第一次碰到「不一样的数据」就照旧执行。
! 四件里最容易被省掉的是「目标」,因为写起来像废话;最先出事的也是它。
①第一节那张表是四件的分工。 注意最后一列:目标和循环写的是「最多四轮」「排好」,这两样是设计者定的,不是模型给的。 ②五个组合里只有第一行正常。 其余四行的症状各不相同,这正好说明四件是四个独立开关,不是一件事的四个说法。 ③「缺目标」那行跑满了四轮。它每一轮都在做事,但每一轮都不知道自己为什么要做。真机上这最烧钱。 ④「缺工具」那行只走一步就停。它知道自己该看年限——这句判断它做对了——但手上没有能看年限的东西。 判断对、动作没有,等于零。 ⑤注意「缺模型」那行的措辞:写死、按固定顺序执行。这不是坏掉的 Agent,这是工作流。 它没有错,它只是不拐弯。
30 秒实验
- 给「帮我整理一下这批简历」补三条目标:按什么排、缺字段怎么标、交什么格式。 补完再看还需要 Agent 吗。
- 把你项目里的 Agent 按四件点名一遍。哪一件是空的?空的这一件就是它最近出错的原因。
- 找一个有副作用的动作(发消息、下单、改状态),给它加一道「先问人」。
常见误区
- 「目标可以模糊,模型会自己理解。」模型会按最字面的方式理解,然后稳定地做错。 目标模糊时它不会问你,它会挑一个最省事的解释。
- 「循环次数越多越好。」轮数上限是刹车,不是油门。 大多数任务三轮内该收敛,跑满上限说明目标或工具出了问题。
- 「边界等上线再加。」有副作用的动作,边界必须写在前面。上线后再加,等于先让它在外面跑一圈。
自测三问(点开对答案)
1. 四件里哪两件是设计者能改的? —— 目标和循环。模型和工具通常由平台或供应商给,你能改的是「什么算完」和「允许再试几次」。 2. 为什么「缺工具」会表现成「一本正经胡说」? —— 因为它知道该查什么,却没有查的通道,只能用语言把答案编出来。它不是想骗人,是没别的办法。 3. 「缺模型」为什么等于工作流? —— 因为动作顺序写死了,不看当前状态。工作流就是靠这一点换稳定性的,不是残缺,是另一种取舍。四件摆齐了,接下来要问:模型这一件到底能干什么、不能干什么。 下一节把大模型和 Agent 的分工讲清楚,也把七个已经跑通的行业场景过一遍。
- ☐ (本篇完,下一篇 1.3 Agent 与大模型的关系及应用领域)