智能体:把大语言模型放在决策位置上的程序

智能体

一、定义

智能体是一个程序,它把一个大语言模型放在决策位置上:模型的判断会改变程序接下来执行什么。

这是最小的定义。完整形态通常长这样:你给它一个目标和一组可用工具,它自行决定执行步骤、调用工具,读取执行结果后调整下一步,直到判断目标达成或无法达成。但模型的决策权可以小得多——小到只在两个选项里选一个,它仍然是智能体,只是决策空间很窄。后文会展开这条谱系。

它的核心是模型,但它不等于模型。模型的输出是一段文本或一段结构化请求,这段输出本身不执行任何操作;读到它、并代为读文件、跑命令、发请求的,是智能体这段程序。

模型负责判断,程序负责执行。

二、需要哪些部件

一共四个。其中前两项是必要条件,任何智能体都得有;后两项决定它能走多远——决策空间越宽,越缺不了。

① 处在决策位置的模型(必要)

模型的判断决定程序接下来做什么。多数实现通过 API 调用远端模型,也可以是本地部署的模型。模型是可替换的组件,但换模型往往需要重新调整提示词和输出解析,框架结构可以不动。

② 能作用于外部的工具(必要)

搜索、读写文件、执行命令、调用接口。工具是模型作用于外部世界的唯一途径——模型自己什么也做不了。

③ 结果的回流通路(要做第二次判断才需要)

工具执行的结果以模型可读的形式回到它的上下文里。判断一次就结束的智能体不需要这条;只要模型要做第二次判断,缺了它,模型就无从知道上一步成功还是失败。

④ 纠偏循环(完整形态)

前三项反复进行:模型判断、工具执行、结果回流,然后模型带着新信息再判断一轮。这是完整形态的智能体,也是下文所说「决策空间开放」的那一端。

读取现状 → 判断下一步 → 执行 → 读取结果 → 再判断

图注:纠偏循环与四个部件。黄色为模型判断,它决定后续走哪一步

三、换个角度:智能体是模型的框架

把模型从智能体里拿掉,剩下的部分是框架——一套让模型能力得以作用于真实环境的装置。

模型的能力是潜在的。它知道该怎么排查一个 bug,但读不到你的代码;它能判断某个命令该跑,但按不下回车。框架补的正是这一段。

「做什么」由模型决定。该读哪个文件、该改哪一行、该不该重试、任务算不算完成,框架不代替它判断。但框架握着另外两类权力——它不参与选择做什么,只管模型能看见什么、以及要不要放行:

供给什么。上下文里放什么、放多少、上一步结果保留到什么粒度,由框架决定。模型只能基于它看到的内容判断,看不到的内容等于不存在。同一个模型,回传完整报错栈还是只回传一行 failed,产出差别很大。

放不放行。框架可以拒绝执行某个操作、中断跑偏的循环、在结果回流前先做校验。

选择做什么归模型,供给与否决归框架。这也解释了为什么同一个模型接不同框架,实际表现差别明显。

需要注意,框架放大的是模型已有的能力,不创造模型不具备的能力——弱模型配好框架仍是弱模型。放大也是双向的:一个缺乏中断机制的循环,会把一次误判扩散成大量错误操作。(「放大」是类比,不是可量化的定量关系。)

四、分界线在哪里

许多脚本也有错误处理:重试、降级、备用方案。这些路径在编写代码时就已穷举完毕,运行时只是按条件选分支——判断由代码做出,没有模型参与。

但如果出错时把日志交给模型,由模型判断该走重试还是告警,那它已经是一个智能体了,只是决策空间被限制得很小:模型只能在作者给定的几个选项里选。这和「模型自己想出一个未被写入代码的做法」是同一件事的两个刻度,不是两个物种。

还要再加一道限制:模型参与判断不够,这个判断必须改变后续的执行路径。

一段流水线调用模型给文本打标签,然后按固定步骤入库、通知、结束——模型的判断决定了写进去的值,但没有决定接下来走哪一步,路径是写死的。这是把模型当函数用,不是智能体。反过来,出错时模型判断「重试」还是「告警」,程序照此分叉,路径因模型的判断而不同,这就跨过了那道线。

区别在于模型的输出是填充了某个动作的内容,还是决定了接下来执行哪个动作。前者是参数,后者是控制。

判断标准:运行时的关键决策,是代码按条件选出的,还是模型判断出的?前者是脚本。后者要再问一句:这个判断改变了后续的执行路径吗?改变了才是智能体——决策空间可大可小。

两问都要通过:决策由模型做出,且这个决策改变了执行路径。缺前者是脚本,缺后者是把模型当函数用。

图注:两次判定定性,再看决策空间有多宽

按这个标准,智能体内部存在一条连续谱系。

决策空间极窄:模型在给定选项中选一个。比如出错时由模型判定走重试还是告警。

决策空间中等:模型在给定工具集内自行编排调用顺序。比如按需检索、汇总、生成报告的流程。

决策空间开放:模型自行提出未被写入代码的做法。比如会自己改代码、跑测试、换排查思路的编程助手。

越往后能力越强,可预测性越低。这是同一个权衡的两端,不是优劣。

所以「它是不是智能体」这个问题的价值有限,答案往往是「算」。更有信息量的问题是两个:决策空间有多宽,决策指向什么行动。风险大小取决于这两者,而不取决于它叫什么。

五、适用范围

适合「目标明确、路径不确定」的任务:改代码跑测试、多源资料交叉核对、批量处理文件都符合。路径完全确定的重复任务,用脚本更稳定、更快、成本更低。

另外两个条件——错误代价是否可承受、结果是否可验证——决定的不是能不能用,而是决策空间该开多宽。代价越难承受、结果越难验证,就该把决策空间收得越窄,只在少数节点上交给模型判断,其余写死。默认给到全开放,是把最难控的一档当成了起点。

六、风险

模型自身会出错,且出错时表述同样流畅确信——这是模型的问题,不是智能体特有的。智能体特有的风险在于,框架把这些错误接到了真实环境上。

错误会落地,且不一定可逆。差别在损害发生的时点:错误的文本要等到被人采纳才造成损害,中间留着一道拦截的机会;错误的操作在执行的瞬间损害就已发生——文件已删除、请求已发出、款项已支付。而智能体运转时通常没有人在逐条审阅。

错误会沿循环累积。第三步的错误结论会作为既定事实进入第四步的上下文,后续判断在错误前提上继续推进。模型不会主动怀疑上下文里已有的信息,步数越多偏离越远。

执行路径的可枚举性随决策空间下降。决策空间越开放,运行前越无法列出它会做哪些操作,同一任务两次运行路径也可能不同。窄决策空间的智能体仍可枚举——这也是收窄决策空间的主要收益。你能事先审查的是工具边界和权限,不是执行路径。

它无法可靠判断自己是否完成。「任务完成」同样是模型的判断,而判断完成需要对照客观标准。模型能依据的只有上下文,而上下文里大半是它自己写下的内容——它在用自己的说法验证自己的说法。缺少独立的验证结果,这个判断就没有着力点。

四条对应的约束都在框架层:收紧工具权限,为不可逆操作保留人工确认,设置步数上限与跑偏中断,用可执行的校验(测试、类型检查、diff 比对)替代模型的自我报告。

图注:四类风险与对应的框架层约束手段

结语

模型的判断决定走哪一步,框架决定它能看见什么、被允许做什么。实际拿到的能力和风险,都取决于这两者如何组合。