PAGE 12 · 高级

🛠️ 模型微调与量化

Fine-tuning & Quantization — 用少量资源让通用大模型适配你的专属场景,
从 LoRA 到 GGUF,从原理到实战的完整进阶指南

🤔 一、为什么需要微调?

预训练大语言模型(如 LLaMA、GPT、Qwen)经过海量文本训练,掌握了通用的语言理解和生成能力。但在实际应用中,我们通常需要模型在特定领域(如医疗、法律、金融)或特定任务(如代码生成、风格改写)上有更出色的表现。这就是微调的价值所在。

🌐 通用性 vs 🎯 专业性

预训练模型就像一个通才毕业生——什么都知道一些,但不够精通。微调就像送他去读一个专业研究生,让他在某个领域成为专家。

例如:通用模型可能知道"Python"是一种编程语言,但经过微调后,它能精准生成符合你公司代码规范的 Python 代码。

核心动机
💰 成本 vs 效果

从零训练一个大模型需要数千张 GPU 和数周时间,成本高达数百万美元。而微调只需少量领域数据相对少量算力(甚至单张消费级 GPU),就能获得巨大的效果提升。

性价比之王
🔐 数据隐私

企业内部数据(如客户对话记录、内部文档)不能上传到第三方 API。通过微调开源模型,可以在本地环境中使用私有数据训练专属模型,完全掌控数据安全。

安全可控

微调 vs Prompt Engineering vs RAG:选择指南

Q

你的需求是让模型改变行为方式(如说话风格、输出格式、特定任务能力),还是补充知识

→ 改变行为:微调 ✓ | 补充知识:RAG ✓

Q

你是否只有少量示例(<100 条)需要模型学习?

→ 是:先尝试 Few-shot Prompting,不够再微调

Q

你的推理延迟成本预算是否极度敏感?

→ 是:Prompt Engineering(无额外推理开销)> RAG(增加检索延迟)> 微调(模型不变)

💡

最佳实践:先用 Prompt Engineering 快速验证,再叠加 RAG 补充知识,最后在效果瓶颈时考虑微调。三者可以组合使用。

维度 📝 Prompt Engineering 🔍 RAG 🛠️ 微调
实现成本 ⭐ 极低(改提示词) ⭐⭐ 中等(需搭建检索) ⭐⭐⭐ 较高(需训练)
知识更新 ❌ 困难(受限于上下文) ✅ 容易(更新知识库) ❌ 需重新训练
行为定制 ⚠️ 有限 ⚠️ 有限 ✅ 非常灵活
数据需求 文档库 数百 ~ 数万条训练样本
推理延迟 不变 增加检索延迟 不变
适合场景 快速原型、简单任务 知识问答、文档检索 风格定制、专业任务

💡 什么时候该微调?

① 需要模型稳定地以特定风格/格式输出;② 有足够的高质量训练数据(≥ 500 条);③ Prompt Engineering 和 RAG 已达到效果天花板;④ 需要降低推理时的 Prompt 长度(将"规则"写入权重)。

🏋️ 二、全量微调(Full Fine-tuning)

全量微调是最直接的微调方式:解冻预训练模型的所有参数,用任务特定的数据继续训练。模型的所有权重(可能达到数百亿个参数)都会被更新。

θfinetuned = θpretrained − η · ∇L(θpretrained, Dtask)

其中 θ 为模型参数,η 为学习率,L 为任务损失函数,Dtask 为任务数据。

✅ 优点
  • 效果上限最高——理论上能最大化利用训练数据
  • 实现简单,直接调用标准训练流程
  • 对模型架构无特殊要求
❌ 缺点
  • GPU 内存需求巨大(7B 模型需 ~28GB 显存用于训练)
  • 容易灾难性遗忘(Catastrophic Forgetting)
  • 每个任务需要存储一份完整模型副本
  • 训练时间长,成本高

资源需求参考

模型大小 参数量 训练显存需求(FP32) 训练显存需求(混合精度) 推荐 GPU
小模型 1.3B ~5 GB ~8 GB RTX 3060 / 4060
中型模型 7B ~28 GB ~40 GB RTX 4090 / A100-40G
大型模型 13B ~52 GB ~80 GB 2× A100-80G
超大型模型 70B ~280 GB ~350 GB 4-8× A100-80G

