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_τ > 0u_i ↑(增加)
已采纳 + 负优势A_τ < 0u_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,导致整个技能库被”污染”。建议:种子技能由临床专家审核,确保每个技能都有具体的情景触发器和可操作步骤。