阿里云百炼微调完整实战:从数据到部署
目录
- 什么是模型微调
- 微调 vs RAG:如何选择
- 环境准备
- 训练数据准备
- 创建微调任务
- 超参数配置详解
- 模型部署
- LangChain 调用微调模型
- 模型评测
- 常见问题
- 总结
一、什么是模型微调
模型微调(Supervised Fine-Tuning,简称 SFT)是指使用特定领域的数据,对已预训练的大模型进行进一步训练,使其更好地适应特定业务场景的技术。
1.1 微调能带来什么
优化目标 说明 示例
提升业务表现 让模型在特定行业表现更专业 医疗问答、法律咨询
降低输出延迟 减少提示词长度,加快推理 Few-shot → Zero-shot
抑制幻觉 减少模型编造不存在的信息 企业内部知识问答
对齐偏好 符合特定语气、表达习惯 客服话术、公文风格
1.2 支持的模型
根据阿里云百炼官方文档,以下模型支持微调:
模型名称 模型代码 SFT全参训练 SFT高效训练(LoRA)
千问3-32B qwen3-32b ✅ 支持 ✅ 支持
千问3-14B qwen3-14b ✅ 支持 ✅ 支持
千问3-VL-8B qwen3-vl-8b-instruct ✅ 支持 ✅ 支持
训练方式对比:
对比项 全参训练 (SFT) 高效训练 (LoRA)
适用场景 模型需要学习新能力,追求全局效果最优 优化特定场景,对训练时间和成本敏感
训练时间 较长,收敛速度慢 较短,收敛速度快
通用能力影响 较大,可能遗忘通用能力 较小,更好保留原有能力
数据量要求 较大 相对较小
推荐选择 数据量大、需要深度定制 初学者首选
二、微调 vs RAG:如何选择
这是每个开发者都会遇到的问题。两者不是互斥的,而是互补的:
对比维度 微调 (SFT) RAG 检索增强
工作方式 将知识"记住"到模型参数中 运行时动态检索知识库
知识更新 需要重新训练 实时,改文档即可
适用场景 固定格式、特定风格、表达习惯 知识频繁更新、长尾知识
成本模式 一次性训练 + 推理费用 持续检索 + 推理费用
最佳实践:阿里云百炼官方推荐先构建 RAG 应用试运行,收集足够数据后再用微调提升效果。两者可以结合使用:微调解决语气、风格、格式问题,RAG 解决专业知识问题。
三、环境准备
3.1 前提条件
- 已开通阿里云百炼服务
- 已获取 API Key(以 sk- 开头)
- (可选)已安装 Python 3.8+ 环境
3.2 安装依赖
如需通过 API 方式上传数据或调用模型:
bash
pip install dashscope requests -i https://pypi.tuna.tsinghua.edu.cn/simple
四、训练数据准备
4.1 数据格式:ChatML
阿里云百炼采用 ChatML 格式,每条数据是一个 JSON 对象,放在一行(.jsonl 文件要求每行一个 JSON)。
基本格式:
json
{"messages": [
{"role": "system", "content": "系统提示词(可选)"},
{"role": "user", "content": "用户问题"},
{"role": "assistant", "content": "期望的回答"}
]}
4.2 单轮对话示例
json
{"messages": [
{"role": "system", "content": "你是一个专业的Python编程助手"},
{"role": "user", "content": "写一个计算两个数之和的函数"},
{"role": "assistant", "content": "def add(a, b):\n return a + b"}
]}
4.3 多轮对话示例
json
{"messages": [
{"role": "system", "content": "你是一个友好的AI助手"},
{"role": "user", "content": "我叫小明"},
{"role": "assistant", "content": "你好小明!很高兴认识你"},
{"role": "user", "content": "我叫什么名字?"},
{"role": "assistant", "content": "你叫小明"}
]}
4.4 数据量要求
目的 建议数据量 说明
流程测试 几十条即可 验证上传、训练、部署能跑通
让模型学会新格式 至少上百条 让模型"记住"特定表达方式
正式微调 上千条优质数据 官方推荐:数据集最少需要上千条优质调优数据
⚠️ 重要:数据质量比数据量更重要。大量质量差的数据可能导致模型效果反而变差。
4.5 测试数据示例
创建 test_data.jsonl:
json
{"messages": [{"role": "user", "content": "Python中如何定义函数?"}, {"role": "assistant", "content": "使用 def 关键字,例如:def my_func(): pass"}]}
{"messages": [{"role": "user", "content": "什么是列表推导式?"}, {"role": "assistant", "content": "列表推导式是一种简洁创建列表的方式,例如:[x*2 for x in range(10)]"}]}
{"messages": [{"role": "user", "content": "如何安装pip包?"}, {"role": "assistant", "content": "使用 pip install 包名,例如:pip install requests"}]}
{"messages": [{"role": "user", "content": "什么是装饰器?"}, {"role": "assistant", "content": "装饰器是一种修改函数行为的函数,使用 @ 语法糖"}]}
{"messages": [{"role": "user", "content": "如何读取文件?"}, {"role": "assistant", "content": "使用 open() 函数,例如:with open('file.txt', 'r') as f: content = f.read()"}]}
4.6 验证数据格式
python
import json
with open('test_data.jsonl', 'r', encoding='utf-8') as f:
for i, line in enumerate(f, 1):
try:
data = json.loads(line.strip())
if 'messages' not in data:
print(f"第{i}行: 缺少 messages 字段")
elif not any(msg.get('role') == 'assistant' for msg in data['messages']):
print(f"第{i}行: 没有 assistant 回答")
else:
print(f"第{i}行: ✅ 格式正确")
except json.JSONDecodeError as e:
print(f"第{i}行: JSON格式错误 - {e}")
4.7 上传数据集
控制台上传(推荐新手):
- 访问 阿里云百炼控制台
- 左侧菜单 → 数据管理 → 新增数据集
- 选择类型:SFT-文本生成
- 上传 test_data.jsonl 文件
- 点击发布
API 上传(可选):
bash
curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/files \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
--form 'file=@"./test_data.jsonl"' \
--form 'purpose="fine-tune"'
五、创建微调任务
5.1 控制台创建
- 左侧菜单 → 模型调优 → 训练新模型
- 选择训练方式:SFT(有监督微调)
- 选择基础模型:qwen3-14b(推荐新手)
- 添加训练集(刚才上传的数据集)
- 配置超参数(新手可用默认值)
- 点击开始训练
5.2 训练方式选择建议
你的情况 推荐训练方式
初学者、数据量小(<1000条) 高效训练 (LoRA)
数据量大、需要深度定制 全参训练 (SFT)
希望保留模型通用能力 高效训练 (LoRA)
💡 经验之谈:高效训练(LoRA)能较好平衡训练时长和效果,一般建议选择高效训练。
六、超参数配置详解
6.1 常用超参数
参数 说明 推荐值 适用场景
n_epochs 训练轮数,模型遍历整个数据集的次数 小数据集(<1k条):3-5轮 大数据集(>1w条):1-2轮 数据集小可多跑几轮
learning_rate 学习率,控制权重调整幅度 高效训练:1e-4 ~ 1e-5 全参训练:1e-5 ~ 1e-6 学习率过大可能不收敛
batch_size 批次大小,每次训练处理的样本数 8、16、32(默认16) 取决于GPU显存
max_length 单条数据最大 token 长度 2048(默认),需要时可设8192 长文本场景需调大
lr_scheduler_type 学习率调度策略 "cosine"(默认)或 "linear" 通常默认即可
warmup_ratio 预热比例,初始阶段学习率从0逐步增加 0.05 ~ 0.1 帮助稳定初期训练
lora_rank LoRA 低秩矩阵的秩(仅LoRA) 8(默认),可调至64 值越大效果越好但更慢
6.2 新手配置模板
yaml
# 推荐新手使用的配置
training_type: efficient_sft # 高效训练
n_epochs: 3 # 训练3轮
learning_rate: 1e-4 # 学习率
batch_size: 16 # 批次大小
lora_rank: 8 # LoRA秩(默认即可)
💡 小贴士:如果您不了解超参数,阿里云百炼也提供一套基于实验所得的默认配置,您可以遵循默认配置进行首次训练。
七、模型部署
7.1 部署操作
- 在模型调优页面,找到训练成功的任务
- 点击部署
- 选择部署方式:
· 按量付费:适合测试,用多少付多少
· 包月:适合生产环境,用量大时更划算 - 等待部署完成(通常几分钟)
7.2 获取调用信息
部署成功后,你会得到:
· 模型名称(类似 qwen3-14b-finetuned-xxx,可在模型快照列表中查看)
· API 地址:https://dashscope.aliyuncs.com/compatible-mode/v1
· API Key:使用你的阿里云百炼 API Key
八、LangChain 调用微调模型
这是将微调成果应用到实际项目的关键一步。微调模型的使用方式和你之前学习的 LangChain 调用方式完全一致,只需更换 model 参数!
8.1 基础调用
python
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
load_dotenv()
# 只需要修改 model 参数!
model = ChatOpenAI(
model="qwen3-14b-finetuned-xxx", # ← 换成你的微调模型名称
openai_api_key=os.getenv("DASHSCOPE_API_KEY"),
openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
response = model.invoke([HumanMessage(content="Python中如何定义函数?")])
print(response.content)
8.2 结合 LangChain 高级功能
微调模型可以与 LangChain 的各种组件无缝配合:
python
from langchain.memory import ConversationBufferMemory
from langchain.chains import LLMChain
from langchain_core.prompts import ChatPromptTemplate
# 1. 添加对话记忆
memory = ConversationBufferMemory(return_messages=True)
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个智能助手"),
("human", "{input}")
])
chain = LLMChain(llm=model, prompt=prompt, memory=memory)
response = chain.invoke({"input": "你好"})
print(response['text'])
# 2. 结合输出解析器
from langchain_core.output_parsers import StrOutputParser
chain = prompt | model | StrOutputParser()
response = chain.invoke({"input": "介绍Python"})
print(response)
# 3. 结合 RAG(微调模型 + 知识库)
from langchain.chains import create_retrieval_chain
# ... 与之前学习的 RAG 代码相同
💡 关键点:微调模型与 LangChain 是无缝衔接的。你之前学习的所有功能------RAG、Agent、Memory、Chain------都可以直接使用微调模型,只需要改 model 参数。
九、模型评测
9.1 评测方式
模型微调完成后,建议进行评测以验证效果:
评测方式 说明 适用场景
人工评测 人工对比微调前后的回答质量 需要精细判断的场景
自动评测 使用标准评测集自动评分 快速验证、效果对比
在线测试 部署后调用 API 测试 真实业务场景验证
9.2 使用阿里云百炼评测
在控制台选择已部署的模型,提交评测任务即可:
- 模型调优页面 → 选择训练好的模型
- 点击模型评测
- 选择评测数据集(如 GSM8K)或上传自定义评测集
- 提交评测,等待结果
9.3 对比示例
以小学数学作业助手场景为例,SFT 前后的对比:
模型 GSM8K 评测分数
基模(未微调) 75.74
微调(3k条数据) 76.35
微调(10k条数据) 76.80
微调后模型数学能力有一定提升。
十、常见问题
Q1:微调需要多少数据?
官方建议:数据集最少需要上千条优质调优数据。但如果只是为了测试流程,几十条数据足以验证。
Q2:训练失败怎么办?
- 检查数据格式是否正确(用 Python 脚本验证 JSON 格式)
- 确保每条数据都有 assistant 回答
- 检查数据集是否已发布
- 查看控制台的错误提示
Q3:微调后效果反而变差?
可能原因:
· 过拟合:训练数据量太少或不够多样,或训练轮数过多
· 数据质量差:训练数据中存在错误
· 灾难性遗忘:模型丢失了通用能力
解决方法:提高数据质量,增加数据多样性,减少训练轮数,或使用混合训练方案。
Q4:微调 vs RAG 选哪个?
两者不是互斥的。官方推荐先构建 RAG 应用收集数据,再通过微调提升效果。微调解决格式、风格问题,RAG 解决知识更新问题。
Q5:微调的费用如何?
按训练数据量计费:
· 千问3-14B:$0.0016/千Token
· 千问3-32B:$0.008/千Token
最小计费单位为 1 token。训练费用 = 训练数据 Token 总数 × 循环次数 × 训练单价。
Q6:如何提高微调效果?
- 提升数据质量:宁缺毋滥,确保每条数据正确无误
- 增加数据多样性:覆盖不同场景,避免数据雷同
- 调整超参数:学习率从 1e-4 开始尝试,epoch 从 3 轮开始
- 选用更大参数的模型:如 qwen3-32b 效果通常更好
十一、与已有技能的联系
将微调与你学过的内容串联起来:
你学过的技能 微调后如何应用
LangChain 基础调用 模型名换成微调模型即可
RAG 检索增强 微调模型可以更好地理解检索到的内容并按照特定格式回答
Agent 智能代理 微调模型执行工具调用更稳定,格式更规范
输出解析器 微调模型可以直接按 JSON 格式输出,解析成功率更高
多模态文生图/图生图 微调模型可以与图像生成配合,实现图文混合场景
十二、总结
本文完成了阿里云百炼微调的完整流程:
步骤 操作 状态
1 环境准备与 API Key 配置 ✅
2 训练数据准备(ChatML 格式) ✅
3 上传数据集 ✅
4 创建微调任务 ✅
5 超参数配置 ✅
6 模型部署 ✅
7 LangChain 调用微调模型 ✅
8 模型评测 ✅
关键流程图:
┌─────────────────────────────────────────────────────────────────┐
│ 阿里云百炼微调全流程 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 阶段一:准备数据 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 准备问答对 │ -> │ 格式化为 │ -> │ 上传到 │ │
│ │ (至少上千条) │ │ JSONL格式 │ │ 数据管理 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │ │
│ ▼ │
│ 阶段二:创建任务 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 选择SFT训练 │ -> │ 选择基础模型 │ -> │ 配置超参数 │ │
│ │ (高效训练) │ │ (qwen3-14b) │ │ (可用默认) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │ │
│ ▼ │
│ 阶段三:部署与调用 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 训练完成 │ -> │ 部署为API │ -> │ LangChain │ │
│ │ (等待完成) │ │ (按量/包月) │ │ 一行调用 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
核心代码模板(LangChain 调用微调模型):
python
from langchain_openai import ChatOpenAI
# 只需要修改 model 参数!
model = ChatOpenAI(
model="qwen3-14b-finetuned-xxx", # ← 你的微调模型名称
openai_api_key=os.getenv("DASHSCOPE_API_KEY"),
openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
response = model.invoke("你的问题")
print(response.content)