首页
/ 大语言模型微调实战指南:generative-ai-for-beginners 第 18 课的方法论与端到端流程

大语言模型微调实战指南:generative-ai-for-beginners 第 18 课的方法论与端到端流程

2026-09-06 19:16:02作者:傅爽业Veleda

导读

当提示工程与检索增强生成已无法满足特定领域下回答的准确性与一致性要求时,微调(Fine-tuning)往往是第三条值得评估的技术路线:它不改变输入给模型的 Prompt,而是用额外数据对模型本身进行再训练。本文以本仓库课程第 18 课(18-fine-tuning/README.md)为核心,系统讲解微调的概念、适用决策框架、必备要素与主流落地路径,并结合仓库内可直接运行的 Notebook 与示例训练数据,还原从数据准备、任务提交、状态监控到部署推理的完整闭环。

为什么需要"第三条路线":提示工程与 RAG 的边界

本课程前序课时已经覆盖了两种改善生成质量的技术:提示工程(见 04-prompt-engineering-fundamentals/README.md)与检索增强生成(见 15-rag-and-vector-databases/README.md)。它们共同的思路是:保持模型不变,通过修改输入给模型的 Prompt 来提升回答质量——要么给出显式指令,要么在 Prompt 中携带相关上下文。

其中一种广受欢迎的提示工程手段是 few-shot learning(少样本学习):通过 instructions 显式引导,或在 Prompt 中塞入若干示例进行隐式引导。但第 18 课明确指出,few-shot 有两个天然局限:

  • Token 上限约束:模型上下文窗口限制可放入 Prompt 的示例数量,从而削弱提示策略的有效性;
  • Token 成本约束:每条 Prompt 都拼接示例会推高 token 消耗,既增加成本,也限制灵活性。

微调正是在此背景下成为第三条路线:不再改输入,而是用额外数据重新训练模型本身,让模型"记住"领域知识,从根源上缓解上述两类问题。

课程图解总览

在深入细节前,先看本课配套的图解指南。它用七个步骤串联了微调的完整学习路径——从基础模型选型、理解微调动机,到数据准备、训练与评估、部署与使用,最后落到最佳实践,是一张理想的流程总览图:

微调语言模型图解指南:从基础模型选型、数据准备到训练评估与部署的最佳实践全流程

什么是语言模型微调

大语言模型本质上是预训练的产物——在大规模、多来源(包括互联网)的文本上完成初始学习。机器学习语境下的微调,是指取一个预训练模型,用新数据对其再训练,以提升其在特定任务上的表现。

放到语言模型场景,微调即:用针对某一任务或应用领域精心挑选(curated)的示例集合对预训练模型再训练,产出一个自定义模型(custom model),使它在目标任务或领域上更准确、更相关。微调还有一个"副产品"式收益:知识被写进模型参数后,推理阶段所需的 few-shot 示例数量显著减少,从而降低 token 用量与相关成本

需要精确区分的是,本课讨论的是有监督微调(supervised fine-tuning):再训练使用的数据是新增的、未出现在原始训练数据集中的样本。与之相对的"无监督微调",则是在原始数据上以不同超参数重新训练,并不引入新知识。

何时、为何微调:动手之前的四问决策框架

微调是进阶技术,需要一定专业度才能获得预期效果;若执行不当,不仅难以带来改进,甚至可能使模型在目标领域上的表现退化。因此课程主张:先想清楚"为什么"与"何时",再谈"怎么做"。决策可以从以下四组问题入手。

1. 用例(Use Case):想改善哪一点

明确你的微调用例,以及当前预训练模型在哪个方面不达标——是输出格式不稳定、领域术语不准,还是特定表达风格缺失。只有把待改进点落到可测量的维度上,微调才有明确的成功标准。

2. 备选方案(Alternatives):先用轻量手段建立基线

投入微调前,先尝试更便宜的技术并建立性能基线(baseline),供后续与微调结果对比:

  • 提示工程:尝试 few-shot prompting,在 Prompt 中加入相关回答示例,评估回答质量;
  • 检索增强生成:尝试在 Prompt 中注入从自有数据检索出的查询结果,评估回答质量。