⚠️ 灾难性遗忘:全量微调时,模型在学新任务的同时,可能会"遗忘"预训练时学到的通用知识。这是全量微调最严重的副作用之一。

适用场景:数据充足(≥ 10K 条)、算力充足、对效果上限有极致要求、且有完善评估体系防止过拟合和遗忘的情况。

三、参数高效微调(PEFT)

全量微调的代价太高了。能不能只训练一小部分参数,同时达到接近全量微调的效果?PEFT(Parameter-Efficient Fine-Tuning)就是答案。

💡 核心思想:冻结预训练模型的大部分参数(主权重),只训练少量新增的参数(适配器/低秩矩阵/前缀),大幅降低计算和存储开销。

3.1 LoRA(Low-Rank Adaptation)

LoRA 是目前最流行的 PEFT 方法,由 Hu 等人于 2021 年提出[1]。其核心洞察是:模型微调时的权重变化量 ΔW 具有低秩特性(intrinsic dimensionality 很低)。

W' = W + ΔW = W + B · A
其中 W ∈ Rd×k(冻结),A ∈ Rr×k,B ∈ Rd×r(可训练),r ≪ min(d, k)
🧊
原始权重 W
d×k,冻结不动
+ 低秩适应 ΔW
B·A,仅训练此部分
微调后 W'
效果接近全量微调
✅ LoRA 优点
  • 参数量减少 10,000 倍(7B 模型仅需 ~4M 可训练参数)
  • 效果接近甚至匹配全量微调
  • 训练速度大幅提升
  • 多个任务可共享基础模型,只切换 LoRA 适配器
  • 推理时无额外延迟(可合并权重)
⚠️ 注意事项
  • 秩 r 的选择需要调参(通常 8 ~ 64)
  • 对不同层施加 LoRA 的策略(target modules)影响效果
  • 极端情况下不如全量微调

来看一个使用 PEFT + Transformers 库实现 LoRA 的代码示例:

Python · LoRA 配置# pip install peft transformers datasets bitsandbytes

from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model, TaskType

# 1. 加载基础模型(以 Qwen2.5-7B 为例)
model_name = "Qwen/Qwen2.5-7B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype="auto",
    device_map="auto"
)

# 2. 配置 LoRA
lora_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    r=16,                    # 秩(rank),越大越灵活,但也越慢
    lora_alpha=32,           # 缩放因子,通常设为 2 × r
    lora_dropout=0.05,       # Dropout 防止过拟合
    target_modules=[            # 对哪些层加 LoRA
        "q_proj", "k_proj",     # Attention 的 Q/K 投影
        "v_proj", "o_proj",     # Attention 的 V/O 投影
        "gate_proj", "up_proj", # FFN 层
        "down_proj",
    ],
    bias="none",
)

# 3. 应用 LoRA 到模型
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# 输出: trainable params: 4,194,304 || all params: 7,616,724,992
      trainable%: 0.0551%

📊 关键数据:一个 7B 模型总参数约 76 亿,但 LoRA 只需训练约 420 万个参数(0.055%),却能取得接近全量微调的效果![1]

3.2 QLoRA(Quantized LoRA)

QLoRA 由 Dettmers 等人于 2023 年提出[2],是 LoRA 的"升级版"——在4-bit 量化的模型上做 LoRA 微调。这使得在单张 48GB GPU(如 RTX 6000 Ada)上微调 65B 参数的模型成为可能。

QLoRA = 4-bit NF4 量化 + 双重量化 + 分页优化器 + LoRA
🧊 4-bit NF4 量化

使用 NormalFloat4 数据类型,一种信息论最优的 4-bit 数据类型,专为正态分布权重设计。精度损失极小。

🔄 双重量化(Double Quantization)

对量化常数(quantization constants)再次量化,每个参数再节省 0.37 bit,总共为 65B 模型节省约 3GB 显存。

📄 分页优化器

利用 NVIDIA 统一内存,当 GPU 显存不足时自动将优化器状态转移到 CPU 内存,避免 OOM 崩溃。

Python · QLoRA 微调# pip install peft transformers datasets bitsandbytes accelerate

