SkeMex 方法详解
问题形式化:基于记忆的 MDP
SkeMex 将医疗推理建模为一个带记忆的马尔可夫决策过程。状态空间包含患者数据、临床知识、当前推理上下文;动作空间包括工具调用、信息检索、推理步骤、最终决策。与传统 LLM Agent 不同,SkeMex 在状态中引入了一个可演化技能记忆库 M:
M = {m_i | m_i = (k_i, c_i, u_i), i = 1, …, |M|}
其中每个技能单元 m_i 包含:
- k_i(检索键):语义嵌入向量,用于在检索时与查询匹配
- c_i(技能内容):结构化过程性知识,包含情景触发器 + 临床步骤 + 预期结果
- u_i(效用分数):基于历史环境反馈的统计量,反映技能的实际帮助程度
记忆库按抽象层次分为三个独立分支:
- General (M_gen):跨任务的通用推理策略、临床基本原则
- Task-Level (M_task):特定临床类别模式(鉴别诊断、治疗方案、检查规划等)
- Action-Level (M_act):操作层知识(参数格式化、搜索查询构建、工具调用序列)
目标是在不更新模型权重 θ 的前提下,通过环境交互持续优化 M,使累计任务奖励最大化。
组件一:READ —— 价值感知检索
做什么
在每个推理 episode 开始时(t=0),从三分支技能库中检索最相关的技能,作为 Prompt 上下文注入 LLM。
关键机制
1. 临床类别路由(Clinical Category Routing) 首先从查询中提取临床类别标签 κ(如”鉴别诊断”、“治疗方案”),用于后续的分支权重分配和优势估计基线选择。
2. 多通道筛选 检索评分综合考虑三个信号:
score(m_i, query) = α · sim(k_i, q) + β · u_i + γ · decay(t − t_last_use)
- 语义相似度 sim(k_i, q):查询嵌入与技能检索键的余弦相似度
- 效用驱动偏置 β·u_i:历史表现好的技能优先检索
- 记忆强度衰减 γ·decay(Δt):基于艾宾浩斯遗忘曲线的衰减项,近期使用过的技能获得额外偏置,防止有用技能因暂时未触发而被遗忘
3. 分支均衡 Top-K 选择 从三个分支分别取 top-(K/3) 个技能,确保不同抽象层次的技能都有代表进入上下文,防止某一分支(通常是内容最多的 Action-Level)垄断检索结果。
为什么这样设计
- 单次检索(t=0 only):保持推理稳定性,避免中途动态修改上下文引入不一致
- 多通道融合:纯语义检索会忽略技能的实际效用——一个语义相似但历史上总是帮倒忙的技能不应排名靠前
- 记忆强度衰减:模拟人类记忆的”用进废退”规律,防止长期未使用的有用技能被噪声淹没
组件二:WRITE —— 轨迹到技能的蒸馏
做什么
episode 结束后,将模型完整的推理轨迹(思考、工具调用、最终结果)蒸馏为一个或多个结构化技能,写入相应分支。
关键机制
1. 门控轨迹缓冲(Gated Trajectory Buffer) 先过滤掉三种低质量轨迹:
- 基础设施错误:API 超时、网络故障、格式解析错误等——这些与推理质量无关
- 机械重复:连续多次相同工具调用无新信息——纯浪费
- 平凡成功:单步即可完成的标准操作——不需要技能化
保留两种高价值轨迹:
- 信息性失败:推理逻辑正确但因知识缺口或判断失误而失败
- 多步推理链:需要多个推理步骤和专业判断的复杂临床场景
2. 双通道蒸馏引擎
Analysis Pass(分析通道):
- 从保留的轨迹 τ 中抽取可复用模式 z_τ
- 判断操作意图:
- CREATE:发现全新模式,需创建新技能
- PATCH:与现有技能语义重叠,仅需局部更新
- NONE:无新信息,跳过
- 指定目标分支(General / Task / Action)
Mutation Pass(变异通道):
- CREATE 路径:生成完整技能草案,包括情景触发器、临床步骤序列、预期结果
- PATCH 路径:定位目标技能,生成局部 diff 更新
3. 双重质量门
- Novelty Gate(新颖性门):计算候选技能与库中现有技能的语义重叠度。超过阈值则拒绝 CREATE、重定向为 PATCH,防止技能库膨胀
- Quality Gate(质量门):验证技能内容包括明确的”情景触发器”和具体的”临床步骤”。抽象空泛的”最佳实践”式技能被拒绝
为什么这样设计
- 门控缓冲先过滤再蒸馏:避免浪费 LLM 调用在低质量轨迹上
- 双通道复用 LLM:Analysis Pass 和 Mutation Pass 使用同一个 LLM(部署时已有),无需额外模型
- CREATE vs PATCH:防止技能库的同质化膨胀——与其创建 10 个相似技能,不如不断打磨一个高质量技能
组件三:ASSESS —— 效用驱动的评估
做什么
根据环境反馈,更新被采纳技能的效用分数 u_i,使高质量技能获得更高权重、低质量技能被逐步淘汰。
关键机制
1. 窗口级优势估计 不使用单样本奖励,而是在一个评估窗口(如 100 个 episode)内计算优势:
A_τ = r_τ − ̄r(κ)
- r_τ:当前 episode 的环境奖励(如诊断准确率、方案合理性)
- ̄r(κ):临床类别 κ 的指数移动平均基线奖励
这样做的意义:一个 r_τ = 0.7 在平均基线 0.8 的困难任务中是负优势,但在平均基线 0.5 的简单任务中是正优势。窗口级估计消除了任务难度带来的方差,使效用反映的是”技能相对于同类任务的额外贡献”,而非任务的绝对难度。
2. 信用分配规则
| 技能状态 | 优势 A_τ | 效用更新 |
|---|---|---|
| 已采纳 + 正优势 | A_τ > 0 | u_i ↑(增加) |
| 已采纳 + 负优势 | A_τ < 0 | u_i ↓(减少) |
| 检索到但未采纳 | 任意 | 不更新 |
| 未被检索到 | 任意 | 不更新 |
核心原则:只对被实际使用的技能进行信用分配。“检索到但未采纳”意味着模型虽然看到了这个技能但选择不使用——不应对其进行奖惩。
3. EMA 更新 效用更新使用指数移动平均:u_i ← λ·u_i + (1−λ)·A_τ,λ 通常取 0.9~0.95,使效用反映长期平均表现而非单次波动。
为什么这样设计
- 避免”沾光”效应:未采纳技能不因好结果受益,防止技能库中积累大量”搭便车”的平庸技能
- 窗口级估计消除难度方差:如果按单样本评估,高难度任务中几乎所有技能都会收到低分,导致系统性低估
- EMA 平滑:单次 episode 的运气成分不会剧烈改变技能评估
组件四:GOVERN —— 记忆库治理
做什么
定期(如每 N 个 episode)对技能库执行维护操作,防止无限增长、保持存储质量。
关键机制(四种生命周期操作)
1. Deprecate(弃用) 移除效用分数持续低于阈值 θ_deprecate 超过 T_deprecate 个周期且非 Mature 状态的技能。并非立即删除——需要持续低效用一段观察期后再执行。
2. Mature(成熟) 锁定效用分数高于 θ_mature 的技能,将其标记为”成熟”。成熟技能:
- 不再被 DEPRECATE 直接移除
- 但仍需通过 ε-greedy 周期(ε 通常取 0.05)被重新检索和评估,防止过度自信
3. Merge(合并) 检测跨分支的语义重复技能对,将内容合并后保留效用更高的那个,删除另一个。主要在 General ↔ Task 和 Task ↔ Action 边界发生。
4. Archive(归档) 将弃用的技能移入冷存储而非永久删除,保留元数据和弃用原因。目的:
- 可追溯性:可以回溯为什么某个技能被淘汰
- 可恢复性:如果环境变化导致旧技能重新有用,可从 Archive 中恢复
为什么这样设计
- Mature 的 ε-greedy 重评估:即使历史上极好的技能,也可能因环境变化(如临床指南更新)而过时。ε 概率的随机重检确保了”老兵不死,只是渐被遗忘”不会发生
- Archive 而非删除:在医疗场景中,可追溯性是合规要求。同时环境可能非平稳(如新药上市改变某些流程),Archive 为未来的”技能复兴”留了后门
架构总结:三分支仓库结构
SkeMex Skill Repository
│
├── General Branch (M_gen)
│ ├── 临床推理基本原则(如"始终先收集关键体征再下诊断")
│ ├── 跨疾病通用策略(如"排除急症后再考虑慢性病因")
│ └── 元认知技能(如"当证据矛盾时,优先采信近期检查结果")
│
├── Task-Level Branch (M_task)
│ ├── 鉴别诊断模式(如"胸痛 + ST段抬高 → 优先排查心梗")
│ ├── 治疗方案模式(如"社区获得性肺炎的经验性抗生素选择")
│ └── 检查规划模式(如"不明原因发热的阶梯式检查流程")
│
└── Action-Level Branch (M_act)
├── 搜索查询模板(如 PubMed 检索词组合策略)
├── 工具调用参数格式(如检验结果解析的 JSON schema)
└── 信息提取模式(如从影像报告中提取关键发现的规则)
实现陷阱与注意事项
陷阱一:检索在错误的抽象层次
如果在 Action-Level 分支中存储了过于具体的操作(如”在 PubMed 中搜索关键词 X”),它可能永远不会被类似但不同的查询匹配到。解决:Action-Level 技能应描述操作模式而非具体参数值——比如”使用 [疾病名] + ‘diagnosis’ + ‘guideline’ 作为 PubMed 检索词组合”而非”搜索 diabetes diagnosis guideline”。
陷阱二:效用噪声来自单样本方差
如果按每个 episode 独立评估效用,同一个技能可能在简单病例上获得 +0.5、在困难病例上获得 −0.3,导致效用分数剧烈震荡。SkeMex 通过窗口级 EMA 和类别基线解决了这个问题,但如果窗口大小或 EMA λ 选择不当,噪声仍然存在。建议:λ 不低于 0.9,评估窗口不低于 50 个 episode。
陷阱三:门控阈值调参
Novelty Gate 和 Quality Gate 的阈值高度依赖任务域。医疗诊断场景中,两个不同疾病的推理模式可能有 70% 表面相似(都要查体征、询问病史),但实际上需要不同的技能。如果 Novelty Gate 阈值太低,不同的模式会被强行合并;太高,技能库会碎片化。建议从保守阈值开始、逐步放松。
陷阱四:冷启动的种子技能质量
SkeMex 的初始种子技能决定了系统早期的”品味”。如果种子技能质量低(包含模糊的通用建议如”仔细分析患者数据”),Write 阶段可能以这些低质量技能为锚点进行 PATCH,导致整个技能库被”污染”。建议:种子技能由临床专家审核,确保每个技能都有具体的情景触发器和可操作步骤。