SkillClaw的PRM评分机制详解:如何用多数投票为Agent每一轮对话打出0-1质量分
【免费下载链接】SkillClawLet Skills Evolve Collectively with Agentic Evolver项目地址: https://gitcode.com/gh_mirrors/sk/SkillClaw
如果你正在研究SkillClaw的技能进化系统,一定注意到它会给 Agent 的每一轮对话打一个0-1 的质量分。这个分数来自 SkillClaw 的PRM(Process Reward Model,过程奖励模型)评分机制:每轮回复生成后,系统会让评审模型并行投出多票,通过多数投票判定本轮是"有帮助(+1)"、"没帮助(-1)"还是"存疑(0)",再映射成 0-1 分数,最终驱动技能反馈、技能验证和会话判断三条流水线。本文带你用最少代码把这套机制彻底讲清楚。
一、什么是PRM评分?过程奖励模型的核心思想
PRM(Process Reward Model)与只给整段任务打"结果分"的 ORM(Outcome Reward Model)不同:它把长任务拆解到每一步/每一轮,对中间过程给出即时质量反馈。
SkillClaw 的落地位置在 skillclaw/prm_scorer.py,核心类是PRMScorer。它的设计目标非常克制:
- 逐轮评分:对"用户指令 + Agent 回复"这一对内容单独评判,不与后续轮次比较(提示词中明确写了
Do NOT compare against any follow-up turn); - 三档判断:
+1(明确遵循并实质完成指令)、-1(跑题、错误或未完成核心要求)、0(证据不足或模棱两可); - 协议无关:只要提供 OpenAI 兼容的
/v1/chat/completions端点就能用,外部 API(OpenAI、Anthropic 等)或自托管 vLLM 都支持。
评分前还有一步容易被忽略的文本清洗:_sanitize_text会把tool_call等 XML 风格标签替换成中性占位符,避免触发 API 的内容过滤。
二、多数投票如何工作:3个评审并行打分
单次 LLM 评审有随机性,SkillClaw 的答案是并行多票 + 多数决,实现见 _majority_vote:
- 发起并行投票:
evaluate()用asyncio.gather同时发出prm_m次独立请求(默认3 票),每次以固定温度(默认 0.6)采样,保证票与票之间存在合理差异; - 容错解析:每票输出先匹配
Score: 1 / Score: -1 / Score: 0,失败再回退到\boxed{N}旧格式;解析失败或请求异常的票记为None(日志中显示为fail),直接从统计中剔除,不影响其余票; - 多数决:用
Counter统计有效票——- 3 票为
[1, 1, 0]→ 最终+1; - 3 票为
[1, -1, 0](三票各不一样,平局)→ 最终0; - 3 票全部失败 → 最终0。
- 3 票为
平局归零的设计很聪明:分歧本身就代表不确定性,与其硬判,不如标记为"存疑",下游系统会把 0 分解释为中性,而不是惩罚 Agent。
三、关键一步:-1 / 0 / +1 如何变成 0-1 质量分
你标题里看到"0-1 分",但多数投票的输出其实是 -1/0/+1。归一化发生在 skillclaw/validation_worker.py 的_normalize_replay_score,规则是一句线性映射加两个边界:
| 多数投票结果 | 含义 | 归一化后质量分 |
|---|---|---|
| -1 | 没帮助 | 0.0 |
| 0 | 存疑 / 平局 | 0.5 |
| +1 | 有帮助 | 1.0 |
也就是(value + 1) / 2,越界值会被钳制在[0, 1]区间。这个 0-1 分数随后写回会话记录(turns[idx]["prm_score"]),成为整个 SkillClaw 生态里唯一的质量基准。
四、PRM 分数的三大用途:反馈、验证、判断
分数打完不是终点。SkillClaw 中有三个模块消费 PRM 分数:
1️⃣ 技能反馈(在线)skillclaw/api_server.py 中,每轮对话一旦出现"下一条消息到达"的信号,_fire_prm_scoring就会异步发起评分(不阻塞对话主流程)。分数就绪后写回轮次记录,并调用skill_manager.record_feedback()——本轮注入过的技能、读过的技能都会收到这笔反馈。好技能攒高分,坏技能沉下去,技能库因此"越用越精"。
2️⃣ 技能重放验证(离线)skillclaw/validation_worker.py 中的空闲验证 Worker 会取历史案例做A/B 重放:同一指令分别用"当前技能"(baseline)和"候选技能"(candidate)生成回复,各自打 PRM 分并归一化。只有当候选平均分≥ 阈值(默认 0.75)且 ≥ baseline 平均分时才接受,否则拒绝——这是防止劣化技能被发布的关键闸门。
3️⃣ 会话判断的上下文进化服务端的 evolve_server/pipeline/session_judge.py 会把会话中积累的_prm_scores、avg_prm_before_judge作为先验证据交给会话评审,让"该会话是否值得提炼技能"的判断有据可依。
五、快速上手:PRM 评分的关键配置项
PRM 由use_prm开关控制,全部配置集中在 skillclaw/config.py。最小配置只需三行:
use_prm = true prm_url = "https://api.openai.com/v1" prm_model = "gpt-5.2"常用调优项一览:
| 配置项 | 默认值 | 作用 |
|---|---|---|
prm_m | 3 | 并行投票数,奇数最利于多数决 |
prm_temperature | 0.6 | 投票采样温度,影响票间差异 |
prm_max_new_tokens | 1024 | 单票最大生成长度 |
prm_api_key | 空 | 留空则复用llm_api_key |
💡新手提示:若未配置
prm_url/prm_model,启动器(skillclaw/launcher.py)会自动回退到主模型的 API 地址和模型名;再回退失败则静默禁用 PRM,服务本身不受影响。
总结:为什么是"多数投票 + 三档归零"
SkillClaw 的 PRM 评分机制用三个设计换取了工程上的稳健性:
- 多数投票消除单次评审的随机性,3 票是成本与稳定性的平衡点;
- 失败票剔除 + 平局归零保证任何单点故障都不会污染分数;
- -1/0/+1 → 0-1 线性归一化让分数既能表达"有害/中性/有益"的方向,又能直接参与阈值比较(如 0.75 接受线)和均值聚合。
正是这条"每一轮都有分、每个技能有账本"的机制,让 SkillClaw 的技能库可以集体进化:分数流向反馈,反馈驱动验证,验证决定发布——体验复利,技能生长。
【免费下载链接】SkillClawLet Skills Evolve Collectively with Agentic Evolver项目地址: https://gitcode.com/gh_mirrors/sk/SkillClaw
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考