Agent Basic / 15
Agent 自进化:不改权重也能持续变强
前面几篇我们讨论了 Agent 的核心组件、工具调用、规划与反思、评估体系。但有一个问题始终没有回答:
Agent 部署上线之后,怎么让它越用越好?
传统软件的答案是人工迭代。但 Agent 系统面对的任务分布不断变化,靠人手动调 prompt 和加工具,迭代速度远远跟不上。这一篇讲的就是:如何让 Agent 在不修改模型权重的前提下,通过运行时机制实现自我改进。
为什么 Agent 需要自进化
模型权重是静态的,但世界在变
一个部署好的 Agent,它的基座模型权重在推理时不会改变。但它面对的环境在不断变化:
- 用户的需求模式在漂移(新的任务类型、新的边界场景)
- 外部 API 接口在更新(参数变化、返回格式变化)
- 业务规则在调整(合规要求、流程变更)
如果 Agent 的行为完全由静态的 prompt + 工具定义决定,它的有效期是有限的。
人工迭代太慢
典型的 Agent 改进循环:
发现问题 → 人工分析原因 → 修改 prompt/工具 → 测试验证 → 部署
这个循环的瓶颈在”人工分析”和”修改”环节。一个复杂的 Agent 系统可能有几十个 prompt 模板和上百个工具,每次调整都需要工程师深入理解上下文。
理想状态:Agent 改善 Agent
自进化的目标是让 Agent 通过使用自己来改善自己:
flowchart LR
A[执行任务] --> B[记录轨迹与结果]
B --> C[分析成功/失败模式]
C --> D[更新经验/工具/策略]
D --> A
这不是 AGI 的自我意识,而是工程上可实现的反馈闭环。
三种自进化机制
在不修改模型权重的前提下,Agent 可以通过三种机制实现持续改进:
flowchart TB
subgraph 自进化机制
EL[经验学习<br/>Experience Learning]
TC[工具创造<br/>Tool Creation]
SP[策略自优化<br/>Strategy Optimization]
end
subgraph 改变的对象
CTX[Context]
TOOLS[Tool Library]
PROMPT[System Prompt]
end
EL --> CTX
TC --> TOOLS
SP --> PROMPT
机制一:经验学习(Experience Learning)
核心思路:把每次任务执行的轨迹结构化保存,下次遇到类似任务时检索相关经验作为 Context 注入。
为什么比 RL 高效?
传统强化学习通过梯度更新来”记住”经验,需要大量样本才能改变模型行为。而经验学习通过上下文学习(In-Context Learning)实现,样本效率高 250-400 倍:
| 方法 | 学习方式 | 所需样本量 | 更新速度 |
|---|---|---|---|
| 强化学习 | 梯度更新权重 | 数千-数万 | 需要训练 |
| 经验学习 | 检索注入 Context | 1-5 个相关案例 | 即时生效 |
差距的来源很直观:In-Context Learning 不需要通过反复试错来”压入”权重,只需要在推理时把相关经验放进 Context 就行。
工程实现流程:
flowchart TD
A[任务执行完成] --> B{执行结果}
B -->|成功| C[提取成功模式]
B -->|失败| D[提取失败原因]
C --> E[结构化保存到经验库]
D --> E
F[新任务到达] --> G[计算任务相似度]
G --> H[检索 Top-K 相关经验]
H --> I[注入 Context]
I --> J[执行新任务]
机制二:从 Tool User 到 Tool Creator
在 12 篇中我们讲过,Coding Agent 的核心优势是”创造工具的工具”。自进化场景中,这个能力可以被系统化:
- Agent 在执行任务时发现现有工具无法完成某个子步骤
- Agent 生成新工具的代码(函数实现 + 参数 Schema + 文档)
- 新工具经过自动化测试验证
- 验证通过后加入工具库,后续任务可以直接调用
能力边界的动态扩展:
初始状态:Agent 拥有工具 {A, B, C}
第 1 周: 发现任务需要格式转换 → 创建工具 D
第 2 周: 发现 API 返回变化 → 创建适配器工具 E
第 3 周: 发现重复模式 → 创建组合工具 F(封装 A+D 的流水线)
当前状态:Agent 拥有工具 {A, B, C, D, E, F}
安全约束是必须的:
新工具不能直接上线。最低限度的安全机制:
- 沙箱执行:新工具只能在隔离环境中运行,直到通过验证
- 权限继承:新工具的权限不能超过创建它的 Agent 的权限
- 人工审批:涉及外部调用(网络、文件系统、数据库)的新工具需要人工确认
- 自动回滚:新工具导致任务失败率上升时,自动禁用
机制三:Prompt/Strategy 自优化
Agent 根据执行结果自动调整自己的系统指令和策略:
保存有效的 few-shot 示例: 当某次执行表现特别好时,将输入-输出对保存为 few-shot 示例,在后续相似任务中自动注入。
自动发现 edge case 处理策略: 当 Agent 在某类任务上反复失败、最终找到解决方案时,将该方案固化为规则:
# 自动生成的策略补丁
当任务涉及日期解析且输入包含中文日期格式时:
- 先用正则提取日期部分
- 统一转换为 ISO 8601
- 再传给下游工具
原因:下游 API 不支持中文日期格式,2024-03 发现,已验证 47 次
System Prompt 的版本化管理: 每次策略变更生成新版本,保留回滚能力:
prompt_v1.0 → prompt_v1.1(+日期处理规则) → prompt_v1.2(+错误恢复策略)
经验库的工程设计
经验学习是三种机制中最通用、实现成本最低的。下面给出具体的工程方案。
Schema 设计
{
"experience_id": "exp_20260715_003",
"task_type": "data_extraction",
"input_summary": "从 PDF 发票中提取结构化字段,含手写备注",
"trajectory": [
{"step": 1, "action": "call ocr_tool", "result": "部分识别失败"},
{"step": 2, "action": "call vision_model", "result": "手写部分识别成功"},
{"step": 3, "action": "merge_results", "result": "完整提取"}
],
"outcome": "success",
"lessons": "含手写内容的 PDF 需要先尝试 OCR,失败后回退到视觉模型",
"context_tags": ["pdf", "handwriting", "invoice"],
"created_at": "2026-07-15T10:30:00Z",
"success_count": 12,
"last_used": "2026-07-20T08:15:00Z"
}
关键字段说明:
task_type:粗粒度分类,用于快速过滤input_summary:任务输入的摘要,用于相似度计算trajectory:执行轨迹,精简到关键步骤lessons:从这次经验中提取的可复用结论context_tags:用于检索的标签success_count:该经验被复用且成功的次数(置信度指标)
检索策略
当新任务到达时,需要找到最相关的历史经验:
相关性得分 = w1 * task_type_match
+ w2 * embedding_similarity(input_summary, new_task)
+ w3 * tag_overlap
+ w4 * recency_score
+ w5 * success_rate
典型权重分配:
w1 = 0.2(任务类型完全匹配给满分)w2 = 0.4(语义相似度是最重要的信号)w3 = 0.15(标签重叠)w4 = 0.1(时间衰减,越近的经验越可能有效)w5 = 0.15(历史复用成功率)
注入方式
检索到 Top-K 经验后,以结构化格式注入 Context:
<relevant_experiences>
## 相关历史经验(共 2 条)
### 经验 1(相关度 0.91,成功 12 次)
任务:从 PDF 发票中提取结构化字段,含手写备注
关键教训:含手写内容的 PDF 需要先尝试 OCR,失败后回退到视觉模型
成功路径:ocr_tool → (失败时) vision_model → merge_results
### 经验 2(相关度 0.85,成功 8 次)
任务:从扫描件中提取表格数据
关键教训:表格识别需要先做倾斜校正,否则行列对齐会出错
成功路径:deskew → table_detect → cell_extract
</relevant_experiences>
注意:只注入 lessons 和关键路径,不注入完整的执行轨迹。完整轨迹太长,会浪费 Context 窗口。
过期与清理
经验不是越多越好。环境变化后,旧经验可能有害:
- 时间衰减:超过 N 天未被成功复用的经验,降低检索权重
- 失败追踪:经验被复用但导致失败时,标记
failure_count - 自动淘汰:
failure_count / (success_count + failure_count) > 0.3时自动归档 - 环境变更感知:当检测到工具定义或 API 接口变化时,标记相关经验为”待验证”
自进化的风险与约束
自进化不是银弹。没有约束的自我修改会带来严重问题。
风险一:错误经验被固化
如果一次侥幸成功的路径被保存为经验,后续类似任务会反复走错误路线。
对策:经验验证机制
- 新经验需要被成功复用 >= 3 次才提升权重
- 失败的经验立即标记,不等积累
- 定期用固定测试集验证经验库中的 lessons 是否仍然有效
风险二:自我修改导致不可预测行为
当 Agent 同时修改了 prompt、工具和经验库,行为可能偏离预期且难以调试。
对策:版本控制 + 回滚
flowchart LR
V1[Version 1<br/>初始状态] --> V2[Version 2<br/>+3条经验]
V2 --> V3[Version 3<br/>+1个新工具]
V3 --> V4[Version 4<br/>prompt调整]
V4 -.->|"评估下降"| V3
- 每次自进化变更生成一个版本快照
- 持续监控关键指标(成功率、延迟、用户满意度)
- 指标下降超过阈值时自动回滚到上一个稳定版本
风险三:能力膨胀超出安全边界
Agent 创建了越来越多的工具,能力范围不断扩大,可能超出设计时的安全约束。
对策:权限不随能力扩展
设计原则:
- 新工具继承创建者的权限,不能获得额外权限
- 工具总数设置上限
- 涉及敏感操作的工具需要人工审批
- 定期审计工具库,清理不再使用的工具
风险四:评估漂移
Agent 自己修改了自己的评估标准(比如调整了”成功”的定义),导致指标看起来在提升但实际质量在下降。
对策:固定外部测试集
- 维护一个人工标注的 golden test set,永远不让 Agent 修改
- 定期用该测试集评估 Agent 的实际表现
- 自进化的内部评估和外部评估独立运行,两者出现偏差时告警
自进化 vs 训练:什么时候用什么
| 维度 | 自进化(运行时) | SFT/RL(训练时) |
|---|---|---|
| 改变什么 | Context / Tools / Prompt | 模型权重 |
| 生效速度 | 即时 | 需要训练周期 |
| 可逆性 | 版本回滚,秒级恢复 | 需要重新训练 |
| 适用场景 | 部署后持续改进、长尾问题 | 大规模行为修正、基础能力提升 |
| 样本效率 | 高(1-5 个案例即可) | 低(需要大量标注数据) |
| 能力上限 | 受限于模型本身的 ICL 能力 | 可以突破原有能力边界 |
| 风险 | Context 污染、经验过期 | 灾难性遗忘、对齐漂移 |
实践中两者配合使用:
- 日常改进用自进化(快、低成本、可回滚)
- 积累足够多的经验数据后,用 SFT 将通用模式”烧入”权重
- 烧入后清理对应的经验库条目,释放 Context 空间
这形成了一个从”运行时适应”到”永久学习”的梯度:
即时适应 ←──────────────────────────→ 永久学习
Context注入 经验库 Prompt修改 SFT RL
(本次生效) (跨会话) (持久化) (权重) (权重)
小结
- Agent 自进化 = 不修改权重,通过运行时机制持续改进
- 三种核心机制:经验学习(改 Context)、工具创造(改 Tool Library)、策略优化(改 Prompt)
- 经验学习的样本效率比 RL 高两个数量级,是最实用的自进化手段
- 自进化必须有约束:版本控制、权限隔离、固定外部评估、自动回滚
- 自进化和训练不是替代关系,而是”快速适应”和”永久固化”的梯度两端
工程上的核心建议:先实现经验库(成本最低、收益最直接),再考虑工具创造(需要沙箱基础设施),最后做策略自优化(风险最高、需要完善的评估体系)。
参考资料
- 李博杰.《深入理解 AI Agent:设计原理与工程实践》第八章. Fixed commit e3883f8c
- Zhao et al. “ExpeL: LLM Agents Are Experiential Learners.” NeurIPS 2023
- Wang et al. “VOYAGER: An Open-Ended Embodied Agent with Large Language Models.” NeurIPS 2023
- Qian et al. “CREATOR: Tool Creation for Disentangling Abstract and Concrete Reasoning of Large Language Models.” EMNLP 2023