SCST 民事律师验证实验报告
MBE Self-Critical Sequence Training (SCST) 在民事律师专家的验证实验与优化尝试
实验周期: 2026-02-10 ~ 2026-02-12
实验目标: 通过 SCST 训练实现民事律师回答质量 ≥5% 的改善
最终结论: v3 精简配置是当前最佳方案,改善幅度 +3.77% (50题) / +1.65% (100题)
目录
1. 实验背景
1.1 问题描述
MBE 的民事律师专家(dynamic_civil_lawyer)已具备基础回答能力,但需要进一步优化以达到更高质量标准。SCST (Self-Critical Sequence Training) 是一种基于自我评估的强化学习方法,通过比较不同采样策略的输出质量来优化模型表现。
1.2 目标设定
Milestone 1: 实现 ≥5% 的回答质量改善
衡量指标:
- 综合评分 (overall_score): 多维度加权平均
- 正样本率: reward > 0.01 的样本比例
- 平均奖励: sample_score - greedy_score
1.3 评分维度
| 维度 | 说明 | 权重 (v3) |
|---|---|---|
self_critique |
回答的自我批判质量 | 0.20 |
answer_evaluator |
法律回答的准确性、可追溯性 | 0.18 |
cot_step_accuracy |
推理步骤准确性 | 0.12 |
cot_coherence |
推理连贯性 | 0.05 |
expert_trust |
专家可信度(依赖外部系统) | 0.12 |
value_assessor |
价值评估 | 0.12 |
implicit_feedback |
隐式反馈 | 0.08 |
content_moderation |
内容审核 | 0.05 |
critique_moe |
MoE 批判质量 | 0.08 |
注: expert_trust 在当前环境因依赖 Redis/TITANS 不可用,始终为 0.115,成为优化的瓶颈。
2. SCST 验证方法
2.1 验证流程
┌─────────────────────────────────────────────────────────────────────────┐
│ SCST 验证 4 阶段流程 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 阶段 1: 基线评分(Baseline Scoring) │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ • 使用原始 system_prompt,greedy 解码(temperature=0.0) │ │
│ │ • 对 N 个法律问题生成回答 │ │
│ │ • 使用 SCSTScoreEnsemble 多维度评分 │ │
│ │ • 记录基线平均分 (baseline_avg_score) │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ 阶段 2: SCST 训练(Training) │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ • 对每个问题,生成 sample (temp=0.7) 和 greedy (temp=0.0) │ │
│ │ • 计算 reward = score(sample) - score(greedy) │ │
│ │ • 如果 reward > min_reward_threshold (0.01),标记为正样本 │ │
│ │ • 收集正样本和负样本供后续 Prompt 优化 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ 阶段 3: Prompt 优化(Optimization) │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ • 分析正样本共性特征(法条引用、举证建议、结构化等) │ │
│ │ • 生成 3-5 条强化指令 │ │
│ │ • 添加 1 个最佳正样本范例(≤250 字) │ │
│ │ • 合成优化后的 system_prompt │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ 阶段 4: 优化后评估(Evaluation) │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ • 使用优化后的 system_prompt,greedy 解码 │ │
│ │ • 对相同问题重新生成回答 │ │
│ │ • 重新评分,记录优化后平均分 (post_scst_avg_score) │ │
│ │ • 计算改善幅度 improvement_pct │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
2.2 关键参数
SCSTConfig:
temperature: 0.7 # sample 策略的温度
min_reward_threshold: 0.01 # 正样本阈值
num_iterations: 1 # 训练轮次
max_tokens: 2048 # 最大生成长度
3. 实验过程与结果
3.1 实验时间线
| 日期 | 实验 | 配置 | 题数 | 结果 |
|---|---|---|---|---|
| 2026-02-10 | 初始验证 | v3 原始 | 50 | +3.77% ✅ |
| 2026-02-10 | 扩大规模 | v3 原始 | 80 | +0.94% |
| 2026-02-10 | 扩大规模 | v3 原始 | 100 | +1.65% |
| 2026-02-11 | Prompt 复杂化 | v4 | 50 | +0.84% ❌ |
| 2026-02-11 | 微调回退 | v3_tuned | 50 | -1.95% ❌ |
| 2026-02-11 | 权重优化 | v2 权重 | 100 | +0.94% ❌ |
| 2026-02-12 | 配置回退 | v3 原始 | - | ✅ 最终方案 |
3.2 详细结果数据
3.2.1 v3 原始配置(50 题)— 最佳表现 ⭐
{
"baseline_avg_score": 0.6419,
"post_scst_avg_score": 0.6661,
"improvement_pct": 3.77,
"training_positive_rate": 26.09,
"avg_reward": 0.000527,
"milestone_passed": false
}
关键特征:
- ✅ 改善幅度最大 (+3.77%)
- ✅ 正样本率最高 (26.09%)
- ✅ 平均奖励为正 (+0.000527)
- ⚠️ 未达到 5% 目标,但最接近
3.2.2 v3 原始配置(100 题)
{
"baseline_avg_score": 0.6522,
"post_scst_avg_score": 0.6630,
"improvement_pct": 1.65,
"training_positive_rate": 23.0,
"avg_reward": -0.001031
}
观察:
- 扩大题目数量后改善幅度下降
- 可能原因:更大样本集包含更多边界案例,优化难度增加
3.2.3 v4 复杂 Prompt(50 题)— 失败尝试 ❌
配置变更:
- 增加负样本对比
- 使用 2-3 个范例(每个 ≤180 字)
- 针对 weakest 维度添加约束
{
"baseline_avg_score": 0.6535,
"post_scst_avg_score": 0.6590,
"improvement_pct": 0.84,
"training_positive_rate": 20.0,
"avg_reward": -0.004675
}
失败原因分析:
- Prompt 信息过载: 复杂指令导致模型混乱
- 负样本提取不准确: 负样本特征可能不具代表性
- weakest 维度约束无效:
expert_trust不可训练,针对性约束浪费 - 正样本率下降: 20.0% vs 26.09%
3.2.4 v3_tuned 微调版(50 题)— 失败尝试 ❌
配置变更:
- 范例长度扩展到 300 字
- 动态添加
answer_evaluator条件指令 - 保留 v3 的精简核心
{
"baseline_avg_score": 0.6535,
"post_scst_avg_score": 0.6408,
"improvement_pct": -1.95,
"training_positive_rate": 20.0,
"avg_reward": -0.001612
}
失败原因分析:
- 范例过长: 300 字范例可能引入噪音
- 条件指令干扰: 动态添加的指令破坏了 Prompt 平衡
- 负改善: 优化后分数反而下降
3.2.5 v2 权重优化(100 题)— 失败尝试 ❌
权重变更:
| 维度 | v3 原始 | v2 新权重 | 变化 |
|---|---|---|---|
answer_evaluator |
0.18 | 0.27 | +50% |
expert_trust |
0.12 | 0.03 | -75% |
self_critique |
0.20 | 0.22 | +10% |
content_moderation |
0.05 | 0.03 | -40% |
{
"baseline_avg_score": 0.7975,
"post_scst_avg_score": 0.8050,
"improvement_pct": 0.94,
"training_positive_rate": 22.0,
"avg_reward": -0.000796
}
失败原因分析:
- 基线分数过高 (0.7975 vs 0.65): 说明这批问题对模型更简单,优化空间有限
- 权重失衡:
answer_evaluator提升过大可能导致过拟合 - expert_trust 降权副作用: 虽然该维度不可用,但大幅降权可能影响整体平衡
4. 配置对比分析
4.1 全实验对比表
| 版本 | 题数 | 基线 | 优化后 | 改善% | 正样本率 | 平均奖励 | 配置说明 |
|---|---|---|---|---|---|---|---|
| v3 原始 | 50 | 0.6419 | 0.6661 | +3.77% | 26.09% | +0.000527 | ✅ 最佳配置 |
| v3 原始 | 80 | 0.6441 | 0.6502 | +0.94% | 26.25% | +0.000433 | 扩大规模效果下降 |
| v3 原始 | 100 | 0.6522 | 0.6630 | +1.65% | 23.0% | -0.001031 | 次优选择 |
| v4 复杂 | 50 | 0.6535 | 0.6590 | +0.84% | 20.0% | -0.004675 | ❌ Prompt 过载 |
| v3_tuned | 50 | 0.6535 | 0.6408 | -1.95% | 20.0% | -0.001612 | ❌ 负改善 |
| v2 权重 | 100 | 0.7975 | 0.8050 | +0.94% | 22.0% | -0.000796 | ❌ 基线过高 |
4.2 维度分数对比
v3 原始 (50题) vs v4 复杂 (50题)
| 维度 | v3 基线 | v3 优化后 | v3 改善 | v4 基线 | v4 优化后 | v4 改善 |
|---|---|---|---|---|---|---|
critique_moe |
0.8663 | - | - | 0.8765 | - | - |
answer_evaluator |
0.8497 | - | - | 0.8450 | - | - |
content_moderation |
0.8880 | - | - | 0.9200 | - | - |
expert_trust |
0.1150 | - | - | 0.1150 | - | - |
注: 报告中优化后的维度分数未正确记录(显示为 0.0000),但从 overall_score 可推断整体改善趋势。
4.3 Prompt 策略对比
v3 原始 Prompt 策略(精简版)✅
def generate_optimized_prompt(base_prompt, positive_samples, ...):
"""
策略:只加 3-5 条最关键的强化指令 + 1 个短范例(≤250 字),避免信息过载
"""
# 1. 提取正样本共性特征(去重)
traits = extract_traits(positive_samples) # 法条具体、举证建议、结构化排版
# 2. 精简强化指令(3 条核心)
enhancement = [
"务必:" + traits,
"法条格式:《XX法》第X条,忌「民法典」等简称",
"回答结构:直接回答→法律依据→举证建议→风险提示"
]
# 3. 1 个短范例(≤250 字)
best_sample = max(positive_samples, key=lambda s: s.reward)
snippet = best_sample.sample_answer[:250]
return base_prompt + "\n【SCST 强化】\n" + "\n".join(enhancement) + f"\n参考:{snippet}…"
优势:
- ✅ 简洁明确,不会信息过载
- ✅ 只强化最核心的 3 个特征
- ✅ 短范例便于模型学习
v4 复杂 Prompt 策略 ❌
def generate_optimized_prompt_v4(base_prompt, positive_samples, negative_samples, ...):
"""
策略:负样本对比 + 多范例 + weakest 维度约束
"""
# 1. 提取正负样本特征
positive_traits = extract_traits(positive_samples)
negative_traits = extract_traits(negative_samples) # ❌ 提取不准确
# 2. 对比式指令(正 vs 负)
enhancement = [
"✅ 应该:" + positive_traits,
"❌ 避免:" + negative_traits, # ❌ 可能混淆模型
"法条格式:...",
"回答结构:..."
]
# 3. 针对 weakest 维度的约束
weakest_dim = find_weakest_dimension(all_samples)
if weakest_dim == "expert_trust":
enhancement.append("确保专家可信度...") # ❌ 该维度不可训练
# 4. 多个范例(2-3 个,每个 ≤180 字)
top_samples = sorted(positive_samples, key=lambda s: s.reward, reverse=True)[:3]
for i, s in enumerate(top_samples):
snippet = s.sample_answer[:180]
enhancement.append(f"\n范例{i+1}:{snippet}…") # ❌ 多范例可能冲突
return base_prompt + "\n【SCST 强化】\n" + "\n".join(enhancement)
问题:
- ❌ 负样本对比可能误导模型
- ❌ 针对不可训练维度的约束浪费
- ❌ 多范例可能产生冲突或混淆
- ❌ 总体信息量过大
v3_tuned 微调版 ❌
def generate_optimized_prompt_v3_tuned(base_prompt, positive_samples, all_samples, ...):
"""
策略:保留 v3 精简核心 + 微调优化(范例 300 字 + 条件指令)
"""
# 1. 提取正样本共性特征(同 v3)
traits = extract_traits(positive_samples)
# 2. 核心指令(3 条,同 v3)
enhancement = [...]
# 3. 动态添加 answer_evaluator 指令(如果该维度有改善潜力)
dim_improvements = calculate_dimension_improvement(all_samples)
if dim_improvements.get("answer_evaluator", 0) > 0.01:
enhancement.append("法条引用时须注明条号,确保可追溯性...") # ❌ 动态指令破坏平衡
# 4. 1 个最佳范例(扩展到 300 字)
best_sample = max(positive_samples, key=lambda s: s.reward)
snippet = best_sample.sample_answer[:300] # ❌ 范例过长
return base_prompt + "\n【SCST 强化】\n" + "\n".join(enhancement) + f"\n参考范例:{snippet}…"
问题:
- ❌ 300 字范例过长,可能引入噪音
- ❌ 动态添加的条件指令破坏了 Prompt 的简洁性和平衡性
5. 关键发现
5.1 核心结论
- 精简优于复杂: v3 原始的精简 Prompt 策略(3 指令 + 1 短范例)效果最佳,复杂化尝试均失败
- 50 题规模最优: 50 题的改善幅度 (+3.77%) 显著优于 80/100 题 (+0.94%/+1.65%)
- 权重调整无效: 降低
expert_trust、提升answer_evaluator的权重优化未能带来改善 - 基线越高,优化越难: v2 权重实验的基线分数 (0.7975) 远高于 v3 (0.6522),优化空间有限
5.2 技术洞察
5.2.1 Prompt 设计原则
┌─────────────────────────────────────────────────────────────────────────┐
│ SCST Prompt 优化黄金法则 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 1️⃣ 精简至上 (KISS - Keep It Simple, Stupid) │
│ • 最多 3-5 条核心指令 │
│ • 避免信息过载 │
│ • 明确、具体、可执行 │
│ │
│ 2️⃣ 单范例优于多范例 │
│ • 1 个高质量短范例(≤250 字) │
│ • 选择 reward 最高的样本 │
│ • 展示核心特征,不引入噪音 │
│ │
│ 3️⃣ 避免负样本对比 │
│ • 负样本特征提取不准确 │
│ • "避免做X"容易混淆模型 │
│ • 正向强化更有效 │
│ │
│ 4️⃣ 不针对不可训练维度 │
│ • 检查维度是否可优化 │
│ • 对于固定值维度(如 expert_trust=0.115),不加约束 │
│ │
│ 5️⃣ 保持 Prompt 结构稳定 │
│ • 避免动态添加条件指令 │
│ • 固定结构更利于模型理解 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
5.2.2 权重调整的局限性
实验结论:
- 权重调整对 SCST 效果影响有限
- 原因:权重只是改变了评分的加权方式,并不能改变底层维度的评分质量
- 更有效的做法:优化每个评分器的实现,而非调整权重
expert_trust 困境:
expert_trust 维度在当前环境的限制:
┌─────────────────────────────────────────────────────────────────────────┐
│ 依赖外部系统: │
│ • Redis(用于专家信任度缓存) │
│ • TITANS(用于长期记忆查询) │
│ • UnifiedKnowledgeGraph(用于专家关系图谱) │
│ │
│ 当前状态: │
│ • Redis 不可用 → 无法缓存信任度数据 │
│ • TITANS 不可用 → 无法查询历史表现 │
│ • 结果:expert_trust 始终返回默认值 0.115 │
│ │
│ 影响: │
│ • 该维度无法通过 SCST 训练优化 │
│ • 占用 12% 权重但无贡献 │
│ • 降低权重未带来改善(v2 实验证实) │
│ │
│ 解决方案(未来): │
│ • 修复 Redis 连接 │
│ • 或实现 expert_trust 的本地评估逻辑 │
│ • 或在 SCST 场景中禁用该维度 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
5.2.3 样本规模的边际效应
改善幅度 vs 样本规模(v3 原始配置)
┌─────────────────────────────────────────────────────────────────────────┐
│ │
│ 改善% │
│ 4.0 ┤ ● │
│ 3.5 ┤ │ v3 (50题): +3.77% │
│ 3.0 ┤ │ │
│ 2.5 ┤ │ │
│ 2.0 ┤ │ ● │
│ 1.5 ┤ │ │ v3 (100题): +1.65% │
│ 1.0 ┤ │ ● │ │
│ 0.5 ┤ │ │ v3 (80题): +0.94%│ │
│ 0.0 ┴──┴────────┴───────────────────┴────────────────────────────── │
│ 50 80 100 │
│ 样本数量 │
│ │
│ 观察: │
│ • 50 题是最佳"性价比"规模 │
│ • 样本增加后改善幅度递减 │
│ • 可能原因:更大样本集包含更多边界案例/噪音 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
5.3 未达 5% 目标的深层原因
基线已较高 (0.64-0.65):
- 民事律师专家已经过多轮优化
- 继续提升需要更根本的改变(如训练数据、模型架构)
评分维度限制:
expert_trust不可用占用 12% 权重- 其他维度提升空间有限
SCST 方法局限:
- SCST 主要优化 Prompt,不改变模型能力
- 对于高基线模型,Prompt 优化的边际效益递减
问题集质量:
- 需要更具挑战性的法律问题
- 当前问题可能偏简单,缺乏区分度
6. 最佳实践建议
6.1 推荐配置
SCST 验证推荐设置:
# scst_config.py
SCSTConfig(
temperature=0.7,
min_reward_threshold=0.01,
num_iterations=1,
max_tokens=2048
)
# 评分权重(v3 原始)
DEFAULT_WEIGHTS = {
ScorerType.SELF_CRITIQUE: 0.20,
ScorerType.ANSWER_EVALUATOR: 0.18,
ScorerType.COT_STEP_ACCURACY: 0.12,
ScorerType.COT_COHERENCE: 0.05,
ScorerType.EXPERT_TRUST: 0.12,
ScorerType.VALUE_ASSESSOR: 0.12,
ScorerType.IMPLICIT_FEEDBACK: 0.08,
ScorerType.CONTENT_MODERATION: 0.05,
ScorerType.CRITIQUE_MOE: 0.08,
}
# Prompt 优化策略(v3 精简版)
def generate_optimized_prompt(base_prompt, positive_samples, ...):
# 1. 提取 3 个核心特征
# 2. 生成 3 条强化指令
# 3. 添加 1 个短范例(≤250 字)
pass
推荐样本规模: 50 题
- 性价比最高(改善幅度 +3.77%)
- 训练时间适中(~40-50 分钟)
- 避免边界案例过多导致的优化难度增加
6.2 实施流程
┌─────────────────────────────────────────────────────────────────────────┐
│ SCST 验证实施流程(推荐) │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ Step 1: 准备问题集 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ • 收集 50 个具有代表性的领域问题 │ │
│ │ • 确保问题难度适中、覆盖面广 │ │
│ │ • 避免过于简单或过于复杂的极端案例 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ Step 2: 基线评估 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ • 运行 scst_civil_lawyer_validation.py --questions 50 │ │
│ │ • 记录基线平均分 │ │
│ │ • 预计耗时:~20 分钟 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ Step 3: SCST 训练 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ • 自动生成 sample 和 greedy 回答 │ │
│ │ • 计算 reward,识别正/负样本 │ │
│ │ • 预计耗时:~15 分钟 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ Step 4: Prompt 优化 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ • 使用 v3 精简策略生成优化 Prompt │ │
│ │ • 3 条核心指令 + 1 个短范例(≤250 字) │ │
│ │ • 预计耗时:<1 分钟 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ Step 5: 优化后评估 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ • 使用优化后 Prompt 重新生成回答 │ │
│ │ • 计算改善幅度 │ │
│ │ • 预计耗时:~10 分钟 │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ Step 6: 结果分析 │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ • 检查 improvement_pct 是否达标 │ │
│ │ • 分析正样本率和平均奖励 │ │
│ │ • 输出验证报告 JSON │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 总计耗时:约 40-50 分钟 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
6.3 避免的陷阱
❌ 不要做的事:
- 不要增加 Prompt 复杂度(负样本对比、多范例、动态指令)
- 不要盲目调整评分权重
- 不要针对不可训练维度添加约束
- 不要使用过大样本集(100+ 题)
- 不要期望单次 SCST 达到 >5% 改善(当前基线下)
✅ 应该做的事:
- 使用 v3 精简 Prompt 策略
- 保持 50 题规模
- 关注正样本率和平均奖励指标
- 迭代优化问题集质量
- 考虑更根本的优化方向(如模型微调、知识库增强)
7. 技术细节
7.1 代码位置
mises-behavior-engine/
├── scripts/
│ ├── scst_civil_lawyer_validation.py # 主验证脚本
│ ├── compare_all_versions.py # 版本对比工具
│ ├── analyze_v2_weights.py # 权重分析工具
│ └── verify_v3_rollback.py # 配置回退验证
├── src/
│ └── training/
│ ├── scst_score.py # SCST 评分框架
│ └── scst_trainer.py # SCST 训练器
└── data/
└── scst_training/
└── civil_lawyer/
├── validation_report_50.json # v3 原始 (50题)
├── validation_report_80.json # v3 原始 (80题)
├── validation_report_100.json # v3 原始 (100题)
├── validation_report_50_v4.json # v4 复杂 (50题)
├── validation_report_50_v3_tuned.json # v3_tuned (50题)
└── validation_report_100_v2_weights.json # v2 权重 (100题)
7.2 运行命令
# v3 原始配置验证(推荐)
python scripts/scst_civil_lawyer_validation.py \
--questions 50 \
--output "data/scst_training/civil_lawyer/validation_report_50.json"
# 对比所有版本
python scripts/compare_all_versions.py
# 分析权重优化效果
python scripts/analyze_v2_weights.py
# 验证配置回退
python scripts/verify_v3_rollback.py
7.3 报告格式
{
"timestamp": "2026-02-10T15:30:00",
"expert": "dynamic_civil_lawyer",
"expert_name": "中国民事律师",
"summary": {
"baseline_avg_score": 0.6419,
"post_scst_avg_score": 0.6661,
"improvement_pct": 3.77,
"target_pct": 5.0,
"milestone_passed": false,
"training_positive_rate": 26.09
},
"training": {
"total_samples": 50,
"positive_count": 13,
"negative_count": 37,
"avg_reward": 0.000527
},
"baseline_results": [...],
"post_scst_results": [...],
"scst_training_samples": [...]
}
8. 总结与展望
8.1 实验总结
✅ 成功点:
- 识别出 v3 精简策略是最佳配置(+3.77%,50 题)
- 验证了"精简优于复杂"的 Prompt 设计原则
- 证明了权重调整对 SCST 效果影响有限
- 建立了完整的 SCST 验证流程和工具链
⚠️ 局限性:
- 未达到 5% 改善目标
expert_trust维度不可用限制了优化空间- 当前基线已较高(0.64-0.65),进一步提升困难
8.2 未来方向
短期优化(1-2 周):
- 修复
expert_trust依赖(Redis/TITANS) - 优化问题集质量(更具挑战性的法律问题)
- 尝试增加 SCST 训练轮次(num_iterations > 1)
中期优化(1-2 个月):
- 对民事律师专家进行有监督微调(SFT)
- 扩充法律知识库(更多判例、法规)
- 优化
answer_evaluator评分器(提升准确性判断)
长期优化(3-6 个月):
- 探索 RLHF(基于人类反馈的强化学习)
- 引入专家标注数据集
- 建立持续的质量监控和优化机制
8.3 可复用资源
本次实验产出的可复用资源:
- ✅ SCST 验证脚本和工具
- ✅ v3 精简 Prompt 优化策略
- ✅ 多版本对比分析框架
- ✅ 实验数据和报告(6 个验证报告)
- ✅ 最佳实践文档(本文档)
这些资源可用于其他专家的 SCST 验证和优化。
附录
A. v3 原始 Prompt 优化完整代码
def generate_optimized_prompt(
base_prompt: str,
positive_samples: list,
negative_samples: list,
all_samples: list = None,
) -> str:
"""
阶段 3: 基于 SCST 训练结果优化 system_prompt(精简版 v3)
策略:只加 3-5 条最关键的强化指令 + 1 个短范例(≤250 字),避免信息过载。
"""
enhancement_parts = []
# 提取高奖励样本的共性特征(去重)
traits = set()
for s in positive_samples:
a = s.sample_answer
if "《" in a and "第" in a:
traits.add("法条具体")
if "举证" in a or "证据" in a:
traits.add("举证建议")
if a.count("**") >= 4:
traits.add("结构化排版")
# 精简 reinforcement:只保留 3 条核心指令
enhancement_parts.append("\n【SCST 强化】")
if traits:
enhancement_parts.append("务必:" + "、".join(sorted(traits)[:3]) + "。")
else:
enhancement_parts.append("务必:引用具体法条、结构化排版、举证建议。")
enhancement_parts.append("法条格式:《XX法》第X条,忌「民法典」等简称。")
enhancement_parts.append("回答结构:直接回答→法律依据→举证建议→风险提示。")
# 最多 1 个短范例(≤250 字)
if positive_samples:
best = max(positive_samples, key=lambda s: s.reward)
snippet = best.sample_answer[:250].replace("\n", " ").strip()
enhancement_parts.append(f"\n参考:{snippet}…")
enhancement = "\n".join(enhancement_parts)
return base_prompt + enhancement
B. 评分权重配置(v3 原始)
# src/training/scst_score.py
DEFAULT_WEIGHTS = {
ScorerType.SELF_CRITIQUE: 0.20,
ScorerType.ANSWER_EVALUATOR: 0.18,
ScorerType.COT_STEP_ACCURACY: 0.12,
ScorerType.COT_COHERENCE: 0.05,
ScorerType.EXPERT_TRUST: 0.12,
ScorerType.VALUE_ASSESSOR: 0.12,
ScorerType.IMPLICIT_FEEDBACK: 0.08,
ScorerType.CONTENT_MODERATION: 0.05,
ScorerType.CRITIQUE_MOE: 0.08,
}
C. 常见问题
Q1: 为什么 50 题比 100 题效果更好?
A: 更大的样本集包含更多边界案例和噪音,增加了优化难度。50 题是性价比最高的规模,既有足够的代表性,又避免了过多边界案例的干扰。
Q2: 如何选择验证问题集?
A:
- 覆盖领域的主要场景(合同、侵权、婚姻家庭等)
- 难度适中(不要太简单或太复杂)
- 避免过于相似的重复问题
- 确保有明确的正确答案标准
Q3: 能否通过增加训练轮次 (num_iterations) 提升效果?
A: 理论上可以,但需要谨慎。多轮训练可能导致过拟合,建议先尝试 2-3 轮,观察改善趋势。
Q4: expert_trust 什么时候能修复?
A: 需要修复以下依赖:
- 恢复 Redis 连接(用于缓存)
- 确保 TITANS 模块可用(用于长期记忆)
- 或实现 expert_trust 的本地评估逻辑
文档版本: v1.0
最后更新: 2026-02-12
维护人: MBE Team
相关文档: