1. 从“会聊天”到“能干活”:这次架构升级到底改了什么
大模型圈子里有个很尴尬的现状:模型在对话框里能跟你聊哲学、写诗、编段子,但一旦让它去操作一个真实系统,比如帮你整理一份跨三个平台的销售报表,它就开始胡言乱语,要么假装完成了,要么给你一段看起来像代码的伪代码。这个问题的根子不在模型“笨”,而在于传统的大模型交互模式本质上是一个“单轮问答机”——你问一句,它答一句,中间没有状态保持,没有工具调用,没有错误回滚。
这次要聊的这套架构升级,核心就解决这一个问题:让模型从“对话参与者”变成“任务执行者”。关键词里的“原生Agent架构”和“OpenClaw集成”,说白了就是两件事——第一,把Agent能力从外挂插件变成模型的原生能力;第二,给这个Agent配上一套能真正操作外部世界的“手和脚”。
我花了大概两周时间,把公开的技术文档、开发者社区的讨论帖、以及几个早期接入团队的实践记录翻了个遍,又自己搭了一套模拟环境跑了几轮测试。这篇文章就把我理解到的架构逻辑、实操要点、以及踩过的坑,完整地摊开来讲。适合谁看?如果你正在做AI应用开发,或者你是一个对“让AI真正干活”这件事有执念的技术人,那这篇内容应该能帮你省下不少自己摸索的时间。
先说结论:这次升级最值钱的地方,不是模型参数又涨了多少,而是它把“规划-执行-验证-修正”这个循环内化到了推理过程中。以前你要用LangChain或者AutoGPT这类框架去搭一个Agent,现在模型自己就能完成大部分编排工作。OpenClaw在这里扮演的角色,是那个“执行层”的标准接口——你可以把它理解成Agent的“手”,负责把模型的决策翻译成对文件系统、命令行、API的真实操作。
2. 原生Agent架构的核心设计逻辑
2.1 为什么“外挂式Agent”走不通了
在聊新架构之前,得先搞清楚旧方案为什么不行。过去一年,市面上主流的Agent实现方式基本是“外挂式”的:你有一个基座模型,然后在外面套一层编排框架,框架负责解析模型的输出、决定调用哪个工具、把工具返回结果再塞回给模型。这个模式能跑通,但问题非常明显。
第一个问题是上下文断裂。外挂框架和模型之间靠Prompt来回传递状态,每一轮工具调用都要把历史记录重新拼进上下文。任务稍微复杂一点,比如需要连续调用五六个工具、中间还有条件分支,上下文就会爆炸。我实测过一个场景:让Agent去整理一个包含200个文件的目录,按类型分类、重命名、生成索引。外挂方案跑到第三轮就开始丢状态,模型忘了自己已经处理过哪些文件。
第二个问题是错误恢复能力差。外挂框架通常只负责“调用”,不负责“理解为什么调用失败”。比如一个文件读取操作返回了权限错误,框架会把错误信息原样丢回给模型,模型看到“Permission denied”之后,大概率会换一个路径重试,而不是意识到“这个目录我根本没有访问权限,应该换一个策略”。这种“不理解失败原因”的重试,本质上是在浪费token。
第三个问题是工具调用的语义鸿沟。外挂框架定义工具的方式通常是JSON Schema,模型需要把自然语言意图翻译成符合Schema的参数。这个翻译过程很容易出错,尤其是当工具参数比较复杂的时候。我见过一个案例:一个文件搜索工具需要传入正则表达式,模型生成的pattern里包含了未转义的特殊字符,导致搜索一直返回空结果,但模型不知道是自己的pattern写错了,以为是文件不存在。
原生Agent架构的思路,是把上面这三个问题在模型层面解决。具体来说,模型在训练阶段就接触了大量的“任务执行轨迹”——不是单纯的问答对,而是包含规划步骤、工具调用、错误处理、结果验证的完整过程。这让模型在推理时能够自然地生成“先做什么、再做什么、如果失败了怎么办”这样的结构化输出,而不是依赖外部框架来编排。
2.2 规划-执行-验证循环的内化机制
原生Agent架构最核心的变化,是推理过程中多了一个“内循环”。传统模型的推理是线性的:输入→推理→输出。原生Agent的推理是循环的:输入→规划→执行→验证→(如果验证不通过)修正→再执行→输出。
这个循环的关键在于“验证”这一步。模型不仅要生成动作,还要生成对这个动作结果的预期,然后拿实际结果和预期做对比。如果对不上,就触发修正逻辑。举个例子:你让Agent“把当前目录下所有.log文件移动到archive文件夹”。模型的规划可能是:第一步,列出当前目录;第二步,筛选出.log文件;第三步,创建archive文件夹(如果不存在);第四步,执行移动操作;第五步,验证移动结果。
在执行第三步的时候,如果archive文件夹已经存在,创建操作会返回一个错误。传统外挂框架会把错误丢回给模型,模型可能重试创建,也可能直接跳过。但原生Agent架构下,模型在规划阶段就已经预判了“文件夹可能已存在”这种情况,它会生成一个条件分支:如果创建失败且错误是“已存在”,则继续执行;如果是其他错误,则终止并报告。这个预判能力,来自于训练数据中大量的类似场景。
验证环节的另一个作用是防止幻觉执行。我见过太多案例,模型声称“我已经完成了文件移动”,但实际上它根本没有调用任何工具,只是在文本里描述了一遍操作过程。原生Agent架构要求模型在每次执行后生成一个“执行凭证”——比如工具返回的实际输出、文件系统的状态变化、或者一个校验和。没有凭证的“完成声明”会被验证环节拦截。
2.3 状态管理与长任务保持策略
长任务的状态管理是Agent架构里最容易被低估的部分。一个任务如果只需要两三步就能完成,状态管理的重要性不明显。但如果任务需要几十步、跨越多个会话、中间还可能被中断,状态管理就成了决定成败的关键。
原生Agent架构在这方面的设计思路,我理解是采用了“分层状态”的策略。最上层是任务级状态,记录任务的总体目标、当前进度、已完成的关键里程碑。中间层是会话级状态,记录当前会话中已经执行了哪些操作、产生了哪些中间结果。最底层是操作级状态,记录每一次工具调用的输入输出和返回状态。
这种分层的好处是,当任务被中断后恢复时,模型不需要重新加载全部历史。它只需要读取任务级状态,就能知道“我进行到哪了”,然后按需加载会话级和操作级的状态。我在模拟环境里测试过一个跨会话的任务:让Agent分三次会话完成一个包含50个步骤的数据处理流程。第一次会话执行到第18步时手动中断,第二次会话恢复后,模型正确地从第19步继续,没有重复执行前面的步骤。
这里有个实操细节值得注意:状态存储的粒度需要根据任务类型调整。对于文件操作类任务,操作级状态建议记录文件的哈希值或修改时间,这样在恢复时可以快速判断文件是否被外部修改过。对于API调用类任务,建议记录请求ID和响应摘要,避免重复调用产生副作用。
3. OpenClaw集成:Agent的“手”是怎么长出来的
3.1 OpenClaw的角色定位与能力边界
OpenClaw在这套架构里的定位,是Agent和真实系统之间的“执行层”。你可以把它想象成一个标准化的“操作接口”,Agent通过它来执行文件操作、运行命令、调用API、管理进程。它的核心价值在于统一了操作语义——不管底层是Linux、macOS还是Windows,不管文件系统是ext4还是NTFS,Agent看到的都是一套一致的操作原语。
这个统一层的重要性,只有在你真正跨平台跑过Agent之后才能体会到。我之前做过一个实验:同一个文件整理任务,分别在Linux和Windows上跑。Linux下用mv命令,Windows下用move命令,路径分隔符还不一样。外挂式Agent需要针对每个平台写不同的工具定义,模型也要学会区分。OpenClaw把这层差异屏蔽掉了,Agent只需要说“移动文件A到目录B”,具体怎么执行由OpenClaw根据运行环境决定。
但OpenClaw的能力边界也很明确:它只负责“执行”,不负责“决策”。什么文件该移动、移动到哪、移动之后要不要重命名,这些决策全部由Agent模型完成。OpenClaw的职责是忠实地执行指令,并返回结构化的执行结果。这个边界划分很重要,它避免了执行层和决策层的职责混淆。
3.2 工具调用的标准化协议
OpenClaw定义了一套工具调用的标准协议,我把它拆解成三个部分来理解。
第一部分是工具描述。每个工具都有明确的名称、功能说明、参数列表和返回值格式。比如文件读取工具,参数是文件路径和可选的编码格式,返回值是文件内容或错误信息。这个描述不是给人类看的文档,而是模型在推理时直接消费的结构化数据。描述的质量直接影响模型调用工具的准确率——参数说明越清晰,模型生成错误参数的概率越低。
第二部分是调用格式。Agent生成工具调用的方式,我观察到的是采用了一种结构化的标记语言,而不是纯JSON。这种格式对模型更友好,因为它在训练数据中出现得更频繁。调用格式里包含了工具名、参数键值对、以及一个可选的“预期结果”字段。这个预期结果字段是原生Agent架构的特色——模型在调用工具之前,先声明它期望得到什么结果,执行层返回后可以直接做对比。
第三部分是结果返回。OpenClaw返回的结果是结构化的,包含状态码、实际输出、执行耗时、以及可能的错误详情。状态码的设计很关键,它把“成功”“部分成功”“失败但可重试”“失败且不可重试”区分开了。模型根据状态码来决定下一步:成功则继续,部分成功则处理未完成部分,可重试失败则调整参数重试,不可重试失败则终止并报告。
3.3 权限控制与安全沙箱设计
让一个AI Agent去操作真实系统,安全问题是绕不开的。OpenClaw在这方面的设计,我理解是采用了“最小权限+沙箱隔离”的双层策略。
最小权限的意思是,Agent默认只能访问明确授权的资源。比如你让Agent处理某个目录下的文件,它就只能访问那个目录,不能跳到上级目录或者系统目录。这个限制是在OpenClaw层面强制执行的,不是靠模型自觉。我测试过尝试让Agent读取一个未授权的路径,OpenClaw直接返回了权限错误,模型收到错误后也没有尝试绕过,而是报告了“无法访问目标路径”。
沙箱隔离则是针对命令执行类操作。Agent可以运行shell命令,但命令是在一个受限的沙箱环境中执行的。沙箱限制了网络访问、系统调用、以及可执行文件的路径。这个设计防止了Agent意外执行危险命令——比如一个格式错误的删除命令,在沙箱里最多只能删掉沙箱内的文件,不会影响真实系统。
这里有个实操建议:在生产环境部署时,建议把OpenClaw的运行账户设置为独立的低权限账户,并且对敏感操作(如删除、覆盖、网络请求)设置二次确认机制。二次确认可以由人工完成,也可以由另一个模型实例完成。我在测试环境里用了一个简单的规则:任何删除操作都需要Agent生成一个“删除理由”,理由不充分则拒绝执行。这个机制拦截了好几次误删除。
4. 实操环境搭建与核心环节实现
4.1 环境准备与依赖配置
要复现这套架构,你需要准备的东西比想象中少。核心依赖就三样:一个支持原生Agent能力的模型接口、OpenClaw运行时、以及一个用来测试的任务环境。
模型接口方面,你需要确认你使用的API版本支持结构化工具调用和状态保持。具体来说,检查三个能力:是否支持在单次请求中返回多个工具调用、是否支持工具调用结果的流式返回、是否支持会话状态的服务端保持。这三个能力缺一不可,否则原生Agent的循环就跑不起来。
OpenClaw运行时的安装,我建议从官方提供的容器镜像开始。自己从源码编译不是不行,但依赖比较多,容易在环境问题上浪费时间。容器镜像的好处是开箱即用,而且沙箱配置已经预置好了。启动命令大概是这样的:
# 拉取运行时镜像 docker pull openclaw/runtime:latest # 启动容器,挂载工作目录 docker run -d \ --name openclaw-agent \ -v /path/to/workspace:/workspace \ -p 8080:8080 \ openclaw/runtime:latest启动之后,你需要配置Agent和OpenClaw之间的连接。配置文件里主要设置三项:OpenClaw的监听地址、认证令牌、以及默认的工作目录。认证令牌建议用随机生成的长字符串,不要用默认值。
任务环境方面,我建议先用一个模拟目录来测试,不要直接上生产数据。模拟目录里放一些不同类型的文件——文本、图片、压缩包、空文件、带特殊字符的文件名。这样可以在安全的环境下观察Agent对各种情况的处理方式。
4.2 第一个Agent任务:从文件整理开始
我选的第一个测试任务是文件整理:让Agent把一个混乱的下载目录按文件类型分类,移动到对应的子目录,并生成一个整理报告。这个任务足够简单,能快速验证基本流程,又包含了规划、执行、验证的完整循环。
任务描述是这样的:“当前工作目录下有一个downloads文件夹,里面混杂了各种类型的文件。请按扩展名分类,创建对应的子目录(文档、图片、压缩包、其他),把文件移动到对应目录。完成后生成一个report.md,列出每个文件的原始位置和新位置。”
Agent的规划输出大概是这样的:第一步,列出downloads目录下的所有文件;第二步,根据扩展名确定每个文件的分类;第三步,检查目标子目录是否存在,不存在则创建;第四步,逐个移动文件;第五步,验证移动结果;第六步,生成报告。
执行过程中,我观察到几个有意思的细节。第一,Agent在第二步之后插入了一个“确认分类规则”的步骤,它把分类结果先列出来,然后自己检查了一遍有没有遗漏或误判。这个自检步骤不是我在任务描述里要求的,是模型自己生成的。第二,在移动文件时,Agent对每个文件都先检查了目标位置是否已存在同名文件,如果存在则自动添加序号后缀。这个处理也是模型自己决定的,我并没有在任务里说明。
整个任务执行了大约40秒,处理了23个文件。生成的report.md格式很规整,包含了文件列表、分类统计、以及执行时间戳。我检查了实际的文件系统状态,和报告里描述的一致。
4.3 复杂任务拆解:多步骤数据处理流水线
文件整理跑通之后,我上了一个更复杂的任务:一个包含数据清洗、格式转换、统计分析、图表生成的数据处理流水线。输入是一个CSV文件,里面有脏数据(缺失值、格式不一致的日期、异常值),要求输出清洗后的数据、一份统计摘要、以及一张趋势图。
这个任务的挑战在于步骤之间有依赖关系,而且中间步骤可能失败。比如数据清洗如果没做好,后面的统计分析就会出错。Agent的规划明显比上一个任务更细致:它把任务拆成了12个步骤,每个步骤都有明确的输入输出定义,并且在关键步骤之间插入了验证点。
执行到数据清洗步骤时,Agent遇到了一个它没预料到的问题:CSV文件里有一列的日期格式混杂了三种不同的写法。Agent最初的清洗规则只覆盖了两种,第三种格式没有被正确处理。验证环节发现了这个问题——Agent检查了清洗后的数据,发现日期列还有不符合目标格式的值。然后它触发了修正逻辑:先分析剩余的不合规值的模式,然后生成了一条补充规则,重新执行了清洗步骤。
这个“发现异常-分析原因-生成修正-重新执行”的循环,是原生Agent架构和外挂式方案最大的区别。外挂式方案在验证失败后,通常会把错误信息丢回给模型,让模型重新生成整个步骤。原生Agent架构下,模型只修正出问题的那部分,前面的步骤结果被保留,效率高很多。
4.4 执行结果验证与日志记录
验证环节的设计,我建议不要完全依赖模型的自我验证。模型自我验证能覆盖大部分情况,但有些错误是模型自己意识不到的。比如文件移动操作,模型验证了“目标位置存在文件”,但没有验证“文件内容是否完整”。如果移动过程中发生了截断,模型是发现不了的。
我的做法是在OpenClaw层面加一层独立的验证。具体来说,对于文件操作,OpenClaw在操作完成后计算源文件和目标文件的哈希值,如果不一致则标记为异常。对于命令执行,OpenClaw记录命令的退出码和标准错误输出,非零退出码或非空错误输出都会触发告警。这层验证的结果会附加在工具返回结果里,模型在验证环节会读取这些附加信息。
日志记录方面,我建议至少记录三个层级的信息:操作级日志(每次工具调用的输入输出)、会话级日志(一个会话内的操作序列和状态变化)、任务级日志(任务的总体进度和最终结果)。日志格式建议用结构化的JSON,方便后续做分析和回放。我在测试环境里用了一个简单的日志聚合脚本,把三个层级的日志按时间线合并,排查问题时非常方便。
5. 常见问题与排查技巧实录
5.1 工具调用失败的高频原因与修复
工具调用失败是实操中最常见的问题,我整理了一个速查表,覆盖了大部分场景。
| 失败现象 | 可能原因 | 排查方法 | 修复建议 |
|---|---|---|---|
| 返回“工具不存在” | 工具名拼写错误或未注册 | 检查OpenClaw的工具注册列表 | 核对工具名,确认运行时已加载 |
| 返回“参数格式错误” | 参数类型不匹配或缺少必填项 | 查看工具描述中的参数定义 | 在任务描述中明确参数格式要求 |
| 返回“权限不足” | 目标路径或操作未授权 | 检查OpenClaw的权限配置 | 调整授权范围或更换操作路径 |
| 返回“执行超时” | 操作耗时超过阈值 | 查看操作级日志中的耗时记录 | 拆分任务或调整超时配置 |
| 返回“结果验证失败” | 实际结果与预期不符 | 对比预期结果和实际返回 | 检查操作逻辑,修正预期或操作 |
其中“参数格式错误”是最容易反复出现的。我的经验是,在任务描述里把关键参数的格式要求写清楚,比如“日期格式统一用YYYY-MM-DD”“文件路径使用绝对路径”。模型看到明确的格式要求后,生成错误参数的概率会大幅下降。
另一个高频问题是工具调用的“幻觉”——模型生成了一个看起来合理但实际上不存在的工具名。这种情况通常发生在任务描述比较模糊的时候。比如你说“处理一下这个文件”,模型可能会调用一个叫“process_file”的工具,但实际上OpenClaw里只有“read_file”“write_file”“move_file”这些具体工具。解决办法是在任务描述里明确列出可用的工具,或者让OpenClaw在收到未知工具调用时返回一个包含可用工具列表的错误信息。
5.2 状态丢失与上下文溢出的处理
状态丢失通常发生在长任务中,尤其是当任务跨越多个会话或者中间有长时间等待的时候。我遇到过一次:一个任务在执行到第30步时,因为等待一个外部API的响应超时了,会话被中断。恢复后,模型从第1步重新开始执行,导致前面的操作被重复执行。
排查这个问题的关键是检查状态存储的持久化配置。原生Agent架构的状态默认是存在内存里的,会话结束就丢了。要支持跨会话恢复,需要把状态持久化到外部存储。OpenClaw的配置里有一个state_persistence选项,可以设置为file或database。我建议至少设置为file,把状态写到本地磁盘。
上下文溢出是另一个常见问题。当任务步骤很多时,即使有状态管理,模型在单次推理中能看到的上下文也是有限的。我的处理策略是“按需加载”:模型在每一步只加载当前步骤需要的信息,而不是把全部历史都塞进上下文。具体实现上,可以在任务描述里定义一个“上下文窗口”参数,告诉模型每一步最多参考多少条历史记录。我测试下来,对于大多数任务,保留最近10条操作记录加上任务级状态摘要就足够了。
5.3 性能调优:减少无效循环
原生Agent架构的一个潜在问题是“过度思考”——模型在规划阶段反复推敲,或者在验证阶段反复检查,导致任务执行时间过长。我遇到过一个极端案例:一个简单的文件重命名任务,模型规划了8个步骤,其中3个是重复的验证步骤。
减少无效循环的方法有几个。第一,在任务描述里设置明确的“完成条件”。比如“当所有文件都移动到目标目录后,任务即完成”,这样模型就知道什么时候该停止,不会无限验证下去。第二,设置最大步骤数限制。OpenClaw的配置里可以设置max_steps参数,超过限制后强制终止任务并返回当前状态。我一般设置为预估步骤数的1.5倍。第三,对于重复性操作,建议在任务描述里说明“批量处理”,让模型生成一个循环结构而不是逐个操作。比如“把所有.txt文件移动到docs目录”比“把a.txt移动到docs,把b.txt移动到docs,把c.txt移动到docs”要高效得多。
5.4 安全边界:哪些操作必须加人工确认
即使有沙箱和权限控制,有些操作我还是建议加人工确认。第一类是不可逆操作,比如删除文件、覆盖文件、清空目录。第二类是外部副作用操作,比如发送邮件、提交表单、调用支付接口。第三类是大规模操作,比如移动超过100个文件、修改超过50条数据库记录。
人工确认的实现方式可以很灵活。简单的方式是在OpenClaw层面拦截这些操作,返回一个“待确认”状态,然后通过一个独立的确认接口来放行。复杂一点的方式是引入一个“审批Agent”,由另一个模型实例来评估操作的风险等级,低风险自动放行,高风险转人工。我在测试环境里用的是简单方式,配置了一个确认白名单,白名单内的操作自动执行,白名单外的操作需要手动确认。
这里有个经验:确认机制不要设计得太重,否则会严重影响Agent的实用性。我的做法是只对“不可逆”和“大规模”两类操作做确认,“外部副作用”类操作通过沙箱限制来管控,不单独做确认。这样在安全和效率之间取了一个平衡。
6. 这套架构适合什么场景,不适合什么场景
6.1 高价值应用场景分析
从我这段时间的测试和观察来看,原生Agent架构在几类场景下价值最明显。
第一类是重复性高的文件与数据操作。比如定期整理目录、批量重命名、格式转换、数据清洗。这类任务的特点是步骤明确、规则清晰、但手动做很耗时。Agent可以一次性配置好规则,之后自动执行。我帮一个做数据分析的朋友配了一个每日数据清洗的Agent,原来他每天要花40分钟手动处理,现在Agent自动跑,他只需要检查一下报告。
第二类是跨系统的信息聚合与同步。比如从多个来源收集数据、汇总到一个地方、生成统一格式的报告。这类任务手动做的话,需要在不同系统之间来回切换,容易出错。Agent可以按顺序调用各个系统的接口,把结果汇总处理。我测试过一个场景:从三个不同的数据源拉取销售数据,合并去重,生成一份日报。Agent执行了大约2分钟,手动做的话至少需要20分钟。
第三类是需要条件分支的复杂流程。比如根据文件内容决定后续处理方式、根据API返回结果决定重试还是终止、根据数据质量决定是否触发告警。这类任务的逻辑用传统脚本写会很冗长,用Agent来做则很自然,因为模型本身就擅长处理条件逻辑。
6.2 当前阶段的局限性
但也要清醒地看到,这套架构目前还有明显的局限。
最大的局限是对模糊任务的规划能力还不够稳定。如果任务描述本身就有歧义,模型生成的规划可能偏离你的预期。比如你说“整理一下这个项目”,模型可能理解为整理文件结构,也可能理解为整理代码格式,还可能理解为整理文档。这种歧义在人类之间可以通过追问来澄清,但Agent目前还不太会主动追问。我的应对策略是在任务描述里尽量具体,把“整理”拆解成明确的子任务。
第二个局限是长任务的稳定性还有提升空间。虽然状态管理机制已经比较完善,但在任务步骤超过50步之后,模型偶尔会出现“忘记目标”的情况——执行到后面几步时,生成的操作和最初的目标不一致。我测试过一个80步的任务,在第60步左右出现了目标漂移。目前的缓解办法是在每10步插入一个“目标回顾”步骤,让模型重新确认当前进度和剩余目标。
第三个局限是对非结构化环境的适应能力有限。如果操作环境本身很混乱——比如文件命名没有规律、目录结构频繁变化、API返回格式不稳定——Agent的执行成功率会明显下降。这类环境目前还是需要人工先做一轮规范化,再交给Agent处理。
6.3 从实验到生产的落地建议
如果你打算把这套架构用到生产环境,我的建议是分三步走。
第一步,从只读任务开始。先让Agent做信息收集、数据分析、报告生成这类不修改系统状态的任务。这一步的目的是验证Agent的规划能力和执行准确性,同时积累日志数据,了解模型在你这个特定领域的表现。
第二步,引入受控的写操作。在只读任务稳定运行一段时间后,开始让Agent执行文件移动、格式转换、数据写入这类操作。但一定要加上前面说的确认机制和沙箱限制。这一步的重点是观察Agent在遇到错误时的恢复能力,以及验证安全机制是否有效。
第三步,逐步扩大授权范围。当受控写操作的稳定性和安全性都得到验证后,可以逐步扩大Agent的权限。但扩大的过程要渐进,每次只增加一类操作或一个目录,观察一段时间再继续。我见过一些团队一上来就给Agent全盘权限,结果出了几次误操作之后又全部回退,反而浪费了时间。
最后分享一个我在实操中总结的小技巧:给Agent的任务描述里加一句“在执行任何不可逆操作之前,先输出你的操作计划和预期结果,等待确认后再执行”。这句话看起来简单,但能拦截大部分因为规划错误导致的误操作。模型在输出计划的过程中,有时自己就能发现逻辑问题并修正。这个“输出即检查”的机制,比事后验证要高效得多。