本文分享了作者通过微调豆包大模型解决业务问题的实战经验。针对LLM输出格式不统一的问题,作者比较了四种解决方案:提示词优化、换模型、工程实现和微调,最终选择DPO-LoRA精调方法。文章详细介绍了DPO原理与SFT的区别,分享了精调参数配置技巧,以及如何通过少量高质量数据实现格式对齐。微调后模型成功解决了输出中额外添加空格的问题,为类似业务场景提供了经济有效的解决方案。
先看下花费:0.46元

花费不多。那为什么要微调模型呢?没有别的办法了吗?最后效果怎样?
先回顾下要解决的问题:


怎么办?
方案1:调提示词,让大模型控制输出的结果。试了下,不是很理想,没有彻底根除。
试过下面的经典实践,没有解决:
温度调低,提示词模版严格按照结构:
角色
指令/任务
问题
上下文
示例(few shot)
试过让大模型,譬如Kimi,doubao给写提示词。没有解决。
并且在尝试的过程中发现,提示词越长、规则越多,大模型的回答问题的表现反而是下降的。言简意赅,less is more,也适用于提示词。
方案2:换大模型。
可行。对解决这个问题是可行的,只是回归的工作量巨大。准备回归的case就累死个人,ROI低。
目前把LLM当做万能的“神”了,各种祈求,各种场景都在用。如果换模型,不知道会把哪个场景就搞坏了。
方案3:基于工程代码实现。
可行。改代码工作量不算大,拉通的工作量大,制定方案的工作量大。
这个的确是Schema+ Template的场景,关键是Schema如何定?
难点在于LLM返回数据块时的随机性。
譬如“AW30-02-B” 在sse返回时拆成4个data块 “AW30 ”、“ -”、“02 ”、“ - B”顺次返回,这个时候正则就不好匹配到了。思考下为什么。
好在有粉丝在花费1.03元微调豆包大模型解决了业务问题,分享一下经验中留言,开了个脑洞,提供了一个好的思路,借花献佛:
接收 LLM 返回的数据块时,先暂存不展示至页面。待收到包含标点符号或换行(分隔类的语法标识)的数据块后,提取两个分隔标识之间的内容,通过正则处理去除多余空格即可。
这个逻辑建议放在前端,主要考虑体验和性能。后端也是可以实现的,且不会有浏览器兼容问题。
方案4:微调。
可行。因为LLM幻觉的问题,长期方案仍需要方案3兜底。
并不是所有团队都能制定方案3的方案,有的团队大模型精调这一块技术能力强,可能通过精调来解决。精调的解决方案,如果完美落地,就可以把这个问题收口,并且前后端都会少很多莫名其妙的逻辑。
怎么精调?
DPO-LoRA精调
什么是DPO?
直接偏好学习(Direct Preference Optimization,DPO):一种用于模型对齐的方法,直接优化模型生成结果与人类偏好的一致性,无需像传统强化学习人类反馈(RLHF)那样依赖奖励模型等中间环节,能更高效地让模型学习人类偏好,提升输出的 “对齐度”。
与SFT精调有什么不同?
| 训练类型 | 原理 | 是否有监督学习 | 需要的数据集类型及数据 | 效果 |
|---|---|---|---|---|
| SFT 精调(Supervised FineTuning) | 基于标注好的 “指令 - 响应” 配对数据,通过有监督学习调整模型参数,使模型学习理解和遵循人类指令 | 是(有监督) | 需标注好的指令 - 响应配对数据,例如人工标注的对话、问答、指令执行示例等 | 使模型具备指令遵循能力,能根据人类指令生成符合要求的文本,是大模型 “能用” 的基础 |
| 直接偏好学习(Direct Preference Optimization) | 直接优化模型生成结果与人类偏好的一致性,基于人类对模型输出的偏好数据(如对同一问题多个回答的偏好排序)进行训练,跳过传统强化学习人类反馈(RLHF)的奖励模型环节 | 是(基于偏好的有监督,标注形式为偏好排序) | 需人类偏好数据,例如对同一输入的多个模型输出,标注出人类更偏好的结果 | 提升模型输出与人类主观偏好的对齐度,使生成内容更连贯、有用、符合人类价值观 |
| 继续预训练(Continue Pretraining) | 在已预训练模型的基础上,用大规模无标注文本数据继续进行无监督训练,让模型学习更多领域知识和语言模式 | 否(无监督) | 需大规模无标注文本数据,例如各类书籍、网页、论文、新闻等不同领域的文本内容 | 强化模型的基础语言理解和知识储备,提升其底层语言建模能力,丰富模型的知识覆盖范围 |
微调的核心任务是让模型从 “能生成文本” 进化为 “能听懂指令、按意图做事”。这个过程中,数据的作用不是 “喂饱模型”,而是 “给模型清晰的‘行为示范’”。
SFT是用来画龙点睛的。
怎么做?
本次使用字节火山引擎的模型精调工具。
1、在模型精调页面,点击左上角 创建精调任务 按钮。