from transformers import AutoModelForCausalLM, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training

# 1. 4-bit 量化配置
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",           # NormalFloat4
    bnb_4bit_compute_dtype="bfloat16",    # 计算精度
    bnb_4bit_use_double_quant=True,        # 双重量化
)

# 2. 以 4-bit 加载模型
model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen2.5-7B-Instruct",
    quantization_config=bnb_config,
    device_map="auto"
)

# 3. 为 k-bit 训练做准备
model = prepare_model_for_kbit_training(model)

# 4. 配置 LoRA(与普通 LoRA 相同)
lora_config = LoraConfig(
    r=16,
    lora_alpha=32,
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM",
)
model = get_peft_model(model, lora_config)

# 5. 正常训练...

🔥 QLoRA 里程碑:论文中,作者在单张 48GB GPU 上成功微调了 65B 参数的 LLaMA 模型,达到了与 16-bit 全量微调相当的效果。这一成果让更多人拥有了微调大模型的能力。[2]

3.3 其他 PEFT 方法

方法 核心思想 可训练参数占比 效果 推理开销
LoRA 在权重旁加低秩矩阵 B·A ~0.05% ⭐⭐⭐⭐⭐ 无(可合并)
QLoRA 4-bit 量化基础模型 + LoRA ~0.05% ⭐⭐⭐⭐½ 无(可合并)
Adapter 在 Transformer 层间插入小型全连接网络 ~3-5% ⭐⭐⭐⭐ 轻微增加延迟
Prefix Tuning 在每层前面加可训练的前缀向量 ~0.1% ⭐⭐⭐½
P-Tuning v2 深层 Prefix Tuning,每层都加前缀 ~0.1-1% ⭐⭐⭐⭐

💡 推荐选择:对于大多数场景,QLoRA 是首选方案——显存占用最低、效果优秀、社区生态最完善。如果你需要极致效果且算力充足,再考虑全量微调。

📦 四、模型量化(Quantization)

大模型推理的瓶颈不仅在算力,更在内存带宽。一个 7B 模型在 FP32 下需要 ~28GB 内存,而量化到 INT4 后只需 ~3.5GB——这意味着可以在消费级硬件上运行更大的模型。

4.1 量化基础概念

量化就是降低数值的表示精度,让模型用更少的 bit 来存储权重和激活值。

🔷
FP32
32-bit 浮点 · 28GB (7B)
🔷
FP16 / BF16
16-bit · 14GB (7B)
🟩
INT8
8-bit 整数 · 7GB (7B)
🟨
INT4
4-bit 整数 · 3.5GB (7B)

⚖️ 核心权衡:精度 vs 速度 vs 内存。量化越多 → 内存越省、速度越快 → 但精度损失越大。关键是找到最佳平衡点

FP32 精度
100%
FP16 精度
~99.5%
INT8 精度
~99%
INT4 精度
~97%
INT2 精度
~90%

4.2 训练后量化(Post-Training Quantization, PTQ)

PTQ 在模型训练完成后进行量化,不需要重新训练,是最常用的量化方式。主要方法有三种:

🎯 GPTQ[3]

基于近似二阶信息的量化。通过最小化每一层的权重误差来选择最优量化参数,是一种逐层量化(layer-wise)的方法。

优点:量化质量高,广泛支持。缺点:量化过程较慢(需要校准数据)。

精度优先 逐层量化
📊 AWQ(Activation-aware)[4]

激活感知量化。核心洞察:并非所有权重同等重要——只有 1% 的显著权重通道(salient channels)对输出影响最大。AWQ 保护这些关键通道不被过度量化。

优点:相同 bit 下精度更高。缺点:需要额外的激活值分析。

性能领先 ICLR 2024
✂️ 简单量化(Round-to-nearest)

最直接的量化方式——将权重直接截断到目标精度。quantized = round(weight / scale) * scale

优点:速度极快,无需校准数据。缺点:精度损失最大。

速度优先

4.3 量化训练(Quantization-Aware Training, QAT)

QAT 在训练过程中就考虑量化的影响,通过在训练图中插入伪量化节点(fake quantization nodes),让模型学会适应低精度表示。

✅ 优点
  • 量化后精度损失最小
  • 模型能"学会"在低精度下更好地工作
