Skip to content

📋 模型版本管理

微调了 5 个版本,两周后客户说 v2 更好,但 v2 已经被你覆盖了——版本管理就是防这个的

为什么需要版本管理

一次微调可能经历:

v1: 初次微调,效果一般
v2: 加了 200 条数据,效果好多了
v3: 调了学习率,反而退步了
v4: 换 rank=16,效果最好
v5: 新增法律条文数据,合同审查更强了

没有版本管理,你只能保留一个。客户说"上周那个版本更好",你只能傻眼。


命名规范

固定命名规则,一眼看出是什么:

{模型名}-{任务}-{版本号}-{日期}

示例:
qwen2.5-7b-contract-v3-20260807
qwen2.5-7b-contract-v4-20260814-legal
deepseek-r1-8b-bidding-v1-20260728

版本号用 v + 递增数字,后缀可以加特性描述。


存储方案

方案一:目录加日期(最简单)

bash
# 模型存储目录结构
/models/
├── qwen2.5-7b-contract/
   ├── v1-20260701/          # 初版
   ├── adapter_model.safetensors
   └── adapter_config.json
   ├── v2-20260715/          # 改进版
   ├── adapter_model.safetensors
   └── adapter_config.json
   └── current -> v2-20260715/  # 当前生产版本(软链接)
├── deepseek-r1-8b-bidding/
   ├── v1-20260728/
   └── current -> v1-20260728/

切换版本只需改软链接:

bash
# 回滚到 v1
ln -sfn v1-20260701 /models/qwen2.5-7b-contract/current

# Ollama 重新加载
ollama create contract-reviewer -f Modelfile

方案二:Ollama 标签管理

bash
# 每次微调完导入时打标签
ollama create contract-reviewer:v1 -f Modelfile-v1
ollama create contract-reviewer:v2 -f Modelfile-v2
ollama create contract-reviewer:v3 -f Modelfile-v3

# 查看所有版本
ollama list | grep contract

# 使用指定版本
ollama run contract-reviewer:v1

方案三:HuggingFace Hub(私仓)

bash
# 推送 LoRA 权重到 HuggingFace 私有仓库
huggingface-cli login
huggingface-cli upload your-org/contract-model-v3 \
  ./qwen-lora-contract-final \
  --private

好处:有版本记录、可协作、不怕丢。


版本对比(A/B 测试)

同一批测试样本,跑两个版本对比:

python
import json
from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="***")

test_samples = [
    "审查:违约金每日千分之五是否合规?",
    "分析:甲方单方终止合同的条款是否有风险?",
    # ... 50条测试样本
]

results = {"v3": [], "v4": []}

for version in ["v3", "v4"]:
    # 切换模型(vLLM 热加载,Ollama 需重启)
    for sample in test_samples:
        resp = client.chat.completions.create(
            model=f"contract-reviewer-{version}",
            messages=[{"role": "user", "content": sample}]
        )
        results[version].append(resp.choices[0].message.content)

# 输出对比结果,人工判断哪个版本好
for i, (v3_r, v4_r) in enumerate(zip(results["v3"], results["v4"])):
    print(f"=== 样本 {i+1} ===")
    print(f"v3: {v3_r[:100]}...")
    print(f"v4: {v4_r[:100]}...")
    print()

版本日志(CHANGELOG)

每个版本必须记录:

markdown
## v4 - 2026-08-14

### 变更
- 新增 150 条劳动法相关合同数据
- LoRA rank 从 8 提到 16
- 学习率从 2e-4 降到 1e-4

### 效果
- 合同审查准确率:v3 82% → v4 89%
- 劳动法专项通过率:v3 65% → v4 85%
- 通用能力无明显退化

### 已知问题
- 长合同(>5000字)审查速度下降 15%

回滚流程

bash
# 1. 确认当前版本
ollama list | grep contract

# 2. 切回旧版本
ollama rm contract-reviewer:current
ollama cp contract-reviewer:v3 contract-reviewer:current

# 3. 验证
ollama run contract-reviewer:current "审查:违约金每日千分之五"

# 4. 通知使用者
echo "合同审查模型已回滚至 v3,v4 因长文速度问题暂时下线"

🎯 本章要点

  • 模型名-任务-v版本号-日期 统一命名
  • 存储三选一:目录+软链接(最简)、Ollama 标签、HuggingFace 私仓
  • 每个版本写 CHANGELOG:改了什么、效果对比、已知问题
  • A/B 测试用同一批样本跑两个版本,人工对比输出质量
  • 回滚 = 切软链接或改 Ollama 标签,1 分钟完成
加载练习题中...

有问题或补充?欢迎留言