只有当低成本手段确实无法达标时,微调才进入候选名单。

3. 成本(Costs):盘清微调的四类投入

  • 可调性(Tunability):目标预训练模型是否开放微调能力;
  • 人力投入(Effort):准备训练数据、评估与反复优化模型的工作量;
  • 算力(Compute):运行微调任务以及后续部署微调模型的资源;
  • 数据(Data):能否获得足够数量与质量、足以产生微调效果的示例。

4. 收益(Benefits):验证微调是否划算

  • 质量(Quality):微调后的模型是否真的优于基线;
  • 成本(Cost):是否通过简化 Prompt 降低了 token 消耗;
  • 可扩展性(Extensibility):基础模型能否被复用到其他新领域。

理想结论是"收益大于成本"时才启动微调。关于这一权衡过程,本课推荐了专题讨论视频 To fine-tune or not to fine-tune,更多决策类参考见 18-fine-tuning/RESOURCES.md

微调预训练模型需要什么

课程给出了启动微调的四个必备要素:

  1. 一个可微调的预训练模型
  2. 用于微调的数据集
  3. 运行微调任务的训练环境
  4. 部署微调后模型的托管环境

四个要素对应微调从"训练"到"上线"的完整生命周期:模型与数据决定质量上限,训练环境决定能否跑通,托管环境决定成果能否对外服务。

微调在实践:主流方案与工具路线一览

第 18 课按服务商/工具族整理了一份入门路线图。以下为各路线定位概述;各教程的原始链接收录于课程文档的表格中,可在 18-fine-tuning/README.md 查看完整表目:

方案 定位与特点
OpenAI 官方微调教程:以聊天模型为例,覆盖准备训练数据、提交微调任务、用微调模型推理的完整流程,适合"配方助手"这类领域化 Chat 场景。
Azure OpenAI 面向 Azure 的 GPT-3.5 Turbo 微调分步教程:在 Azure 上创建并上传训练数据、运行微调任务,随后部署并使用新模型,适合在 Azure 云环境落地的团队。
Hugging Face 面向开源 LLM(如 CodeLlama 7B)的微调路线:基于 transformers 与 TRL(Transformer Reinforcement Learning)库,配合 Hugging Face 开放数据集完成微调。
AutoTrain Hugging Face 出品的 Python 库(AutoTrain / AutoTrain Advanced),支持包括 LLM 在内的多种任务微调;提供无代码方案,可在自有云、Hugging Face Spaces 或本地运行,同时支持 Web GUI、CLI 及 yaml 配置文件驱动的训练。
Unsloth 开源微调与强化学习框架,简化本地训练、评估与部署,提供开箱即用的 Notebook,并支持 TTS、BERT 与多模态模型。

重要提示:仓库内英文版课程与 Notebook 均明确提示,部分教程中使用的 gpt-35-turbo / gpt-3.5-turbo 已从推理与微调中退役。若现在启动新的微调任务,应改用当前受支持的模型(例如 gpt-4o-minigpt-4.1-mini),当前可微调模型清单以模型服务商官方文档为准。旧教程所演示的概念与流程仍然适用。

仓库内可运行的端到端微调示例

仓库在 18-fine-tuning/python/openai/oai-assignment.ipynb 中复刻了一套完整的 OpenAI 微调演示 Notebook,并在 18-fine-tuning/python/openai/training-data.jsonl 中提供了 10 条示例训练数据。整个微调流程可概括为四个阶段:准备并上传训练数据 → 运行微调任务 → 评估并迭代 → 部署用于推理

示例的业务设定清晰易理解:训练名为 Elle 的聊天机器人——一个"用打油诗(limerick)回答元素周期表问题的事实型聊天机器人"。这种"玩具级"用例刻意保持轻量,只为快速演示流程,而非模拟真实生产数据集。

第一步:准备并上传训练数据

针对聊天补全模型、且交互为单轮问答,示例采用 OpenAI 的单轮聊天格式:数据为 JSONL(每行一条 JSON 对象),每条包含 messages 数组,内含 systemuserassistant 三条消息。关键约束:每条记录必须位于同一行,不能像格式化 JSON 那样跨行。下面两条记录摘自 training-data.jsonl