2、填写模型精调任务名称等基本信息。
任务名称(必填):本次精调任务命名,方便记录检索;支持1~200位可见字符,且只包含大小写字母、中文、数字、中划线、下划线。
任务描述:本次精调任务添加除名称以外的其他描述信息,方便多次迭代版本,重要信息记录;包含大小写字母、中文、数字、中划线、下划线。


SFT参数配置中的参数如何确定?
与训练集有关。
训练集怎么得到?
使用大模型生成。因为SFT并不需要大量的训练集,微调的核心任务,是让模型从 “能生成文本” 进化为 “能听懂指令、按意图做事”。这个过程中,数据的作用不是 “喂饱模型”,而是 “给模型清晰的‘行为示范’”。
引用两句业内比较流行的话:
Quality Is All You Need.
Less Is More for Aligment.
话不多说,先来看看生成训练集的Promotion:
“需求:学习这个链接的内容,并生成 一份标注好的数据集,用于DPO训练类型。 https://www.volcengine.com/docs/82379/1099461
要解决的问题,对大模型的输出结果进行格式,如下所示: 目前douboa-32K-pro大模型在输出数据时,总会给额外加一些空格,譬如 问题中是“LVD30B-T11-X6”,大模型输出会是“LVD30B - T11 - X6”,即在“-”两边额外添加了一个空格; 问题中是“水吧台/岛台区域”,大模型输出会是“水吧台 / 岛台区域”,即在“/”两边额外添加了一个空格; 期望这们的效果: 问题中是“LVD30B-T11-X6”,大模型如果有相关的内容,原样输出“LVD30B-T11-X6” 问题中是“水吧台/岛台区域”,大模型如果有相关的内容,原样输出“水吧台/岛台区域” 要求:要解决的是通用的格式对齐问题。 基于这个目标,来SFT大模型,按照“Quality Is All You Need.Less Is More for Aligment.”的原则,提供足够数据的标注数据。 至少50条严格格式对齐的样本,覆盖更多领域(如技术文档、日常对话、专业术语)生成数据时,不使用对话方式,要使用左边对话,右边文件的方式”

jsonl格式的数据集生成好了。
本次生成并使用的训练集,共60条,具体数据文件链接见文末。
继续。
Promotion:
“使用上面生成的60条数据集时,这些参数“参数配置”,如何配置”

