WikiSkill:将智能体经验编译为持久知识,驱动可验证的技能演化
本手册以原论文正文、图 2/3、表 1–7、算法 1 与附录 E 的系统提示词为依据,在前一版本基础上进一步统一中文术语、收敛重复表述,并严格区分“论文事实”“作者解释”与“专家工程推论”。目标不是做论文摘要,而是把 WikiSkill 的状态设计、知识积累机制、技能更新闭环、实验边界与可复现工程方案讲清楚。
核心结论:真正值得学习的是“经验 → 知识 → 技能 → 验证”的闭环
核心证据
持久 Wiki 知识库的作用有直接消融支持:在 Gemini-3.5-Flash 上,技能提议智能体使用持久 Wiki 后,平均分由 48.7 提升到 63.7。
工程设计
原始轨迹 / Wiki / 技能三层状态,以及“技能可回滚、Wiki 持续保留”的非对称更新,是论文最有复用价值的部分。
尚未解决的生产问题
技能检索、Wiki 裁剪和超长时程在线适应均被论文明确留作未来工作。
| 本手册标记 | 含义 | 使用规则 |
|---|---|---|
| 论文事实 | 正文、表格、算法或附录直接支持 | 可以作为复现依据 |
| 作者解释 | 论文中以 suggest / hypothesize 等措辞提出的解释 | 不能写成已证明的因果机制 |
| 专家推论 | 基于论文结果做的工程化分析 | 明确不是论文原结论 |
术语约定
为提高中文可读性,正文优先使用“智能体、技能、执行轨迹、任务执行、持久知识库、验证门控”等中文名称;模型名、文件名、变量名与 ReAct、SKILL.md、PURPOSE.md 等实现标识保持原文。首次出现时保留必要英文,后文不再重复翻译。
依据:Abstract;§1;§2;§3;§5.1;局限性。
问题定义:论文优化的不是模型参数,而是“技能 + 持久知识库”的联合状态
论文定义数据集 D={(x_i,y_i)},划分为互不重叠的 D_train、D_val、D_test。Agent π 配备工具集 U 与 当前有效技能集合 S,执行得到 trajectory τ_i=(o_1,a_1,...,o_T,a_T),最终通过 领域特定评分函数 f(ŷ_i,y_i)∈[0,1] 评分。
State_k = (S_k, W_k)。论文不是只优化 Skill;它把 当前有效的程序性技能集合 S 与 持久知识库 W 一起视为跨迭代状态。技能集合 S
每个 dataset 都从空集 S_0=∅ 开始演化。Skill 是 基于文件系统的目录模块,核心文件为 SKILL.md。
Wiki 知识库 W
同样从 W_0=∅ 开始,但与技能不同,Wiki 在提议被拒绝时也不会回滚。
依据:§2 问题定义,pp.3–4。
框架总览:执行经验 → Wiki 知识库 → 技能 → 验证
论文真正新增的中间知识层
已有技能演化方法也会执行训练任务、分析轨迹、提出技能更新并进行验证门控。WikiSkill 的关键差别是:把“已经学到的东西”维护成一个独立、持续演化的知识表示,而不是只散落在 提议历史、轨迹局部经验 或 优化器反馈 中。
依据:§1;图 2;§6 相关工作。
三层知识架构:原始轨迹、持久知识与可执行技能采用不同生命周期
| 层 | 论文生命周期 | 主要写入者 | 角色 |
|---|---|---|---|
| Raw | 永久保存 / 只写一次 | Inference 任务执行 | 保存原始执行历史 |
| Wiki | 持续累积 / 不重置 | Wiki 维护智能体 + 外循环编排器 | 把经验组织成结构化知识与审计历史 |
| Skill | 可回滚 / 条件更新 | 技能提议智能体 proposal,经 gate 生效 | 推理智能体 可直接使用的程序性知识 |
logs.md;附录 E.2 的 Wiki 维护智能体提示词却写成 wiki/log.md。这是论文本身的命名不一致。本手册以正文/图示中的 logs.md 为主,并保留该差异提醒复现者。依据:图 2;§3.1,第 4–5 页;图 3;附录 E.2,第 26 页。
推理智能体:训练执行时只注入当前技能,不直接读取 Wiki
第 k 轮,推理智能体 使用 S_{k-1} 执行训练任务。论文把所有 active skill 的完整内容直接注入 系统提示词,而不是进行技能检索 / 触发。这样做是为了隔离“技能本身质量”,避免检索失败成为混杂变量。
依据:§3.2;§3.2.1;§5.1。
Wiki 维护智能体:核心任务是模式归纳、根因分析与证据累积
Wiki 维护智能体 接收当前完整 Wiki context W_{k-1} 与从本轮训练轨迹中抽样的 T_sample,k。它要对失败任务做 根因分析,对成功任务提取有效策略,并增量创建/修改 wiki/patterns/,同时更新索引与演化日志。
| 实现约束 | 论文 / Prompt 的精确设置 |
|---|---|
| 每轮 trace 样本 | 最多 8 条:最多 5 条 failing + 最多 3 条 passing |
| 单条 trace 长度 | 注入提示词前每条轨迹最多保留 15,000 个字符 |
| Pattern 页面 | 描述 + 根因 + trace 中的实际 动作/命令序列 + 具体解决方案/规避策略 |
| Pattern 长度 | Prompt 建议 10–30 lines;只记录 有意义、可泛化的观察 |
| 去重 | 不要创建 重复模式;已有模式应 patch 并追加新 evidence |
| 索引条目 | 必须让智能体只看索引就能判断相关性:问题 + 根因 + 修复方法 |
logs.md 是 Maintainer 维护的分析性演进日志;skill-impact.md 则是在 validation 之后由 外循环编排器 程序化写入 提议元数据、统一差异补丁、验证分数以及“接受 / 拒绝”结果。它更接近客观的干预审计轨迹。依据:§3.2.2;附录 C;附录 E.2。
技能提议智能体:先读索引,再按需读取证据的 ReAct 优化器
Proposer 的输入在公式上是 M_P(W'_k, S_{k-1}, T_train,k)。为避免长执行历史耗尽上下文窗口,它一开始不会获得全部原始轨迹,而是先获得 Wiki 索引、skill-impact.md、全训练任务的简洁 结果摘要,并在 ReAct 过程中用 read_file 主动读取相关 pattern 与 原始轨迹。
| 提示词契约 | 要求 |
|---|---|
| 最少读取轨迹 | 在提出 技能修改 前必须读取至少 4 条 执行轨迹 |
| Proposal 粒度 | 每轮只针对一个技能;操作类型为创建 / 补丁修改 / 不修改 |
| Patch 优先 | 现有 Skill 部分正确时,优先 patch,而不是新建重复 Skill |
| Create 输出 | SKILL.md 包含 YAML 前置元数据、适用条件、不适用条件和执行说明;PURPOSE.md 包含来源、对应模式和演化历史 |
依据:§3.2.3;Appendix E.3,pp.27–28。
验证门控与回滚:只有严格超过历史最好验证分才接受技能修改
S'_k = Apply(S_{k-1}, P_k)
score = R(T_val,k)
if score > R_best:
S_k = S'_k
R_best = score
a_k = Accepted
else:
S_k = S_{k-1} # rollback skill only
a_k = Rejected
W_k = Update(W'_k, P_k, score, a_k) # wiki retained
初始化
在演化开始前先使用空技能集合 S_0 运行验证集,得到基线分数 R_best。
提前停止
如果某轮 R_best=1.0,算法提前结束。
依据:§3.2.4;Algorithm 1。
核心算法:WikiSkill 外循环的最忠实实现骨架
Require: D_train, D_val, metric R, iterations K
S_0 = empty
W_0 = empty
R_best = validate(D_val, S_0)
for k in 1..K:
if R_best == 1.0:
break
T_train_k = rollout(D_train, S_{k-1})
T_sample_k = sample_subset(T_train_k)
W_prime_k = WikiMaintainer(W_{k-1}, T_sample_k)
P_k = SkillProposer(W_prime_k, S_{k-1}, T_train_k)
S_prime_k = Apply(S_{k-1}, P_k)
T_val_k = rollout(D_val, S_prime_k)
if R(T_val_k) > R_best:
S_k = S_prime_k
R_best = R(T_val_k)
accepted = True
else:
S_k = S_{k-1}
accepted = False
W_k = Update(W_prime_k, P_k, R(T_val_k), accepted)
return S_K, W_K
S 是 gated state;W 是持续累积状态。这种非对称性比“多一个 Wiki 智能体”更重要,因为被拒绝的干预仍会进入后续优化上下文。依据:附录 A,算法 1,第 19 页。
实验设置与证据边界:先看数据规模,再判断结论强度
| 基准任务 | 任务类型 | 训练集 | 验证集 | 测试集 | 工具 |
|---|---|---|---|---|---|
| LiveMath | Single-Step 数学推理 | 35 | 18 | 124 | None |
| SealQA | Multi-Step 搜索问答 | 16 | 10 | 85 | web_search, read_file |
| SpreadSheet | Multi-Step 表格操作 | 80 | 40 | 280 | bash |
| OfficeQA | Long-context 文档问答 | 50 | 24 | 172 | glob, grep, read |
| ALFWorld | 多步具身任务 | 39 | 18 | 134 | 可执行动作集合 |
模型包括 Qwen-3.5-4B/9B-Instruct、Qwen-3.6-27B、Gemma-4-31B-It 与 Gemini-3.5-Flash。每种方法的完整技能演化流程独立运行 3 次,表 1 报告 3 组最终技能集合的平均测试表现,并使用 1,000 次配对 Bootstrap 在 p<0.05 下判断显著性/统计并列。
依据:§4.1;附录 B 表 6;附录 C。
主实验结果:五个模型的平均成绩均领先,但不是每个“模型 × 基准任务”都领先
| 推理模型 | 无技能平均分 | 最强已有方法平均分 | WikiSkill 平均分 | 相对 No Skill |
|---|---|---|---|---|
| Qwen-3.5-4B | 26.2 | 35.2 | 38.5 | +12.3 |
| Qwen-3.5-9B | 29.9 | 42.3 | 47.4 | +17.5 |
| Qwen-3.6-27B | 39.4 | 53.3 | 63.3 | +23.9 |
| Gemma-4-31B | 41.3 | 49.1 | 54.9 | +13.6 |
| Gemini-3.5-Flash | 49.5 | 56.1 | 68.1 | +18.6 |
几个显著提升
Gemini-3.5-Flash:LiveMath 33.0 → 72.6,SpreadSheet 50.5 → 76.6;Qwen-3.6-27B:ALFWorld 52.8 → 77.6。
依据:§4.2.1;Table 1。
技能与模型能力:实验支持二者互补,但不能直接上升为严格缩放定律
Qwen 系列
WikiSkill 对 4B、9B、27B 的平均增益随该组模型变大而增加。
技能可部分补偿模型规模
Qwen-3.5-9B + WikiSkill 的平均分高于 Qwen-3.6-27B no-skill。
依据:§4.2.1,pp.8–9。
跨模型技能迁移:技能发现能力与技能执行能力可以分离
需要特别注意的事实边界
需要特别注意:不能把不同基准任务的结果描述成“同一技能同时提升多个任务”。论文是每个 dataset 分别从空 Skill set 演化,所以跨 基准任务 的数字来自同一 源模型 在不同 基准任务 上生成的对应 skill,而不是同一份 SKILL.md。
| Target Model / 基准任务 | No Skill | 自演化技能 | 迁移技能 | Source |
|---|---|---|---|---|
| Qwen-3.5-9B / SpreadSheet | 24.3 | 33.6 | 50.5 | Qwen-3.6-27B |
| Qwen-3.5-9B / ALFWorld | 34.7 | 63.4 | 70.2 | Qwen-3.6-27B |
| Gemma-4-31B / LiveMath | 33.9 | 56.7 | 73.7 | Qwen-3.6-27B |
| Gemma-4-31B / LiveMath | 33.9 | 56.7 | 73.1 | Qwen-3.5-4B |
依据:§4.2.2;Table 2。
负迁移:技能并非天然跨模型通用,论文明确识别了两个主要原因
Qwen-3.5-4B 在 SpreadSheet 上演化出的技能会让 Gemini-3.5-Flash 从 50.5 降到 18.1;而 Qwen-3.6-27B 在同一任务上演化出的技能则把它提升到 63.4。
| 论文 错误分析 明确识别的因素 | 机制 |
|---|---|
| 低层级规避策略 | 例如 单行 Python 命令、字符串转换规则:帮助小模型避免 执行失败,却会限制强模型使用更完整的 端到端脚本。 |
| 碎片化诊断流程 | 引入冗余 工具调用,可能在完成任务前耗尽 Gemini-3.5-Flash 的 交互预算。 |
tested_on_models、能力假设、已知负迁移等兼容性元数据;但这是工程建议,论文没有提出这套字段结构。依据:§4.2.2,p.9;Table 2。
Wiki 消融实验:最直接的证据是持久知识库显著提升技能提议质量
| 推理智能体 Wiki | 技能提议智能体 Wiki | 平均分 | 准确解读 |
|---|---|---|---|
| — | — | 40.4 | 无技能基线 |
| ✓ | ✗ | 45.3 | 论文消融配置;技能提议智能体没有持久 Wiki |
| ✗ | ✗ | 48.7 | 没有跨迭代的持久知识积累 |
| ✓ | ✓ | 60.9 | 技能提议智能体使用 Wiki,同时训练执行智能体也可访问 Wiki |
| ✗ | ✓ | 63.7 | 默认 WikiSkill |
依据:§5.1;Table 3。
技能与 Wiki 演化动态:知识积累并非只在早期有效
技能长度与结构随模型而变化
按模型平均,Qwen 生成的技能较长(118.9–128.6 行),Gemma-4-31B 更短(45.1 行),Gemini-3.5-Flash 为 81.2 行。
不同基准任务的知识复杂度不同
SpreadSheet 的平均技能最长(142.5 行)且模式最多(9.8 个);LiveMath 的技能最短(84.6 行)且模式最少(4.4 个)。
被接受的技能更新不只发生在早期
Table 5 把 被接受的更新 分为 Iter 0–1、2–4、5–7。不同模型早期约占 39%–52%,中后期仍有大量接受更新;SealQA 甚至有 33% 在中期、28% 在后期。
依据:§5.2;表 4;附录表 5。
ALFWorld 案例:被拒绝的技能提议会进入后续优化上下文,而不是模型训练数据
Wiki 维护智能体 识别 take-examine-move-loop;Proposer 创建 goal-directed-action。图 3 中该提议的验证分数为 0.72,因此被拒绝,但差异补丁与拒绝结果仍保留在 skill-impact.md。
Proposer 利用 历史拒绝记录,创建更具体的 break-repetition-loop,其中包含“不要把物品放回原位置”的具体规则;图 3 显示验证分数为 0.78,因此被接受。
Wiki 新增 / 累积 multi-operation-loop 证据;到第 4 轮时,系统又为技能加入“每种操作类型对每个物品只执行一次”的规则,并通过验证门控。
依据:Figure 3;§5.3。
与基线方法对比:关键差异在于是否维护独立、持续演化的知识表示
| 方法 | 论文 Appendix D 的核心机制 | 独立、持续演化的知识表示 |
|---|---|---|
| Trace2Skill | 每条轨迹独立进行成功/失败分析 → 生成局部补丁 → 分层合并 → 验证 | 否 |
| EvoSkill | 候选前沿搜索;使用失败轨迹和扁平的提议反馈历史;候选 SKILL.md 进入有界候选集合 | 否 |
| SkillOpt | ReflACT:执行 / 反思 / 聚合 / 选择 / 更新 / 评估;更新单一技能文档 | 否 |
| WikiSkill | 原始轨迹 → 持久 Wiki → ReAct 技能提议智能体 → 验证门控 | 是 |
依据:§1;§6;Appendix D.1。
调用复杂度与真实成本:O(1) 只表示优化器调用次数,不代表总成本
论文定义的是 优化器 API 调用复杂度 C。WikiSkill 每个批次需要 1 次 Wiki 维护智能体的大模型调用,技能提议智能体大约运行 10 ≤ T_ReAct ≤ 20 个 turn,因此:
C_WikiSkill = (1 + T_ReAct) * N_train / B paper setting: B = N_train => C_WikiSkill = 1 + T_ReAct => O(1) with respect to N_train [optimizer call count only]
依据:附录 D.2;表 7;公式 5。
提示词与文件契约:这是复现 WikiSkill 最值得直接借鉴的工程部分
为什么结构化修改契约比“让大模型直接改文件”更重要
Wiki 维护智能体和技能提议智能体都使用受约束的补丁操作(append / replace / insert_after),其中 replace 的目标必须是精确子串;技能提议智能体每次只修改一个技能。这样可以把大模型的文件修改行为变成结构化、可审计的修改契约。
raw/;Appendix E.3 说明 执行轨迹 物理存储在 raw/traces/,但 Proposer 的 workspace 会把 read_file("traces/<task_id>") alias 自动映射到对应 原始轨迹。依据:Appendix E.1–E.3,pp.24–28。
论文明确局限:作者明确提出的四个未解决问题
| 论文明确限制 | 作者说明 |
|---|---|
| 技能检索 / 触发 未评测 | 实验直接完整注入当前有效技能,目的是隔离技能本身的质量;当技能库规模增大后,技能检索将变得重要。 |
| 严格验证门控 | 只接受立即提升 验证分数 的 proposal,会排除短期中性但可能为后续提升铺路的修改。 |
| 没有 自动 Wiki 裁剪 | 模式页面、日志和提议差异会持续累积,长期运行可能需要自动裁剪。 |
| 没有 超长时程在线适应 | 基准任务虽然包含多步交互和长上下文,但不覆盖数百次动作或持续数小时任务中的单次执行内在线技能优化。 |
依据:局限性,p.14。
专家补充风险:以下是工程审阅结论,并非论文原文结论
| 专家风险 | 为什么值得关注 | 论文证据基础 |
|---|---|---|
| Wiki 知识质量 / 过期模式 | Wiki edits 全部保留;LLM 做 根因分析,长期可能产生错误、过期或冲突知识。 | 论文确认 Wiki never reset,但未提供知识置信度/冲突治理机制。 |
| 自适应验证集过拟合 | 同一个小验证集被连续用于多轮技能提议的门控,因此存在对验证集自适应优化甚至过拟合的风险。 | Val 仅 10–40 个样本;论文讨论 noise,但没有专门研究 自适应过拟合。 |
| 跨模型兼容性 | 表 2 已经出现严重负迁移,说明技能并不是天然与模型无关。 | SpreadSheet:Qwen-4B 演化出的技能使 Gemini 从 50.5 降到 18.1。 |
| Wiki Token 增长 | Wiki 维护智能体每轮读取完整 Wiki 上下文,长期运行后会带来 Token 和延迟压力。 | 依据:§3.2.2,以及论文“没有自动 Wiki 裁剪”的局限说明。 |
生产化 V2 方案:在论文框架上补齐知识治理、检索与多指标门控
Raw = immutable;Wiki history = append-only;Active Wiki view = versioned/governed;Skill = versioned/gated。这样保留 WikiSkill 的知识复利优势,同时避免“错误知识永远激活”。复现与 7 天学习路径:严格按论文真实采样预算完成最小复现
严格贴合论文的最小目录
workspace/
├── raw/
│ └── traces/
│ ├── task_001.log
│ └── task_002.log
├── wiki/
│ ├── index.md
│ ├── logs.md # 主文命名;Appendix E.2 有 log.md 不一致
│ ├── skill-impact.md
│ └── patterns/
├── skills/
│ └── <skill_name>/
│ ├── SKILL.md
│ └── PURPOSE.md
└── eval/
├── train
├── val
└── test读 §2 + Figure 2:只画 (S_k,W_k) 状态机,讲清 Raw / Wiki / Skill 的生命周期。
实现 任务运行器、轨迹记录器、领域评分器;先复现 D_train / D_val / D_test 的分离。
严格按附录 C 的采样预算执行:每轮最多 8 条轨迹(最多 5 条失败 + 最多 3 条成功),每条轨迹最多 15,000 个字符。
实现 Wiki 补丁契约:模式创建/更新、完整重写索引、追加日志;再由外循环编排器独立写入 skill-impact。
实现技能提议智能体的 ReAct 流程:先读取 index / skill-impact,再按需读取证据;提出修改前至少读取 4 条轨迹;每次只创建或补丁修改一个技能。
实现严格 gate:candidate_score > R_best 才接受;失败时只回滚技能,不回滚 Wiki。
复现两个关键实验:技能提议智能体有/无 Wiki 的消融;同一基准任务上的跨模型技能迁移,并记录负迁移。
掌握检查清单与原文索引
- 为什么论文把系统状态写成
(S_k,W_k),而不是只写S_k? - 为什么
skill-impact.md与logs.md的写入者不同?这种分离带来什么审计价值? - 为什么训练执行智能体不应访问 Wiki,而技能提议智能体应该访问 Wiki?其中哪些是实验事实,哪些只是作者假设?
- 为什么 完整技能注入 只是实验控制设置,不能直接当成大规模生产方案?
- 为什么技能提议智能体至少要读 4 条轨迹?为什么 Wiki 维护智能体每轮最多只采样 8 条轨迹?
- 为什么 Qwen-3.6-27B 在不同 基准任务 产生的是不同 skill,不能把跨 基准任务 数字描述成“同一 Skill”?
- Table 1 为什么支持“平均更强”,却不支持“每一个任务都更强”?
- 为什么 Qwen 系列的增益趋势不能直接上升为严格的缩放定律?
- Table 7 的 O(1) 到底只计算了什么?没有计算什么?
- 如果长期运行 1,000 轮,Wiki 的真实性治理、裁剪、检索和验证治理应该如何补齐?
| 主题 | 论文位置 | 建议阅读目标 |
|---|---|---|
| 问题定义 | §2, pp.3–4 | 定义 D、π、U、S、执行轨迹、R、(S_k,W_k) |
| 三层架构 | Figure 2; §3.1, pp.4–5 | 生命周期与文件职责 |
| 四组件 Evolution | §3.2, pp.5–6 | 推理执行 / Wiki 维护 / 技能提议 / 验证门控 |
| 主结果 | Table 1; §4.2.1 | 平均优势与 per-task 反例 |
| 跨模型技能迁移 | Table 2; §4.2.2 | 技能发现与技能执行 / 负迁移 |
| Wiki 消融实验 | Table 3; §5.1 | 持久 Wiki 知识库 的最直接因果证据 |
| Dynamics / Case | Table 4; Figure 3; §5.2–5.3 | 知识与 Skill 如何跨迭代累积 |
| Algorithm | Appendix A, p.19 | 复现 outer loop |
| Splits / Sampling | Appendix B–C, pp.19–21 | 小验证集、最多 8 条轨迹采样、Bootstrap 检验 |
| Optimizer Calls | Appendix D; Table 7 | 理解 O(1) 的限定条件 |
| Exact Prompts | Appendix E, pp.23–28 | 文件结构、补丁契约、至少读取 4 条轨迹 |
页面格式严格遵循《html_UI 设计规范.md》:240px 固定侧栏、900px 内容区、白底 / 米白背景、单一蓝紫强调色,并使用卡片、提示块、标签、层级图、时间线、对比表格与 IntersectionObserver(threshold 0.4)。