{ "messages": [{"role": "system", "content": "Elle is a factual chatbot that answers questions about elements in the periodic table with a limerick"}, {"role": "user", "content": "Tell me about Gallium"}, {"role": "assistant", "content": "Gallium, oh gallium, so light - Melts in your hand, oh what a sight - At 86 degrees - Its liquid with ease - And in semiconductors, it's out of sight"}]}
{ "messages": [{"role": "system", "content": "Elle is a factual chatbot that answers questions about elements in the periodic table with a limerick"}, {"role": "user", "content": "Tell me about Hydrogen"}, {"role": "assistant", "content": "Hydrogen, the first in the line - The lightest of all, so divine - It's in water, you see - And in stars, it's the key - The universe's most common sign"}]}

若目标是多轮对话,应改用多轮聊天格式——该格式通过 weight 参数标记哪些消息参与(或不参与)微调训练。在生产环境中,良好效果通常需要远超此数量的样本,质量与训练时间/成本之间存在权衡;此处刻意只保留约 10 条示例,以快速跑通全流程。

上传数据使用 Files API,并把 purpose 指定为 "fine-tune"

from openai import OpenAI
client = OpenAI()

ft_file = client.files.create(
  file=open("./training-data.jsonl", "rb"),
  purpose="fine-tune"
)

print(ft_file)
print("Training File ID: " + ft_file.id)

运行前提是:已安装 openai Python 包(建议 0.28.0 及以上以支持较新特性),并已把 OPENAI_API_KEY 写入环境变量。环境搭建细节参见 00-course-setup/02-setup-local.md

第二步:创建微调任务并跟踪状态

拿到训练文件 ID 后,通过 fine_tuning.jobs.create 提交任务。仓库 Notebook 实测输出示例为:训练文件 file-JdAJcagdOTG6ACNlFWzuzmyV(4,021 字节,状态 processed)、作业 ID ftjob-Usfb9RjasncaZ5Cjbuh1XSCh,超参数为 n_epochs='auto'batch_size='auto'learning_rate_multiplier='auto'

ft_filejob = client.fine_tuning.jobs.create(
  training_file=ft_file.id, 
  model="gpt-3.5-turbo"
)

print(ft_filejob)
print("Fine-tuning Job ID: " + ft_filejob.id)

Notebook 还整理了 client.fine_tuning.jobs 下的常用 API:

  • client.fine_tuning.jobs.list(limit=<n>):列出最近 n 个微调任务;
  • client.fine_tuning.jobs.retrieve(<job_id>):查询某个微调任务的详情;
  • client.fine_tuning.jobs.cancel(<job_id>):取消某个微调任务;
  • client.fine_tuning.jobs.list_events(fine_tuning_job_id=<job_id>, limit=<b>):列出该任务的近期事件。

任务的第一步是校验训练文件,确认数据格式无误。校验通过后任务转入 running,可通过轮询 retrieve 获取状态与已训练 token 数:

response = client.fine_tuning.jobs.retrieve(ft_filejob.id)

print("Job ID:", response.id)
print("Status:", response.status)
print("Trained Tokens:", response.trained_tokens)

需要更细粒度地观察训练进展时,可反复拉取事件列表直到出现完成消息。仓库保存的实测事件输出(节选)展示了 100 步训练末段 training loss 收敛至接近 0.00,以及检查点与最终模型的生成:

Step 85/100: training loss=0.14
...
Step 100/100: training loss=0.00
Checkpoint created at step 80 with Snapshot ID: ft:gpt-3.5-turbo-0125:bitnbot::9OFWyyF2:ckpt-step-80
Checkpoint created at step 90 with Snapshot ID: ft:gpt-3.5-turbo-0125:bitnbot::9OFWyzhK:ckpt-step-90
New fine-tuned model created: ft:gpt-3.5-turbo-0125:bitnbot::9OFWzNjz
The job has successfully completed