用户现在需要基于生成的 60 条 DPO 数据集,来配置训练参数。首先得理解每个参数的意义,结合 DPO 训练的特点来调整。
首先看训练类型是直接偏好学习(DPO),模型是 Doubao-1.5-pro-32k,训练方法 LoRA。现在逐个分析参数:
- epoch(迭代轮次):DPO 训练因为是偏好学习,数据量 60 条不算特别大,epoch 设为 1 的话可能有点少,但如果是先试训,也可以。不过为了让模型充分学习,可能可以调到 2?但得看数据量,60 条的话,epoch1 可能也够,因为 DPO 是策略优化,不是单纯拟合,所以保持 1 也可以,或者根据实际效果调整,先按现有配置也可。
- batch_size(批次大小):当前是 8。LoRA 训练对 batch_size 的要求,8 对于 60 条数据来说,批次数量是 60/8≈7.5,也就是 8 个批次,比较合理。可以保持 8。
- learning_rate(学习率):0.00001,这个学习率很低。LoRA 训练的学习率通常可以比全量训练高一些,因为只更新低秩参数。DPO 的学习率一般也需要适中,避免过大导致不稳定。不过 0.00001 可能有点保守,是否可以调到 0.0001?但得看模型稳定性,新手建议先保持,或者微调。不过原配置是 0.00001,先保持观察。
- warmup_step_rate(预热阶段比例):0.05,也就是 5% 的 steps 作为预热。60 条数据,batch_size8,总 steps 是 60/8=7.5,向上取整 8 steps,预热 step 是 8*0.05≈0.4,几乎没有,可能有点少。可以调到 0.1,即 10%,这样有 0.8 step,实际可能设为 1。不过原配置 0.05,也可以先保持。
- lora_rank(LoRA 的秩):32。这个参数决定 LoRA 的可训练参数数量,32 对于 32k 模型来说是比较适中的,能捕捉足够的信息,保持 32。
- lora_alpha(LoRA 的缩放系数):4。公式是 scale = lora_alpha /sqrt (lora_rank),4/sqrt (32)≈4/5.656≈0.707,这个缩放系数合理,保持 4。
- dpo_beta(损失温度):0.1。DPO 的 beta 参数控制对参考模型的关注程度,beta 越小,输出多样性越高;越大越确定性。0.1 是比较小的,追求多样性,适合格式对齐这种需要严格但又要自然的任务,保持 0.1。
- lm_loss_scale(sft loss 的系数):1。控制 DPO 中 sft loss 的权重,保持 1 即可。
现在总结,对于 60 条 DPO 数据集,这些参数的配置可以如下调整或保持:
- epoch:可以尝试设为 2,因为数据量小,多一轮确保学习;如果担心过拟合,保持 1。
- batch_size:保持 8,合理。
- learning_rate:可以考虑调到 0.0001,因为 LoRA 训练学习率可以稍高,促进参数更新;如果担心不稳定,保持 0.00001。
- warmup_step_rate:调到 0.1,让预热更充分,避免初期学习率过大。
- 其他参数(lora_rank、lora_alpha、dpo_beta、lm_loss_scale)保持原配置,因为它们在当前设置下是合理的。
不过作为初始配置,也可以先按照界面的默认配置运行,看训练效果,再迭代调整。比如先保持所有参数不变,跑一轮,看模型输出的格式对齐情况,如果效果不好,再调整学习率、epoch 等。
现在整理成建议的配置说明:
参数配置建议(基于 60 条 DPO 格式对齐数据集)
- epoch(迭代轮次)
- 建议:2
- 说明:60 条数据量较小,增加 epoch 到 2 可让模型更充分学习格式对齐的偏好,避免欠拟合。若训练后出现过拟合迹象(如生成内容僵化),可调回 1。
- batch_size(批次大小)
- 建议:保持 8
- 说明:8 的批次大小对 60 条数据(60÷8≈8 个批次)来说,能保证训练效率和稳定性,无需调整。
- learning_rate(学习率)
- 建议:调整为 0.0001
- 说明:LoRA 训练仅更新低秩参数,学习率可适当提高以加快收敛。原 0.00001 过于保守,调整为 0.0001 能在保证稳定性的同时提升训练效率。若训练中出现损失波动过大,可回调至 0.00005。
- warmup_step_rate(预热阶段比例)
- 建议:调整为 0.1
- 说明:原 0.05 的预热比例过低(仅约 0.4 个 step),调整为 0.1 后,预热 step 约为 0.8(向上取整为 1),能更平稳地过渡到正常学习率,避免初期训练不稳定。
- lora_rank(LoRA 秩)
- 建议:保持 32
- 说明:32 的秩能在可训练参数数量和模型性能间取得平衡,适合 32k 模型的格式对齐任务,无需调整。
- lora_alpha(LoRA 缩放系数)
- 建议:保持 4
- 说明:根据公式
scale = lora_alpha / sqrt(lora_rank),4/sqrt (32)≈0.707,缩放合理,保持即可。
- dpo_beta(损失温度)
- 建议:保持 0.1
- 说明:0.1 的 beta 值能在输出确定性和多样性间取得平衡,适合格式对齐这种需要严格遵循原始格式的任务,保持即可。
- lm_loss_scale(sft loss 系数)
- 建议:保持 1
- 说明:控制 DPO 中 sft loss 的权重,默认 1 无需调整。
这样配置后,模型能在 DPO 训练中更有效地学习格式对齐的偏好,同时保证训练的稳定性和效率。训练完成后,需通过测试集验证格式输出是否符合预期,再根据结果迭代调整参数。
最终配置总结
| 参数 | 原配置 | 建议配置 | 调整原因 |
|---|---|---|---|
epoch | 1 | 2 | 增加轮次以充分学习小数据集 |
batch_size | 8 | 8 | 批次大小合理,无需调整 |
learning_rate | 0.00001 | 0.0001 | 提高学习率加速 LoRA 参数收敛 |
warmup_step_rate | 0.05 | 0.1 | 增加预热比例保证训练稳定性 |
lora_rank | 32 | 32 | 秩的取值适中,无需调整 |
lora_alpha | 4 | 4 | 缩放系数合理,无需调整 |
dpo_beta | 0.1 | 0.1 | 平衡格式对齐与输出多样性 |
lm_loss_scale | 1 | 1 | 保持 SFT 损失权重合理 |
是否“混入预制数据集”?是否打开“验证集”?

