更新于

OpenAI Fine-Tuning 国内使用指南


Fine-Tuning(微调)是很多开发者听说过、但真正上手前会犹豫的功能——门槛看起来比普通 API 调用高不少:要准备数据集、要花钱训练、还要判断值不值得。本文把这套流程讲清楚,重点回答两个问题:你是否真的需要微调,以及国内开发者通过中转服务使用时要注意什么

一、先问自己:真的需要微调吗

微调不是”效果不好就上”的万能药。上手之前先排除更便宜的替代方案:

  • 效果不稳定、格式不对 → 大概率是 Prompt 写得不够精确,先优化 Prompt 和 Structured Outputs 约束输出格式,成本几乎为零
  • 需要模型了解私有知识/文档 → 用 RAG 而不是微调,知识更新只需要改向量库,不用重新训练
  • 需要模型学会一种特定的风格、语气、任务模式(且这种模式很难用 Prompt 描述清楚) → 这才是微调真正擅长的场景,比如统一客服话术、把非结构化文本稳定转成特定格式、压缩长 Prompt 变成短指令

一个经验判断:如果你能把需求写成一段清晰的 Prompt 并且效果达标,就不需要微调;如果同样的效果需要几百字的 Prompt 反复调试还是不稳定,微调可能更划算。

二、Fine-Tuning 的工作原理

OpenAI 的微调流程本质是”在基础模型上用你的数据做增量训练”,分四步:

  1. 准备数据集:JSONL 格式,每行是一条 messages 对话样本,格式和 Chat Completions 请求体一致
  2. 上传文件:通过 /v1/files 接口上传训练数据
  3. 创建训练任务:调用 /v1/fine_tuning/jobs,指定基础模型和训练文件
  4. 调用微调后的模型:训练完成后得到一个专属模型 ID(形如 ft:gpt-4o-mini:xxx),像调用普通模型一样调用它
from openai import OpenAI
client = OpenAI(api_key="你的Key", base_url="https://api.yotradeapi.com/v1")

# 第一步:上传训练数据
file = client.files.create(
    file=open("training_data.jsonl", "rb"),
    purpose="fine-tune"
)

# 第二步:创建微调任务
job = client.fine_tuning.jobs.create(
    training_file=file.id,
    model="gpt-4o-mini-2024-07-18"
)

# 第三步:轮询任务状态
status = client.fine_tuning.jobs.retrieve(job.id)
print(status.status)  # "running" -> "succeeded"

三、数据集怎么准备

数据质量直接决定微调效果,几个关键要求:

  • 数量:官方建议至少 10 条起步能跑通流程,但要看到稳定效果通常需要 50–数百条高质量样本,样本质量比数量更重要
  • 格式一致性:每条样本的 system/user/assistant 结构要和你线上实际调用时的结构完全一致,否则训练出来的模型在生产环境表现和训练时不符
  • 覆盖边界情况:不要只喂”标准答案”样本,把容易出错的边界case也纳入训练集,模型才能学到正确的处理方式
  • 避免数据泄漏:训练集和后续评估集要分开,否则你看到的”效果好”只是模型记住了训练数据

四、费用结构:训练费 + 更贵的调用费

微调的费用分两部分,很多人只算了第一部分就低估了总成本:

阶段计费方式说明
训练按训练 token 数一次性收费通常是基础模型输入价格的数倍,一次性支出
调用(推理)按每次调用的 token 数收费通常比基础模型贵 1.5–2 倍,且是长期持续支出

容易被忽略的是第二部分:微调后的模型每次调用都比原模型贵,如果调用量大,长期算下来可能比”用更聪明的 Prompt + 便宜模型”更贵。建议先用小数据集跑通流程、估算清楚长期调用成本,再决定要不要正式上线。

五、国内开发者通过中转服务使用时的关键限制

通过 API 中转服务调用 OpenAI 时,日常聊天、Chat Completions 这类接口基本没有障碍,但 Fine-Tuning 涉及文件上传、长时间训练任务、专属模型 ID 管理,对中转服务的接口覆盖范围要求更高。使用前务必确认几点:

  1. 中转服务是否代理 /v1/files/v1/fine_tuning/jobs 这两类接口,不是所有中转都覆盖训练类接口,只覆盖常规对话接口的情况不少见
  2. 训练完成后生成的专属模型 ID,是否能在同一个中转账号下正常调用,部分服务对自定义模型 ID 的路由规则和基础模型不同,上线前务必先用小任务测试一遍完整链路
  3. 训练任务的计费和进度查询是否透明,训练是异步任务,要能通过控制台或轮询接口看到实时状态,避免”扣了钱但不知道跑到哪一步”

如果你的中转服务后台不确定是否支持这两个接口,最简单的验证方法就是先跑一次上面代码里的三步流程,用最小的数据集(10 条左右)测试,几分钟内出结果,不会有明显损失。

六、什么时候不要用微调

再强调一次容易踩的坑:

  • 知识会频繁更新的场景(价格表、产品信息、政策条款)——用 RAG,微调后知识过时了还要重新训练,维护成本远高于更新向量库
  • 样本量不足 50 条——大概率训练不出稳定效果,先把 Prompt 优化到位更实际
  • 只是想要更长的上下文或者更快的响应速度——这和微调无关,看 模型选型对比 换更合适的基础模型即可

七、相关阅读

不确定中转服务是否支持 Fine-Tuning 接口,YoTradeApi 全量代理 OpenAI 官方接口,训练任务和普通对话调用用同一个 Key,人民币付费更省心。