❌ 缺点
  • 需要完整的训练流程(成本高)
  • 实现复杂度高
  • 在 LLM 时代使用较少

4.4 GGUF 格式

GGUF(GPT-Generated Unified Format)是 llama.cpp 项目定义的模型文件格式,也是 Ollama 等工具的底层格式。它将模型权重以多种量化级别打包成单个文件,方便在 CPU 和混合环境下高效推理。

量化级别 每参数 bit 数 7B 模型文件大小 质量 推荐场景
Q2_K ~2.6 bit ~2.4 GB ⭐⭐ 仅测试 / 极限硬件
Q3_K_M ~3.4 bit ~3.1 GB ⭐⭐½ 内存极其受限
Q4_K_M ~4.8 bit ~4.4 GB ⭐⭐⭐⭐ 🏆 最推荐 · 质量与大小平衡
Q5_K_M ~5.7 bit ~5.2 GB ⭐⭐⭐⭐½ 质量优先
Q6_K ~6.6 bit ~6.0 GB ⭐⭐⭐⭐⭐ 接近 FP16
Q8_0 8.5 bit ~7.7 GB ⭐⭐⭐⭐⭐ 几乎无损
F16 16 bit ~14 GB ⭐⭐⭐⭐⭐ 无量化(基准参考)

💡 推荐选择:Q4_K_M 是性价比最高的量化级别——模型大小约为原始的 1/3,但质量保持在 95% 以上。如果你的硬件允许,Q5_K_M 或 Q6_K 是更好的选择。

4.5 量化方法效果对比

方法 位数 精度损失 推理加速 内存节省 实现难度
FP16 半精度 16-bit 几乎无损 ~2× 50% ⭐ 极易
INT8 (PTQ) 8-bit ~1% ~2-3× 75% ⭐⭐ 简单
GPTQ (INT4) 4-bit ~2-3% ~3-4× ~87% ⭐⭐ 中等
AWQ (INT4) 4-bit ~1-2% ~3-4× ~87% ⭐⭐ 中等
GGUF Q4_K_M ~4.8-bit ~3% ~3× ~85% ⭐ 极易
QAT (INT8) 8-bit <1% ~2-3× 75% ⭐⭐⭐ 较难

🚀 五、实战指南

5.1 用 LoRA 微调一个模型(完整代码)

下面展示一个完整的 LoRA 微调流程,包括数据准备、模型加载、训练、合并权重和测试。

准备数据

将数据整理为指令-回复对格式。这里使用 HuggingFace 的 datasets 库加载:

Python · 数据准备from datasets import load_dataset

# 方式1: 从 HuggingFace Hub 加载
dataset = load_dataset("tatsu-lab/alpaca", split="train")

# 方式2: 从本地 JSON 文件加载
# dataset = load_dataset("json", data_files="my_data.json", split="train")

# 格式化为对话模板
def format_example(example):
    return {
        "text": f"""<|im_start|>system
你是一个有帮助的AI助手。<|im_end|>
<|im_start|>user
{example['instruction']}{example['input']}<|im_end|>
<|im_start|>assistant
{example['output']}<|im_end|>"""
    }

dataset = dataset.map(format_example)
# 选取子集用于快速实验
dataset = dataset.select(range(10000))

加载模型 + 配置 LoRA + 训练

Python · 训练from transformers import (
    AutoModelForCausalLM, AutoTokenizer,
    TrainingArguments, BitsAndBytesConfig, DataCollatorForSeq2Seq
)
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
from trl import SFTTrainer

# QLoRA 量化配置
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype="bfloat16",
    bnb_4bit_use_double_quant=True,
)

# 加载模型和分词器
model_name = "Qwen/Qwen2.5-7B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
tokenizer.pad_token = tokenizer.eos_token

model = AutoModelForCausalLM.from_pretrained(
    model_name,
    quantization_config=bnb_config,
    device_map="auto",
    trust_remote_code=True,
)
model = prepare_model_for_kbit_training(model)

# LoRA 配置
lora_config = LoraConfig(
    r=16,
    lora_alpha=32,
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj",
                    "gate_proj", "up_proj", "down_proj"],
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM",
)