Promotion:
关于 “混入预置数据集” 和 “验证集” 的配置建议如下:
1. 混入预置数据集
不需要添加原因:当前训练目标是 专注于格式对齐(“-”“/” 无额外空格)的 DPO 任务,预置数据集多为通用或领域数据,混入后可能引入无关内容,干扰模型对格式对齐规则的针对性学习,因此保持训练数据的纯粹性更有利于任务目标的达成。
2. 验证集
需要打开,并设置为10%原因:验证集可在训练过程中实时评估模型的泛化能力,避免过拟合。当前数据集规模(60条)较小,打开验证集(按建议设置10%,即6条左右)能有效监控训练效果,确保模型在格式对齐任务上的性能稳定,是必要的训练保障环节。


万事俱备,点击“提交精调任务”。

不到10分钟,DPO-LoRA精调任务执行完成。
怎么样?
看下效果:





精调后,格式ok。
QA
Q:精调后可以本地部署吗?
A: 如果是使用字节火山引擎上提供的微调功能,不能。微调后的模型只能在模型广场中查看和引用,无法下载,就不能本地部署了。但可以使用API的方式调用。 如果是通过自己搭建的微调平台,譬如MS-Swift、Unsloth、Lit-GPT、OpenLLM、LLaMA-Factory,是可以本地部署的。
具体特点如下:
-
MS-Swift
本身就是能搞定从微调直达部署的全流程框架,支持 vLLM 等推理加速引擎,还兼容 CPU、RTX 系列显卡等多种硬件,单卡 3090 就能微调 7B 模型,训练后可直接通过命令行或 Web-UI 完成本地部署。
-
Unsloth
适配 llama.cpp 框架,能通过动态量化和 CPU+GPU 混合推理降低硬件成本,像 1.58bit 模型最低 60G 内存 + 10G 显存就能本地运行,双卡 A100 服务器部署时还能实现高并发高吞吐量。
-
LLaMA-Factory
可通过 docker-compose 快速完成本地部署,微调后能导出模型文件,在其 Web 界面就能加载微调后的模型测试效果,操作门槛低,还支持 LoRA 等常见微调方式适配本地硬件。
-
Lit-GPT、OpenLLM
二者均为开源轻量化工具,Lit-GPT 主打适配消费级显卡,精调后可通过量化进一步压缩体积适配本地部署;OpenLLM 支持主流大模型的微调与推理,能直接生成适配本地环境的部署配置,方便快速启动服务。
Q:什么是LoRA?
A:LoRA(Low-Rank Adaptation,低秩适应)是一种高效微调大模型的技术,由微软团队于 2021 年提出。
LoRA的核心是在不改变原模型参数的情况下,通过添加少量低秩矩阵参数来适配新任务。训练时仅优化这些新增的少量参数,大幅降低计算成本;推理时将低秩矩阵的影响合并回原模型,不增加额外开销。这种方式用极少参数就能实现接近全量微调的效果,广泛用于大模型的任务适配。
具体来说,传统微调需要更新模型的全部参数,当模型规模庞大(如数十亿甚至千亿参数)时,会消耗大量计算资源和存储空间。而 LoRA 的做法是:在预训练模型的关键层(如注意力层的权重矩阵)中插入两个低秩矩阵(可理解为维度较小的矩阵),这两个矩阵的乘积近似于该层在新任务上所需的参数更新量; 训练过程中,仅优化这两个低秩矩阵的参数,而冻结预训练模型的原始参数; 推理时,将低秩矩阵的乘积与原始参数相加,等效于完成了参数更新,不增加额外计算开销。 由于低秩矩阵的参数规模远小于原始模型参数(通常仅为原始参数的1%-10%),LoRA大幅降低了微调的成本,同时还能有效避免过拟合,在多种自然语言处理任务(如文本分类、翻译、问答等)中表现出色,目前已成为大模型微调的主流技术之一。
Q:LoRA 改变了 LLM 的哪些数据?
A:LoRA 改变的是 LLM 中关键层权重矩阵的增量,而非原始参数本身。 具体来说:
1. 改变的位置:Transformer 架构的核心决策层
- 注意力机制层:
- Query 矩阵 (Wq):负责计算文本中每个 token 的 “查询向量”
- Value 矩阵 (Wv):负责计算文本中每个 token 的 “值向量”
- (可选) Key 矩阵 (Wk) 和输出矩阵 (Wo)
- 前馈神经网络层:
- 输入变换矩阵 (fc1/up_proj):将注意力输出映射到高维空间
- 输出变换矩阵 (fc2/down_proj):将高维表示映射回模型维度
2. 改变的方式:添加低秩 “旁路”
核心机制:在原始权重矩阵旁边添加一个 “旁路”,通过两个小矩阵的乘积来模拟权重更新
-
冻结原始权重
W₀保持不变,不参与训练
-
添加低秩更新
ΔW = B・A,其中:
- A:降维矩阵 (d×r),将输入从 d 维映射到 r 维
- B:升维矩阵 (r×d),将 r 维表示映射回 d 维
- r:秩,通常取 8-64,远小于 d (模型维度,如 768/1024)
数学表达:修改后的权重矩阵 = W₀ + ΔW = W₀ + B・A
前向传播变化:
原计算:h = W₀·x
LoRA计算:h = W₀·x + B·A·x = (W₀ + B·A)·x
Q:为什么小参数能产生大效果?
A:核心假设:预训练大模型在适配新任务时,权重更新具有低内在秩结构
- 语言理解本质上是在低维语义空间中进行的,即使模型参数庞大
- LoRA 通过数学证明,只需捕获这个低维变化,就能实现整体行为的调整
2. 推理阶段:无缝集成,零额外开销
-
合并权重
训练完成后,将 LoRA 增量 (B・A) 直接加到原始权重 (W₀) 上
-
部署模型
推理时使用合并后的单一权重矩阵,与原始模型性能相同且无额外计算负担
如何学习AI大模型 ?
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。【保证100%免费】🆓
优快云粉丝独家福利
这份完整版的 AI 大模型学习资料已经上传优快云,朋友们如果需要可以扫描下方二维码&点击下方优快云官方认证链接免费领取 【保证100%免费】

