为什么是 1.5B,而不是 7B
放弃 7B 不是算力妥协,而是一次显式的工程取舍:当预算只有一块 T4, 问题从"怎么把 7B 塞进去"变成"在边界内把每一步做到最好、并把边界本身量化出来"。
全流程四段流水线 DATA → TRAIN → EVAL → SERVE
两条贯穿原则:冒烟先行——用 0.5B + 500 条 + 2 分钟先打通全链路, 把环境坑消灭在最便宜的实验上,正式训练 2.5 小时零意外;每个结论都有对照—— 基座 zero-shot 与微调模型同脚本、同口径、同测试集。
- DISC-Law-SFT 16.7 万条
- 清洗 + 问题级去重防泄漏
- 5,000 / 300 / 300 分层切分
- 测试集引用覆盖 100%
- 0.5B 冒烟 2min 验链路
- 1.5B LoRA r=32 α=64
- lr 2e-4 · cosine · 3ep
- fp16 · gradient ckpt
- 双层引用指标(§04)
- ROUGE / BLEU / BERTScore
- 基线 vs 微调对照
- 错误构成 + 案例归因
- LoRA merge 回基座
- GGUF Q8_0 · 1.6GB
- llama-server OpenAI API
- TTFT / 吞吐 / P95 压测
训练诊断 · eval_loss 的 U 型曲线
训练账单
数据工程 16.7 万条到 5,600 条
评测数字可信的前提是数据干净:去重防泄漏、测试集可计算、抽样可复现—— 三件事在漏斗里一次做完。
- ①问题级去重防泄漏:NFKC 归一化 → 去标点 → MD5,同题仅留一条,训练/测试天然隔离,杜绝"背答案"。
- ②测试集引用覆盖率 100%:验证/测试集优先保留答案带《法律名》第X条引用的样本——引用指标才可计算。
- ③确定性可复现:seed=42 + 脚本化构建,任何人重跑得到同一份数据。
- ④诚实标注:语料实为判决预测 / 司法考试 / 咨询的任务混态(无类别字段),指标解读基于这一事实。
把"引用准确率"拆成两层
业界惯用单一 Citation Accuracy,把"会不会引用"和"引得对不对"混为一谈。 拆成两层之后,微调的价值与模型的边界同时变得可度量——这是本项目最核心的方法改进。
单一数值。格式学会了、事实没学会,两种情况在这个指标里无法区分——小模型微调最需要回答的问题,恰恰被它藏住了。
参考答案带引用时,预测也给出 《法律名》第X条 形式引用的比例。
回答的是:微调是否教会了模型"怎么答"
预测引用的法条集合与参考答案的重合度(Precision / Recall / 完全一致)。
回答的是:模型"引的对不对"——受预训练知识边界约束
配套口径:同脚本(eval/metrics.py)· 字符级 ROUGE-L / BLEU + BERTScore + 引用正则抽取 · 同 300 条 held-out 测试集。LLM-as-Judge 因无外部 API 预算列为升级项(§08)。
实验结果 BASELINE → FINE-TUNED
全部指标来自同一测试集的两次推理:基座 zero-shot vs 微调后(epoch 3)。
引用与语义指标
生成质量
300 条测试集 · 引用构成
「有出入」的构成见 §06 案例归因——其中一部分其实是评测集自身的标签噪声。
同一案情,两个模型 相邻条文混淆现场
案情:被告人得知红豆杉具有防癌功效,与其姑父商量后在其山林内砍伐 3 棵红豆杉并运往县城加工家具。 经鉴定,涉案红豆杉均属国家Ⅰ级重点保护植物。问:可能构成何罪?
另一类"错误"其实是评测集的错:一条涉外民事行为能力题,参考答案引用了《中华人民共和国民事法》第9条 ——这是一部不存在的法律。标签噪声意味着 67.5% 的事实正确率被低估, "评测集净化"因此进入路线图。
量化部署与压测 GGUF · llama.cpp · 30 QUERY LOAD TEST
LoRA 合并 → GGUF Q8_0(1.6GB,几乎无损)→ llama-server 提供 OpenAI 兼容 API, 附带 Gradio 前端。以下为 T4(CUDA 版 llama.cpp)30 条真实压测。
ttft_mean_s = 0.068 ttft_p95_s = 0.104
decode_tok_s_mean = 97.1 range = 94 – 104
e2e_mean_s = 2.277 e2e_p95_s = 2.78 # 目标 < 2s:未达标
✓ 根因明确 # 256 tok ÷ 97 tok/s ≈ 2.6s,解码时长主导,与加载/调度无关
✓ 修复路径 # 限长 150tok ≈1.6s 达标 · 流式(TTFT 0.07s) · Q4_K_M 再提速~40%
P95 端到端 2.78s > 2s 目标。根因是解码时长主导而非服务瓶颈, 三条修复路径均有量化预期——诚实的失败分析比漂亮的数字更可信。
已知边界,与下一步 WHAT'S NEXT
已知边界 LIMITS
路线图 PRIORITIZED
- P0RAG 注入法条库
直接攻击相邻条文混淆——预期收益大于一切调参 - P1评测集净化
人工复核 110 条「有出入」,拆分模型错 vs 标签错 - P1LLM-as-Judge
覆盖引用指标测不到的推理正确性 - P2对照实验组
ep2 vs ep3 · 任务分层评测 · 自建法条 QA · Q4/vLLM