# 训练参数
training_args = TrainingArguments(
    output_dir="./lora_output",
    num_train_epochs=3,
    per_device_train_batch_size=4,
    gradient_accumulation_steps=4,      # 等效 batch_size=16
    learning_rate=2e-4,
    lr_scheduler_type="cosine",
    warmup_ratio=0.03,
    fp16=True,
    logging_steps=10,
    save_strategy="epoch",
    gradient_checkpointing=True,         # 节省显存
    optim="paged_adamw_8bit",             # 8bit 优化器
    max_seq_length=2048,
)

# 开始训练
trainer = SFTTrainer(
    model=model,
    train_dataset=dataset,
    args=training_args,
    peft_config=lora_config,
    dataset_text_field="text",
    max_seq_length=2048,
)
trainer.train()
trainer.model.save_pretrained("./lora_adapter")  # 保存 LoRA 权重

合并权重

训练完成后,可以将 LoRA 权重合并到基础模型中,得到一个独立的完整模型:

Python · 合并权重from peft import PeftModel

# 加载基础模型 + LoRA 适配器
base_model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype="auto",
    device_map="auto",
)
model = PeftModel.from_pretrained(base_model, "./lora_adapter")

# 合并权重并保存
merged_model = model.merge_and_unload()
merged_model.save_pretrained("./merged_model")
tokenizer.save_pretrained("./merged_model")
# 得到一个独立的模型,不再需要 PEFT 库即可加载

测试推理

Python · 推理测试# 加载合并后的模型
model = AutoModelForCausalLM.from_pretrained(
    "./merged_model",
    torch_dtype="auto",
    device_map="auto",
)
tokenizer = AutoTokenizer.from_pretrained("./merged_model")

prompt = "<|im_start|>user\n什么是机器学习?<|im_end|>\n<|im_start|>assistant\n"
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)

outputs = model.generate(
    **inputs,
    max_new_tokens=512,
    temperature=0.7,
    top_p=0.9,
    do_sample=True,
)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(response)

5.2 用 Ollama 运行量化模型

Ollama 是最流行的本地 LLM 运行工具之一,底层使用 llama.cpp 和 GGUF 格式,让量化模型的部署变得极其简单。

安装 Ollama

Bash · 安装 Ollama# macOS / Linux
curl -fsSL https://ollama.com/install.sh | sh

# 安装后验证
ollama --version

下载并运行模型

Bash · 运行模型# 下载 Qwen2.5 7B 的 Q4_K_M 量化版
ollama pull qwen2.5:7b

# 交互式对话
ollama run qwen2.5:7b

# 单次提问
ollama run qwen2.5:7b "用 Python 写一个快速排序"

# 查看 GPU 使用情况
ollama ps

# 其他常用模型
ollama pull llama3.1:8b      # LLaMA 3.1 8B
ollama pull mistral:7b        # Mistral 7B
ollama pull deepseek-r1:14b   # DeepSeek R1 14B
ollama pull gemma2:9b         # Gemma 2 9B

通过 API 调用

Ollama 启动后自动提供 OpenAI 兼容的 API 接口:

Bash · API 调用# 兼容 OpenAI 格式的 API
curl http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen2.5:7b",
    "messages": [
      {"role": "user", "content": "你好,介绍一下自己"}
    ]
  }'
Python · OpenAI SDK 调用 Ollamafrom openai import OpenAI

client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama",  # Ollama 不需要真实 key
)

response = client.chat.completions.create(
    model="qwen2.5:7b",
    messages=[
        {"role": "user", "content": "什么是量化?"}
    ]
)
print(response.choices[0].message.content)

📋 六、微调数据准备

微调的效果,80% 取决于数据质量。好的数据准备是微调成功的关键。

6.1 数据格式要求

大多数微调框架要求将数据整理为指令-回复对(Instruction-Response pairs)格式:

JSON · 微调数据格式[
  {
    "instruction": "将以下句子翻译成英文",
    "input": "今天天气真好,适合出去散步。",
    "output": "The weather is great today, perfect for a walk."
  },
  {
    "instruction": "请总结以下文本",
    "input": "人工智能(AI)是计算机科学的一个分支...",
    "output": "AI 是计算机科学的研究方向,致力于创建能模拟人类智能的系统。"
  }
]