读者福利: 👉👉优快云大礼包:《最新AI大模型学习资源包》免费分享 👈👈
对于0基础小白入门:
如果你是零基础小白,想快速入门大模型是可以考虑的。
一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。
👉1.大模型入门学习思维导图👈
要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。
对于从来没有接触过AI大模型的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。(全套教程文末领取哈)

👉2.AGI大模型配套视频👈
很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,每个章节都是当前板块的精华浓缩。


👉3.大模型实际应用报告合集👈
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(全套教程文末领取哈)

👉4.大模型实战项目&项目源码👈
光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战项目来学习。(全套教程文末领取哈)

👉5.大模型经典学习电子书👈
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。(全套教程文末领取哈)

👉6.大模型面试题&答案👈
截至目前大模型已经超过200个,在大模型纵横的时代,不仅大模型技术越来越卷,就连大模型相关的岗位和面试也开始越来越卷了。为了让大家更容易上车大模型算法赛道,我总结了大模型常考的面试题。(全套教程文末领取哈)

为什么分享这些资料?
只要你是真心想学AI大模型,我这份资料就可以无偿分享给你学习,我国在这方面的相关人才比较紧缺,大模型行业确实也需要更多的有志之士加入进来,我也真心希望帮助大家学好这门技术,如果日后有什么学习上的问题,欢迎找我交流,有技术上面的问题,我是很愿意去帮助大家的!
这些资料真的有用吗?
这份资料由我和鲁为民博士共同整理,鲁为民博士先后获得了北京清华大学学士和美国加州理工学院博士学位,在包括IEEE Transactions等学术期刊和诸多国际会议上发表了超过50篇学术论文、取得了多项美国和中国发明专利,同时还斩获了吴文俊人工智能科学技术奖。目前我正在和鲁博士共同进行人工智能的研究。
资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。


优快云粉丝独家福利
这份完整版的 AI 大模型学习资料已经上传优快云,朋友们如果需要可以扫描下方二维码&点击下方优快云官方认证链接免费领取 【保证100%免费】

读者福利: 👉👉优快云大礼包:《最新AI大模型学习资源包》免费分享 👈👈
2万+

被折叠的 条评论
为什么被折叠?



