阿里云百炼微调完整实战:从数据到部署

阿里云百炼微调完整实战:从数据到部署

目录

  1. 什么是模型微调
  2. 微调 vs RAG:如何选择
  3. 环境准备
  4. 训练数据准备
  5. 创建微调任务
  6. 超参数配置详解
  7. 模型部署
  8. LangChain 调用微调模型
  9. 模型评测
  10. 常见问题
  11. 总结

一、什么是模型微调

模型微调(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 前提条件

  1. 已开通阿里云百炼服务
  2. 已获取 API Key(以 sk- 开头)
  3. (可选)已安装 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 上传数据集

控制台上传(推荐新手):

  1. 访问 阿里云百炼控制台
  2. 左侧菜单 → 数据管理 → 新增数据集
  3. 选择类型:SFT-文本生成
  4. 上传 test_data.jsonl 文件
  5. 点击发布

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 控制台创建

  1. 左侧菜单 → 模型调优 → 训练新模型
  2. 选择训练方式:SFT(有监督微调)
  3. 选择基础模型:qwen3-14b(推荐新手)
  4. 添加训练集(刚才上传的数据集)
  5. 配置超参数(新手可用默认值)
  6. 点击开始训练

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 部署操作

  1. 在模型调优页面,找到训练成功的任务
  2. 点击部署
  3. 选择部署方式:
    · 按量付费:适合测试,用多少付多少
    · 包月:适合生产环境,用量大时更划算
  4. 等待部署完成(通常几分钟)

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 使用阿里云百炼评测

在控制台选择已部署的模型,提交评测任务即可:

  1. 模型调优页面 → 选择训练好的模型
  2. 点击模型评测
  3. 选择评测数据集(如 GSM8K)或上传自定义评测集
  4. 提交评测,等待结果

9.3 对比示例

以小学数学作业助手场景为例,SFT 前后的对比:

模型 GSM8K 评测分数

基模(未微调) 75.74

微调(3k条数据) 76.35

微调(10k条数据) 76.80

微调后模型数学能力有一定提升。

十、常见问题

Q1:微调需要多少数据?

官方建议:数据集最少需要上千条优质调优数据。但如果只是为了测试流程,几十条数据足以验证。

Q2:训练失败怎么办?

  1. 检查数据格式是否正确(用 Python 脚本验证 JSON 格式)
  2. 确保每条数据都有 assistant 回答
  3. 检查数据集是否已发布
  4. 查看控制台的错误提示

Q3:微调后效果反而变差?

可能原因:

· 过拟合:训练数据量太少或不够多样,或训练轮数过多

· 数据质量差:训练数据中存在错误

· 灾难性遗忘:模型丢失了通用能力

解决方法:提高数据质量,增加数据多样性,减少训练轮数,或使用混合训练方案。

Q4:微调 vs RAG 选哪个?

两者不是互斥的。官方推荐先构建 RAG 应用收集数据,再通过微调提升效果。微调解决格式、风格问题,RAG 解决知识更新问题。

Q5:微调的费用如何?

按训练数据量计费:

· 千问3-14B:$0.0016/千Token

· 千问3-32B:$0.008/千Token

最小计费单位为 1 token。训练费用 = 训练数据 Token 总数 × 循环次数 × 训练单价。

Q6:如何提高微调效果?

  1. 提升数据质量:宁缺毋滥,确保每条数据正确无误
  2. 增加数据多样性:覆盖不同场景,避免数据雷同
  3. 调整超参数:学习率从 1e-4 开始尝试,epoch 从 3 轮开始
  4. 选用更大参数的模型:如 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)

相关推荐
天天爱吃肉82186 小时前
笔记:同步电机调试时电角度校正方法说明
大数据·人工智能·笔记·功能测试·嵌入式硬件·汽车
qcx236 小时前
Warp源码深度解析(五):Feature Flag分层发布、热重载Settings与双版本Completer
网络·人工智能·rust·warp·ai infra
念恒123066 小时前
Python(简单判断) —— 从 if 开始
python·学习
卷卷说风控6 小时前
【卷卷观察】OpenAI扑进AWS怀里:AI平台战争进入贴身肉搏期
人工智能·云计算·aws
小贺儿开发6 小时前
Unity3D 本地 Stable Diffusion 文生图效果演示
人工智能·unity·stable diffusion·文生图·ai绘画·本地化
机器小乙6 小时前
AI客户端架构演进:从套壳插件到C++原生护城河
c++·人工智能·架构
liudanzhengxi6 小时前
AI代码生成的安全陷阱与应对
人工智能
BU摆烂会噶6 小时前
【LangGraph】线程级持久化深度实战(PostgreSQL + 重放机制)
数据库·人工智能·python·postgresql·langchain
旺财矿工6 小时前
高效搭建:OpenClaw 2.6.6 Windows 11 一键安装教程
人工智能·自动化·ai自动化·openclaw·小龙虾