也可以使用多轮对话格式:

JSON · 多轮对话格式{
  "messages": [
    {"role": "system", "content": "你是一个专业的法律顾问。"},
    {"role": "user", "content": "劳动合同到期不续签有补偿吗?"},
    {"role": "assistant", "content": "根据《劳动合同法》第46条..."}
  ]
}

6.2 数据质量 > 数据数量

🥇 黄金法则:1000 条高质量数据 > 10000 条低质量数据。噪声数据(错误答案、格式混乱、重复内容)会直接损害模型效果。

✅ 好数据
  • 答案准确、完整、一致
  • 覆盖多样的问题类型和场景
  • 格式统一、无噪声
  • 指令清晰无歧义
  • 长度分布合理
❌ 坏数据
  • 答案含糊或错误
  • 大量重复或高度相似
  • 格式混乱、字段缺失
  • 指令不清晰或自相矛盾
  • 过长或过短

6.3 数据清洗

在训练前,务必对数据进行清洗。关键步骤包括:

步骤 操作 工具/方法
去重 删除高度相似的样本 MinHash, SimHash, embedding 相似度
质量过滤 移除低质量样本 perplexity 过滤、规则匹配、LLM-as-Judge
格式统一 确保所有样本格式一致 自定义脚本、正则表达式
隐私脱敏 移除个人信息 正则匹配、NER 模型
长度过滤 移除过长或过短的样本 字符数/token 数阈值
多样性检查 确保覆盖各种场景 聚类分析、embedding 可视化

6.4 合成数据(Synthetic Data)

当真实数据不足时,可以用更强的模型(如 GPT-4、Claude)生成合成训练数据。这是扩大数据集的有效手段。

Python · 用 LLM 生成合成数据from openai import OpenAI
import json

client = OpenAI()

# 定义种子问题(你已有的少量真实问题)
seed_topics = [
    "Python 的列表推导式用法",
    "SQL JOIN 的区别",
    "React 的 useEffect 钩子",
    "Git rebase vs merge",
    "Docker 容器化部署",
]

synthetic_data = []
for topic in seed_topics:
    response = client.chat.completions.create(
        model="gpt-4",
        messages=[
            {"role": "system", "content": "你是一个技术问答专家。请针对给定的主题,生成3个不同难度的问题和详细回答。输出JSON数组格式。"},
            {"role": "user", "content": topic}
        ]
    )
    synthetic_data.append(response.choices[0].message.content)

# 保存合成数据
with open("synthetic_data.json", "w") as f:
    json.dump(synthetic_data, f, ensure_ascii=False, indent=2)

⚠️ 合成数据的注意事项:

  • 合成数据可能放大模型的偏见和错误,务必人工审核
  • 过度依赖单一模型生成会导致分布单一,建议使用多个不同的模型/提示词
  • 合成数据应作为补充而非替代真实数据
  • 注意模型蒸馏的边界——避免直接复制 licensed 模型的输出

🎯 数据量建议:

  • 风格微调:500 ~ 2,000 条高质量样本即可
  • 领域适应:2,000 ~ 10,000 条
  • 新能力学习:10,000 ~ 100,000 条
  • 全量微调:100,000+ 条

📚 参考文献

  1. Hu, E. J. et al. (2021). "LoRA: Low-Rank Adaptation of Large Language Models." ICLR 2022. arXiv:2106.09685
  2. Dettmers, T. et al. (2023). "QLoRA: Efficient Finetuning of Quantized Language Models." NeurIPS 2023. arXiv:2305.14314
  3. Frantar, E. et al. (2023). "GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers." ICLR 2023. arXiv:2210.17323
  4. Lin, J. et al. (2023). "AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration." ICLR 2024. arXiv:2306.00978
  5. Houlsby, N. et al. (2019). "Parameter-Efficient Transfer Learning for NLP." ICML 2019. arXiv:1902.00751(Adapter 方法)
  6. Li, X. L. & Liang, P. (2021). "Prefix-Tuning: Optimizing Continuous Prompts for Generation." ACL 2021. arXiv:2101.00190
  7. Liu, X. et al. (2022). "P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Across Scales and Tasks." ACL 2022. arXiv:2110.07602