mcpField
F
Fine-Tuning Assistant

Fine-Tuning Assistant

github.com/jmsktm数据与数据库10204 次安装40 周前更新
代码仓库

关于 Fine-Tuning Assistant

Fine-Tuning Assistant 是面向模型实践者的技能,帮助将预训练模型适配到专门任务或特定风格。它指导方案选择、数据集准备、训练与评估,并涵盖 LoRA 和 QLoRA 等技术。

主要功能

  1. 01评估微调与提示词方案
  2. 02准备并验证训练数据集
  3. 03选择基础模型和训练参数
  4. 04监控训练并测试结果
  5. 05使用 LoRA、QLoRA 和指令微调

适用场景

  1. 01判断某项任务是否值得微调
  2. 02整理模型训练用的样例
  3. 03将微调模型与基线模型比较
  4. 04排查过拟合或训练问题

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/jmsktm/claude-settings --skill fine-tuning-assistant

安装后在 Claude Code 中输入/fine-tuning-assistant确认已加载。

详细介绍

微调助手

微调助手技能将引导你完成调整预训练模型以适应特定用例的流程。微调可以大幅提升模型在专业任务上的表现,让模型掌握你偏好的风格,并赋予仅靠提示词无法实现的能力。

本技能涵盖何时应微调而非进行提示词工程、如何准备训练数据、选择基础模型、配置训练参数、评估结果以及部署微调后的模型。它采用 LoRA、QLoRA 和指令微调等现代技术,让微调变得实用且经济高效。

无论你是通过 API 微调 GPT 模型、使用开源模型进行本地训练,还是使用 Hugging Face 等平台,本技能都能帮助你有策略且有效地开展微调。

核心工作流

工作流 1:判断是否需要微调
  1. 评估问题:
    • 提示词能否实现目标?
    • 任务格式或风格是否一致?
    • 你是否有高质量的训练数据?
    • 这项投入是否值得?
  2. 比较不同方法:
    方法适用场景投入
    改进提示词首次尝试、任务多变低
    少样本示例格式一致、数据有限低
    RAG知识密集、数据动态变化中
    微调风格一致、专业任务高
  3. 评估要求:
    • 至少准备 100-1000 条高质量示例
    • 明确的评估标准
    • 为训练和托管预留预算
  4. 决策:只有在提示词/RAG 不足以满足需求时才进行微调
工作流 2:准备微调数据集
  1. 收集训练示例:
    • 能代表目标用例
    • 质量高(输出中没有错误)
    • 多样化地覆盖不同任务变体
  2. 设置训练格式:
    {"messages": [
      {"role": "system", "content": "You are a helpful assistant..."},
      {"role": "user", "content": "User input here"},
      {"role": "assistant", "content": "Ideal response here"}
    ]}
    
  3. 质量保证:
    • 手动检查部分示例
    • 检查风格和格式是否一致
    • 删除重复和低质量条目
  4. 划分训练集/验证集/测试集
  5. 验证数据集格式
工作流 3:执行微调
  1. 选择基础模型:
    • 权衡模型大小与能力
    • 根据任务复杂度选择模型
    • 检查许可是否适用于你的用例
  2. 配置训练:
    # OpenAI fine-tuning
    training_config = {
        "model": "gpt-4o-mini-2024-07-18",
        "training_file": "file-xxx",
        "hyperparameters": {
            "n_epochs": 3,
            "batch_size": "auto",
            "learning_rate_multiplier": "auto"
        }
    }
    
    # LoRA fine-tuning (local)
    lora_config = {
        "r": 16,  # Rank
        "lora_alpha": 32,
        "lora_dropout": 0.05,
        "target_modules": ["q_proj", "v_proj"]
    }
    
  3. 监控训练:
    • 观察损失曲线
    • 检查是否过拟合
    • 在留出集上验证
  4. 评估结果:
    • 与基线模型进行比较
    • 使用多样化输入进行测试
    • 检查是否出现性能退化

快速参考

操作命令/触发语
判断方法“我应该为 [任务] 进行微调吗”
准备数据“为微调设置数据格式”
选择模型“为 [任务] 选择要微调的模型”
配置训练“为 [目标] 设置微调参数”
评估结果“评估微调后的模型”
调试训练“微调损失没有下降”