除了 SDK,也可以登录模型服务商的 Web 控制台,在 Fine-tuning 面板中查看任务状态与历史记录。Notebook 记录了一次"先失败后成功"的真实经过:第一次运行因 JSON 记录格式错误(跨行)而失败,修正为单行 JSONL 后第二次运行成功并产出可用模型。

第三步:取回微调模型 ID 并验证推理

任务完成后,从 retrieve 结果中读取 fine_tuned_model 字段即可得到微调模型的 ID(形如 ft:gpt-3.5-turbo-0125:bitnbot::9OFWzNjz),随后便可在代码中直接以该 ID 发起推理请求:

response = client.fine_tuning.jobs.retrieve(ft_filejob.id)
fine_tuned_model_id = response.fine_tuned_model
print("Fine-tuned Model ID:", fine_tuned_model_id)
completion = client.responses.create(
  model=fine_tuned_model_id,
  input=[
    {"role": "system", "content": "You are Elle, a factual chatbot that answers questions about elements in the periodic table with a limerick"},
    {"role": "user", "content": "Tell me about Strontium"},
  ],
  store=False,
)
print(completion.output_text)

仓库保存的实测输出是一段符合训练格式的打油诗:"Strontium, a metal so bright - It's in fireworks, a dazzling sight ...",说明微调后的模型已学会以训练数据定义的五句打油诗体例作答,而非机械复述样本。

第四步:在 Playground 中对比评估并部署

除代码推理外,还可以在 Playground 的模型下拉框中直接选用新的微调模型;更高效的方式是使用微调面板的 Playground 对比视图,把基础模型与微调模型并排展示。填入完全相同的系统上下文与测试问题后,可直观对比两者输出——如下方截图所示,微调模型(右侧,ID 带 ft: 前缀)能以训练示例规定的格式作答,而基础模型(左侧)只是跟随系统提示;对比面板同时给出各自的 token 用量与推理延迟:

OpenAI Playground 中基础模型与微调模型并排对比:相同系统提示与问题下,微调模型以训练格式输出打油诗式回答,并展示 token 与延迟指标

需要冷静看待的是:该示例属于教学演示场景——训练集极小、两侧系统上下文与问题完全相同,因此 token 数基本一致,而自定义微调模型推理耗时反而更长。真实业务中微调针对的是产品目录、客服语料等实际数据,效果差异会明显得多;此时基础模型要达到同等回答质量,往往需要更复杂的提示工程,从而推高 token 消耗与推理耗时。

评估、迭代与持续微调

一次微调通常不是终点。综合仓库配套资源页 18-fine-tuning/RESOURCES.md 的信息,可以提炼出几条进阶方法论:

  • 用远超上下文窗口的样本量补足 few-shot 的短板:微调通过在 Prompt 之外"见过"大量示例,既降低推理期成本、提升回答质量,也能降低请求延迟;
  • 持续微调(Continuous Fine-Tuning):可选已微调模型作为基础,继续在新样本集上二次微调,形成"评估 → 补数据 → 再训练"的迭代闭环,这是把微调工程化的关键;
  • 与 Function Calling 结合:使用函数调用示例微调,可让模型输出更准确、格式更一致,并带来成本节约;
  • 训练前数据集体检:先做格式校验、基础统计与 token 量估算,再投入训练,可有效避免格式类失败(Notebook 中的失败记录正是此类教训)。

本课任务与进一步学习路径

第 18 课布置的作业是:从上述路线中选择一篇教程并亲手走完。课程同时提示:本仓库出于参考目的复刻了部分教程对应的 Notebook(如 18-fine-tuning/python/openai/oai-assignment.ipynb),但直接使用原版教程可获得最新的模型支持与流程内容

这套课程与微调主题相关的关键资料如下:

微调不是解决所有生成质量问题的银弹。正如课程反复强调的,它应建立在对用例、备选方案、成本与收益的理性评估之上,只有当收益明确超过成本时才值得投入。厘清提示工程、RAG 与微调三者的适用边界,并掌握从数据到部署的完整流程,是运用生成式 AI 构建可靠应用的关键能力。

登录后查看全文
热门项目推荐
相关项目推荐