智能体面试准备(六十九):智能体长期经验库与可复用技能(Skill)沉淀工程
引言
本篇是「工程实战深化」系列的第 69 篇(智能体线)。上一篇(六十七)讲了反思与自我修正:智能体在单次任务里发现错误、回退、重试。但反思是「当场纠错」,经验随任务结束就丢了。真正能越用越聪明的智能体,得把每次任务里的成败沉淀成跨任务可复用的长期经验,甚至把高频成功流程固化成可调用的技能(Skill)。
本篇把「经验库 + 技能沉淀」讲透:为什么需要、复盘(AAR)闭环怎么设计、经验怎么表示与去重、Skill 怎么从经验里合成、运行时怎么检索注入。建议和(六十七)反思、(四十一)记忆架构、(六十一)上下文工程一起看,串成「短时反思 → 长期记忆 → 经验沉淀 → 技能固化」的完整链路。
1. 为什么单靠反思不够:从当场纠错到长期积累
单次反思 (六十七) 长期经验库 (本篇) ┌──────────────┐ ┌──────────────────────┐ │ 任务内发现错误 │ │ 任务结束抽取经验 │ │ 回退重试 │ ──沉淀──▶ │ 存经验库(向量+结构化) │ │ 结果丢弃 │ │ 下次任务检索复用 │ └──────────────┘ │ 高频流程→合成 Skill │ └──────────────────────┘ 问题: 同样坑踩第二次 收益: 同类任务越做越快越准两类记忆要区分(呼应四十一):
- 会话记忆:单次任务内的上下文、中间结果,任务结束可清。
- 长期经验:跨任务沉淀的「什么场景用什么打法、什么坑别踩」,可长期保留、检索复用。
经验库解决的是「组织/个人踩过的坑和验证过的打法,别再从头踩」。
2. 复盘闭环(AAR):经验从哪来
经验不是凭空写,而是任务结束后自动跑一轮After-Action Review(行动后复盘):
任务完成/失败 ──▶ AAR 抽取 │ ├─ 目标: 任务要什么? ├─ 结果: 成了/败了?指标如何? ├─ 关键决策: 走了哪条路径(用了哪些工具/子Agent)? ├─ 为什么: 成功因什么?失败因什么? └─ 可复用点: 哪段流程值得固化?哪个坑要标注?AAR 本身可由一个「评审智能体」基于任务轨迹(trace)生成结构化经验,减少主智能体负担,也避免主智能体自评偏差。
3. 经验怎么表示:结构化 + 向量双索引
一条经验最好同时有「能被检索读懂的结构」和「能被语义匹配的特征」:
经验记录 Experience ┌──────────────────────────────────────────┐ │ id: exp_2026xxxx │ │ type: success_pattern | failure_lesson │ │ | tool_usage | domain_knowledge│ │ scene: 触发场景(标签+自然语言描述) │ │ precondition: 适用前提(何时有效) │ │ conclusion: 结论/打法(怎么做/别怎么做) │ │ evidence: 来源任务id、成功率、频次 │ │ confidence: 置信度(按被验证次数加权) │ │ embedding: 场景描述的向量(语义检索用) │ └──────────────────────────────────────────┘经验类型对照:
| 类型 | 含义 | 例子 |
|---|---|---|
| success_pattern | 验证可行的打法 | 「RAG 先重排再生成,幻觉降 30%」 |
| failure_lesson | 踩过的坑 | 「超长 PDF 不分块直接塞会超上下文」 |
| tool_usage | 工具用法诀窍 | 「某 API 分页要用 cursor 不是 offset」 |
| domain_knowledge | 领域事实 | 「该类工单需先查订单状态再退款」 |
4. 经验去重、合并与置信度
经验库会膨胀,必须治理:
- 去重:新经验 embedding 与库内比对,相似度超阈值视为同一经验,合并而非新增。
- 合并即投票:同结论被多次验证 → confidence 升高;出现反例 → confidence 降,甚至标记「已过时」。
- 衰减:长期未被引用或场景已变的经验降权,避免误导。
- 冲突处理:成功模式与失败教训对同一场景冲突时,保留带证据、置信度高的一方,另一方标注待复核。
# 伪代码:经验写入与去重defadd_experience(new_exp,store):sims=store.semantic_search(new_exp.embedding,top_k=3)forold,scoreinsims:ifscore>0.92andold.type==new_exp.type:# 合并: 累加证据、提升置信度old.evidence.append(new_exp.source_task)old.confidence=min(1.0,old.confidence+0.1)old.conclusion=reconcile(old.conclusion,new_exp.conclusion)returnold.idreturnstore.insert(new_exp)# 真正新增5. 可复用 Skill 合成:从经验到能力
当某条 success_pattern 被反复验证、且是一段固定多步流程,就值得固化成 Skill——一个可被主智能体直接调用的「子能力 / 工具」:
高频 success_pattern: "处理退款工单 = 查订单状态 → 校验退款资格 → 调退款API → 发通知" │ 出现 ≥ N 次且成功率 > 阈值 ▼ 合成 Skill: refund_ticket(order_id) - 入参/出参定义 - 内部步骤脚本或子 Agent prompt - 注册到工具清单, 主智能体可 function calling 直接调Skill 的两种形态:
- 脚本型:把流程写成确定性代码(API 编排),最稳最快(呼应五十五工程化交付)。
- 提示型:把流程写成强约束子 Agent prompt,处理非结构化输入。
合成原则:高频 + 高成功 + 低风险才固化;低频或易变的流程保留为经验文本,让主智能体临场决策,别过度固化。
6. 运行时检索与注入:经验怎么被用
经验库的价值在「用」。运行时,主智能体在规划/执行关键节点检索相关经验注入上下文(呼应六十一上下文工程):
当前任务上下文 ──▶ 检索 query (场景+目标) │ ▼ 经验库 top-k (按 embedding + 置信度 + 场景匹配) │ ▼ 注入 system/working memory: "同类任务曾验证: ..., 注意: ..." │ ▼ 主智能体决策时参考, 避开已知坑、复用验证打法注入要克制:只取 top-k 高置信经验,控制 token 占用,避免上下文被经验淹没(呼应六十一预算)。
# 伪代码:运行时经验检索注入defretrieve_for_task(task_ctx,store,k=3):q=embed(f"{task_ctx.goal}|{task_ctx.scene}")hits=store.search(q,top_k=k*3)# 过滤: 场景匹配 + 置信度门槛 + 未过时filtered=[hforhinhitsifh.confidence>0.6andnoth.expiredandscene_match(h.scene,task_ctx)]returnfiltered[:k]# 仅取最相关 k 条注入7. 与反思、记忆的关系(面试串讲)
- 反思(六十七):任务内当场纠错,无状态残留。
- 记忆(四十一):跨会话的「事实/状态」存储。
- 经验库(本篇):跨任务的「打法/教训」,带置信度与可检索。
- Skill:经验的高频固化形态,从「知道」变成「能调」。
链路:反思纠正 → 记忆留存事实 → AAR 抽经验 → 高频经验合成 Skill → 下次任务检索注入。四者分层,缺一不可。
面试速答
- 为什么需要经验库?单靠反思是当场纠错、经验随任务丢;经验库让成败跨任务沉淀复用,越用越聪明。
- 经验怎么表示?结构化(类型/场景/前提/结论/置信度)+ 向量双索引,既能读懂又能语义检索。
- 怎么防经验膨胀?写入时语义去重合并、按验证次数加权置信度、长期未用衰减、冲突保留高证据方。
- Skill 什么时候合成?高频 + 高成功 + 低风险的固定多步流程,固化成可调用工具/子 Agent,别固化易变流程。
- 经验怎么被用?运行时按场景检索 top-k 高置信经验注入上下文,参考避坑与打法(克制注入控 token)。
- 和反思/记忆区别?反思当场纠错无残留;记忆存事实状态;经验库存跨任务打法;Skill 是经验固化。
高频追问清单
- 经验库和 RAG 知识库有什么区别?(经验库存「打法/教训+置信度+场景」,知识库存「事实/文档」,索引与更新逻辑不同)
- AAR 用主智能体还是独立评审智能体?(建议独立评审体,避免自评偏差、减轻主链路负担)
- 经验置信度怎么初始化和衰减?(初始中值,按被验证成功+升、反例-降,长期未引用衰减)
- 过度固化 Skill 有什么风险?(流程变时 Skill 过时、僵化,应保留低频流程为文本经验临场决策)
- 经验注入会不会污染上下文、误导决策?(会,故设置信度/场景门槛、top-k 限制、可溯源标注来源任务)
- 多智能体下经验库共享还是各 Agent 私有?(公共打法共享,私有领域知识隔离,靠权限与命名空间控制,呼应二十一多租户)