最佳实践

  • 从提示词入手:微调成本高;先尝试更经济的方案

    • 改进提示词能否实现 80% 的目标?
    • 尝试在提示词中加入少样本示例
    • 对于知识类任务,可考虑使用 RAG
  • 质量胜于数量:100 个优秀示例胜过 10,000 个平庸示例

    • 每个示例都应达到黄金标准
    • 最好让人工核验示例
    • 删除任何你不希望模型学到的内容
  • 让格式符合使用场景:训练示例应反映真实用法

    • 提示词结构应与生产环境相同
    • 输入变化应符合实际情况
    • 明确覆盖边缘情况
  • 不要过度训练:轮数越多并不总是越好

    • 观察验证损失,留意过拟合
    • 从 1-3 个轮次开始
    • 验证指标趋于平稳时提前停止
  • 正确评估:训练损失并非目标

    • 使用留出的测试集
    • 在相同测试上与基线进行比较
    • 检查能力是否退化
    • 明确测试边缘情况
  • 对所有内容进行版本管理:微调是一个迭代过程

    • 为训练数据进行版本管理
    • 跟踪实验配置
    • 记录哪些方法有效,哪些无效

高级技术

LoRA(低秩适配)

针对大模型的高效微调:

from peft import LoraConfig, get_peft_model

lora_config = LoraConfig(
    r=16,                           # Rank of update matrices
    lora_alpha=32,                  # Scaling factor
    target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM"
)

# Apply LoRA to base model
model = get_peft_model(base_model, lora_config)

# Only ~0.1% of parameters are trainable
trainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad)
QLoRA(量化 LoRA)

在消费级硬件上微调大模型:

from transformers import BitsAndBytesConfig

bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16,
    bnb_4bit_use_double_quant=True
)

# Load model in 4-bit
model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf",
    quantization_config=bnb_config
)

# Apply LoRA on top
model = get_peft_model(model, lora_config)
指令微调数据集创建

将原始数据转换为指令格式:

def create_instruction_example(raw_data):
    return {
        "messages": [
            {
                "role": "system",
                "content": "You are a customer service agent for TechCorp..."
            },
            {
                "role": "user",
                "content": f"Customer inquiry: {raw_data['inquiry']}"
            },
            {
                "role": "assistant",
                "content": raw_data['ideal_response']
            }
        ]
    }

# Apply to dataset
instruction_dataset = [create_instruction_example(d) for d in raw_dataset]
评估框架

对微调模型进行全面评估:

def evaluate_fine_tuned_model(model, test_set, baseline_model=None):
    results = {
        "task_accuracy": [],
        "format_compliance": [],
        "style_match": [],
        "regression_check": []
    }

    for example in test_set:
        output = model.generate(example.input)

        # Task-specific accuracy
        results["task_accuracy"].append(
            check_correctness(output, example.expected)
        )

        # Format compliance
        results["format_compliance"].append(
            matches_expected_format(output)
        )

        # Style matching (for style transfer tasks)
        results["style_match"].append(
            style_similarity(output, example.expected)
        )

        # Regression on general capabilities
        if baseline_model:
            results["regression_check"].append(
                compare_general_capability(model, baseline_model, example)
            )

    return {k: np.mean(v) for k, v in results.items()}
课程学习

按难度排列训练数据:

def create_curriculum(dataset):
    # Score examples by complexity
    scored = [(score_complexity(ex), ex) for ex in dataset]
    scored.sort(key=lambda x: x[0])

    # Create epochs with increasing difficulty
    n = len(scored)
    curriculum = {
        "epoch_1": [ex for _, ex in scored[:n//3]],           # Easy
        "epoch_2": [ex for _, ex in scored[:2*n//3]],         # Easy + Medium
        "epoch_3": [ex for _, ex in scored],                   # All
    }
    return curriculum

需要避免的常见陷阱

  • 明明改进提示词就足够,却仍进行微调
  • 使用低质量或不一致的训练示例
  • 未留出合适的测试集
  • 训练轮数过多(导致过拟合)
  • 忽视微调导致的能力退化
  • 未对训练数据和配置进行版本管理
  • 期望微调能增加事实知识(应改用 RAG)
  • 使用与生产环境不匹配的数据进行微调

评论

支持 Markdown