平台内部
AI 智能体是怎么学会一项新技能的——顺手还把自己收拾干净
只记得住事实的智能体,每次都得从零把做法重新推一遍。Olano 的智能体会把做法写下来。这篇文章讲的就是背后的工程:反复出现的活儿怎么变成一份可复用的书面流程,智能体怎么在从不覆盖原件的前提下改进一项不是它写的技能,学来的副本怎么在原件被上游更新的那天活下来——以及为什么这一整套都不会悄悄把它本该改进的系统弄糟。
记忆说的是什么是真的。技能说的是活儿怎么干。
关于 AI 记忆的讨论,多数都停在事实上——事实确实值得留住:你的报价、你的升级规则、哪个客户不好对付。这一整套要讲的是 AI 智能体是怎么记住事情的。这确实有用,但它跟胜任还不是一回事。
胜任是流程性的。周一那份报告,得按特定顺序、从特定来源、带着特定的注意事项拼出来。退款咨询,在任何人回复之前要先核对三件事。季度供应商复盘,每次都拉同样那六个数。一个事实记得再全、却没有流程的智能体,每次都会把这些活儿做得略有不同——而你的团队注意到的,正是这种飘。
所以 Olano 的智能体在记忆之外还留着第二类东西:技能。一项技能就是一个小文件夹,里面装着一个 SKILL.md 文件——一个名字、一句话的说明、一个说明何时该用它的触发条件,以及编号的步骤。有些技能随平台附带。有些来自技能包或市场。有些是你自己写的。还有一些是智能体根据自己真正做过的活儿,给自己写的。
这篇文章讲的就是最后这一类。
一项学来的技能是从哪儿来的
智能体每说一轮,都会被追加进一份记录。后台有一道处理按节奏读这些记录——最活跃的节奏设置下每小时一次,最放松的每四小时一次——而且它只读自己还没读过的部分,靠每份记录的字节偏移量来跟踪。没有任何内容会被重复分析,也不会因为两次运行之间文件变长了就漏掉。
从这里开始,这道处理是故意做得很难触发的:
- 新增不到四轮,它什么都不做。 偏移量照样会提交,这样那些轮次不会越积越多,让后面某次运行过度解读。
- 要么跑在深度推理档上,要么就不跑。 没有廉价的退档模型。每个智能体的深度运行都有每日上限——按节奏预设大约是六次、十二次或二十四次——一旦上限或花费预算用完,这一轮就会被跳过、留到下次重试,偏移量保持未提交。降级的分析比没有分析更糟:它会产出一本正经的错流程。
- 记忆正在被重写时,它会让路。 记忆整合那道处理会加锁;蒸馏器看到锁就退开,而不是往一个正在被整体重写的文件里追加内容。
真跑起来的时候,事实先进记忆。之后,如果开着技能学习,同一批轮次会再进第二道处理。
侦察先读技能库,再读对话记录
正是这一步,让学来的技能库不至于变成垃圾场。技能侦察拿到的不是一段对话加一句「你学到了什么?」。它拿到的是一段对话,外加一份清单,列着这个智能体已经有的每一项技能——包括那些托管的、第三方的技能,它们在智能体自己的工作区之外,它的文件工具自己看不到——然后问:还缺什么,如果真缺的话。
它返回的每个候选都带一个动作,而三个动作里有两个根本不会产生新技能:
- skip ——这个能力已经有了。这是最常见的结果,而且是成功。
- update ——已有的某项技能差不多覆盖了,应该磨得更利一些。候选会点名目标。
- create ——确实是新的。只有这时才会真写出一项技能。
新技能接着会走第二道校验:扫一遍有没有几乎重名的,撞上就停手,没撞上就写出一份结构规整、frontmatter 正确的 SKILL.md。如果这道校验跑不完,系统会直接把候选写下来,而不是让它丢掉。
改进一项不是它写的技能
改进才是有意思的情况,因为最顺手的那种实现方式恰好是错的。
你装上的技能不是一份单独的文档。它可能是一本多文件的操作手册:一个 SKILL.md,外加脚本、参考表、表单、模板。而它的所有权在上游——它所属的技能包一更新,那个文件夹就被整体替换。所以,一个靠就地重写来「改进」这种技能的智能体,一下子做错了两件事:它把一本手册挤成了一份摘要,还把自己的改进恰好摆在了下一次更新的路上,而那次更新会悄悄把它删掉。
Olano 改成分叉。智能体第一次改进一项不属于自己的技能时:
- 整个文件夹会被逐字节复制进这个智能体的学习库,内部的路径引用会被改写,好让副本在新位置照样能用。
- 副本沿用原件一模一样的名字,所以智能体加载技能时,副本会遮盖原件,而不是取代它。原件在磁盘上从不被改动。
- 旁边还会写一份来源记录:分叉时源文件的逐文件指纹、同一时刻副本的逐文件指纹,以及原始 SKILL.md 文件的章节结构。
- 起始状态还会另存一份未被动过的快照,以后用作合并的基准。
之后每次改进都以追加的方式落在副本上。由此得到两条就地重写的设计不可能有的性质:「这次改进有没有丢东西?」变成了对着一份记录在案的基线可以查证的问题,而不是两份互不相干的文档之间一次模糊的比对;而「原件在上游变了吗?」则永远答得出来。
保全闸门
谈到会自我修改的系统,人人都担心的那种失效方式是渐进而无声的退化:每过一轮都短一点、淡一点,直到原本管用的东西变成一段空话。承诺「不会那样」不是工程上的回答。
所以每次加载技能时,学来的副本都会对着它自己记录在案的起始状态过一遍。出现下面任一情况就算不过:
- 分叉时存在的某个文件现在不见了;
- 某个正文文件缩到了原大小的一半以下(不到半 KB 左右的文件豁免,因为小文件本来就会大幅变动);
- SKILL.md 文件丢掉了原件三分之一以上的章节标题。
没过的副本会被隔离——它不再遮盖,原件重新上岗。智能体丢的是一次改进,不是一项能用的技能。而且这道闸门是有意只管机器写的副本:人手写的学习技能永远不会被隔离,因为有意的覆盖就算更短也该算数。
原件在底下变了的时候
上游那项技能总有一天会更新——技能包刷新、市场上的更新,或者你团队的一次改动。这时两条线都动过了,而那份来源记录让真正的三方合并成为可能,而不是靠猜。解决是逐文件进行的,而且先用确定的办法:只有在没有确定答案的地方才会去问模型。
| 原件 | 学来的副本 | 会发生什么 |
|---|---|---|
| 没变 | 无论如何 | 保留学来的副本。无事可做。 |
| 变了 | 没动过 | 取上游的新版本,改写它内部的路径引用,并把来源记录重新盖上新的源指纹。 |
| 被删了 | 没动过 | 学来的副本里也删掉。上游删它有其道理,本地也没有相反的意见。 |
| 被删了 | 变了 | 保留学来的副本,并附上一条冲突说明。这个该有人看一眼;在那之前什么都不会被丢掉。 |
| 变了 | 变了——正文 | 对着记录在案的基准做三方合并。干净的合并直接采用。真冲突则保留学来的副本,交给技能库那道处理去做语义上的调和。 |
| 变了 | 变了——脚本或二进制 | 保留学来的副本并做标记。代码从不自动合并:一个静悄悄坏掉的脚本,比一个过时的脚本更糟。 |
之后,指纹和基准快照都会更新到合并后的状态。正是这一点让整个循环收敛:同一处漂移不会被反复报出来,而保全闸门继续对着新的基线工作,而不是对着一个老掉牙的基线。眼下没过闸门的副本会被整个跳过,不参与合并——把一份已经退化的副本再合并回去,等于给它洗白。
对整个技能库来一遍
一项一项地校验技能,和把一个技能库维持得条理清楚,不是一回事。所以另有一道处理,按自己的时间表,读遍这个智能体的每一项技能,把整个集合当作一个工作单元:把重复和近乎重复的合成一份权威版本——最好的名字、最清楚的触发条件、各步骤的并集——删掉被合并走的文件夹,为原件已经漂移的副本重新做合并,并改进留下来的那些。
这条边界是强制的,不是建议:对这道处理来说,原件和托管技能都是只读的。它只能在学习库里面编辑、合并和删除。开始之前,每个它可能碰到的文件都会先拍快照;结束时,它会报告改了什么,并附上一个撤销按钮。
工作区本身也一样对待
智能体自己的配置同样是文字,而几个月里一点一点写出来的文字,积累方式也一样:同一条指示在三个地方有三种说法、某个偏好记进了错的文件、同一条笔记在连续十一天的日志里重复出现,偶尔还有两条悄悄互相矛盾的指示。
这就交给一道工作区整合处理。它会读智能体的身份、行为、指示和长期记忆这几个文件,外加最近两周的每日日志,然后就地重写:把换了说法的重复合起来、去掉矛盾、把相关内容归到清楚的标题下、把内容挪到它真正该在的文件里。每日日志的去重最狠,因为重复在那里积得最快。
它依照的那句指示只有一句话,却挑着全部的担子: 保住智能体的语气和每一条独有的指示;只做归并,绝不删除。 和技能库那道处理一样,每个目标文件都会先拍快照,结果也会带着一键撤销一起报出来。
两套规矩,区别很要紧
这个循环里并不是所有事情都按同一套管,而这种分法是刻意的,不是图省事。
- 改动「交给智能体做什么」这件事,只能是提议。 The pass that reviews recent work and concludes an agent's instructions should be sharper does not edit those instructions. It writes grounded proposals into a review queue, and they wait - even with Fully Autonomous on, which otherwise lets new skills, memory and tidy-ups apply on their own. Nothing rewrites an agent's instructions because a background job thought it should, unless a deployment owner has explicitly lifted that hold for the agent.
- 无损的整理会直接生效,但带快照和撤销。 给记忆去重、把两项一模一样的学习技能并成一项、把重复的笔记归并——这些都不改变智能体做什么,只改变它写下来有多整齐。要是每一件都要人点一下,只会把你的团队训练成不看就批——而那对真正要紧的那个队列来说,是最糟的结果。所以它们在拍完快照之后直接生效,每次运行都会报告改了什么,并带上撤销。
这一切都可以关。每种行为——蒸馏、技能学习、技能库维护、工作区整合、记忆整合——都是一个独立开关,可以按整个部署来设,也可以按单个智能体双向覆盖,所以「除了这一个智能体,其他地方都关」是一种真能配出来的状态。在这些之上还有一个总开关,以及一个单独的选择:按时间表跑,还是只在有人开口时跑。节奏预设——放松、均衡、激进——会把时间表和每日深度推理上限一起挪动,而它们都在同一套 管着这个部署里其他一切的硬性支出控制.
一个完整的循环长什么样
这种复利来得慢,但很具体。你的运营智能体连着三周手工拼出来的那份报告,到第四周已经是一份写好的流程。那项对你的行业来说差一点就合用的技能包技能,既带着你的修正,又照样吸收厂商的下一次更新,而不是被它推平。那份已经长到四页、彼此重叠的指示文件,变成了两页不重叠的——而只出现在被你删掉那一版里的每一句话,都还在你留下的那一版里。
这不是什么
没有任何模型权重被训练、微调或调整。整个循环都运行在模型之上一层,作用在你自己隔离部署里那些用平白语言写成的东西上:技能、记忆条目、指示提议。它们都是文件。你的团队可以读它们、手工改它们、批准它们、回滚它们,并查清谁在什么时候改了什么。
这不是我们绕着走的一个限制。恰恰因为如此,这个循环才是你能管住的东西,而不是你只能去信的东西——也正因为同样的道理, 底下的模型可以换掉,而智能体不会丢掉它学到的东西.
延伸阅读
「平台内部」系列的其余几篇,以及讲得更深的手册章节。
常见问题
技能是什么,它跟记忆有什么不一样?
记忆存的是关于你生意什么是真的——价格、人、决定、偏好。技能存的是一件活儿怎么干:一份简短的书面流程,有名字、有说明、有一个说明何时该用它的触发条件,还有编号的步骤。记忆让智能体不会把同一个问题问你两遍。技能让它不会把同一套流程重新发明两遍、而且每次做得还不太一样。
智能体会把你给它的技能改写掉吗?
不会。来自你、来自技能包或来自市场的技能都是只读原件,从不被编辑或删除。要改进其中一项,智能体会把整个技能文件夹复制进它的学习库,然后改那个副本;副本沿用原件的名字,所以智能体加载技能时它优先。原件在磁盘上毫发无损——正是这一点,让日后上游的更新可以被合并,而不是丢失。
是什么在拦着一项学来的技能退化成一份更差的摘要?
一道在加载技能时运行的保全闸门。学来的副本会对着它自己记录在案的起始状态过一遍:如果某个正文文件缩到了原大小的一半以下、如果原有章节标题少了三分之一以上、或者开头存在的某个文件现在不见了,这份副本就会被隔离,改由原件上岗。这是一道结构性的检查,不是一句承诺——而人手写的副本豁免,因为有意的覆盖照样算数。
原来那项技能日后被更新了,会怎么样?
做一次三方合并,逐文件进行,对着分叉那一刻状态的快照。上游改过、而学来的副本从没碰过的文件,取上游的。学来的副本改过、上游没改的文件,保留。两边都改过的地方,正文会对着共同基准合并,真冲突则交给技能库那道处理去调和。脚本和二进制文件从不自动合并:学来的副本会被保留并做标记,因为一个静悄悄坏掉的脚本比一个过时的更糟。
会不会有什么东西不问我就被改了?
这要看改的是什么,而这种分法是刻意的。任何改变「交给智能体做什么」的事——它的指示、它的行为——都会作为提议写进待审队列,绝不会自行生效。无损的整理——给记忆去重、合并重复的学习技能、归并重复的笔记——可以直接生效,但只在拍完快照之后,而且每一次这样的运行都会报告改了什么,并附上一键撤销。你还可以把这些行为逐项关掉,按整个部署,或者只针对某一个智能体。
这是在用我的数据重新训练一个 AI 模型吗?
不是。没有任何模型权重被训练或微调。这个循环产出的每样东西,都是你自己部署里的一个普通 markdown 文件:一项技能、一条记忆、一份指示修改提议。你的团队可以读它们、比对它们、手工改它们、批准它们,也可以回滚。这种可读性正是关键——它让一个改进循环变成你能管住的东西,而不是你只能去信的东西。
部署一套会把学到的东西写下来的系统
只有底下的活儿是真的,复利才有意义。约一次咨询——我们把流程梳清楚、报个价,等你点头之后才动手。