花费1.03元微调豆包大模型解决了业务问题,分享一下经验

作者:微信小助手

发布时间:2025-08-17T22:18:04

先看下花费:1.03元
花费不多。那为什么要微调模型呢?没有别的办法了吗?最后效果怎样?
在回答这些问题前,先看看业务的需求:
这是个体验类的需求。
输出的型号中间有空格,直接copy这个型号作为关键词去其它系统中可能就会查不到。
因为,传统的系统中要么是精确匹配,要么是基于RDB的like,这是无法支持关键词中间加空格的查询。

怎么办?

方案1:调提示词,让大模型控制输出的结果。试了下,不是很理想,没有彻底根除。
方案2:换大模型。
提示词无法解决问题时,换大模型也是一个解决问题的办法。不过这会增加额外回归测试的工作。
先换了gpt-4o-mini临时解决了问题。gpt-40-mini这个模型输出结果的型号中间没有额外加空格。
格式的问题解决了,但是这引发了另一个新问题:就是gpt-4o-mini比国内的大模型要贵不少。

怎么办?

对国内的模型Doubao-1.5-pro-32k进行微调。准确的讲是SFT(精调)。
什么是SFT?
SFT(Supervised Fine-Tuning,监督微调)精调:通过已标注好的数据对模型进行精调优化,以适应特定的任务或领域。
  • 在自然语言处理(NLP)领域,Supervised Finetuning(SFT)是一种至关重要的技术手段,用来提升大模型在某一特定领域的表现。通过精细的策划和实施,SFT 能够指导模型的学习过程,确保其学习成果与既定目标高度吻合。
  • SFT 指的是,用户提供一份标注好的数据集,即,包含输入的 prompt 和预期输出的 response。然后,在已有的某个基座模型上继续调整参数,来达到和下游任务对齐的目的。
为什么是SFT?

因为SFT并不需要大量的训练集,因为SFT可以解决这类输入内容格式化的问题。

  • 什么时候需要SFT:
    • 通过 prompt engineering 无法解决或 prompt 中描述过于复杂时。
    • 对大模型输出内容有格式要求时,而模型仍有部分 case 不符合要求。
    • 期望通过 SFT 来减少 prompt 中的内容,加速线上推理的耗时。
做SFT的前置依赖:
  • 0)一方面,把 prompt engineering 做到极致,通过优化 prompt 已经不能解决剩余的 badcase。另一方面,SFT 数据集中也依赖 prompt。因此,做 SFT 之前尽量把 prompt 工程做到最优。
  • 1)一开始不需要急着构造大量 SFT 数据集,可以先用少量数据(50条~100条)对模型做 SFT 后观察真实评估是否有收益。如果有收益,可以尝试以部分数据为种子数据集继续扩充,找到 scaling law。

微调的核心任务是让模型从 “能生成文本” 进化为 “能听懂指令、按意图做事”。这个过程中,数据的作用不是 “喂饱模型”,而是 “给模型清晰的‘行为示范’”。

SFT是用来画龙点睛的。

怎么做?

本次使用字节火山引擎的模型精调工具。

1、在模型精调页面,点击左上角 创建精调任务 按钮。

Image
2、填写模型精调任务名称等基本信息。

任务名称(必填):本次精调任务命名,方便记录检索;支持1~200位可见字符,且只包含大小写字母、中文、数字、中划线、下划线。

任务描述:本次精调任务添加除名称以外的其他描述信息,方便多次迭代版本,重要信息记录;包含大小写字母、中文、数字、中划线、下划线。

Image
SFT参数配置中的参数如何确定?
与训练集有关。
训练集怎么得到?
使用大模型生成。因为SFT并不需要大量的训练集,微调的核心任务,是让模型从 “能生成文本” 进化为 “能听懂指令、按意图做事”。这个过程中,数据的作用不是 “喂饱模型”,而是 “给模型清晰的‘行为示范’”。
引用两句业内比较流行的话:

Quality Is All You Need.

Less Is More for Aligment.

话不多说,先来看看生成训练集的提示词:
提示词:“

目前douboa-32K-pro大模型在输出数据时,总会给额外加一些空格,譬如

问题中是“Sikalastic-609”,大模型输出会是“Sikalastic - 609”,即在“-”两边额外添加了一个空格;

问题中是“水吧台/岛台区域”,大模型输出会是“水吧台 / 岛台区域”,即在“/”两边额外添加了一个空格;

期望这们的效果:

问题中是“Sikalastic-609”,大模型如果有相关的内容,原样输出“Sikalastic-609”

问题中是“水吧台/岛台区域”,大模型如果有相关的内容,原样输出“水吧台/岛台区域”

基于这个目标,来SFT大模型,按照

“Quality Is All You Need.

Less Is More for Aligment.”的规则,提供足够数据的input和output用于精调。

按“扩充高质量格式数据”的策略输出包含新增符号场景样本 和 增加 “错误 - 修正” 对比样本。

补充至少 50 条严格格式对齐的样本,覆盖更多领域(如技术文档、日常对话、专业术语)

"

本次生成并使用的训练集,共42条,具体数据见文末。

提示词:“使用上面生成的42条训练集,给出截图中参数的配置值”

Answer:结合 42 条训练集的小数据场景,以下是适配的参数配置思路及说明,在原有参数基础上优化以适配小数据的高效学习、避免过拟合:

1、参数配置表

参数名
原数值
调整后推荐值
调整逻辑(适配 42 条小数据集)
epoch
1
2 - 3
小数据需多轮学习强化记忆,2 - 3 轮平衡拟合与过拟合
batch_size
8
4 或 8
42 条数据用 8 可整除(42÷8=5.25,实际取整为 5 个完整 batch + 2 条余数据;若硬件允许,8 可保留,加速训练;若显存紧张,调为 4 )
learning_rate
0.00001
5e - 5
原学习率(1e - 5)偏低,小数据场景适度调高至 5e - 5 加速收敛,若训练中出现震荡,可再调回 3e - 5
warmup_step_rate
0.05
0.1
增加 warmup 比例(10% 步数),让模型逐步适应学习率,避免小数据下初始更新幅度过大
lora_rank
32
32
因只能选 32 或 64,32 更适配小数据,减少过拟合风险,保留该值
lora_alpha
4
8
配合 lora_rank=32,按公式 scale = lora_alpha / sqrt(lora_rank),原 scale≈0.7,调整后 8 / sqrt(32)≈1.4,增强参数更新的缩放强度,适配调高的学习率
save_model_per_epoch
1
1
每 epoch 保存一次,42 条数据训练快,1 次 /epoch 足够记录过程,保留该值
dyn_bsz
true
true
保持开启,最大化利用 seq_len×batch_size 填充 token,加速小数据训练效率,保留该值

2、核心调整逻辑

  1. 小数据强化学习
    通过增加 epoch、适度调高 learning_rate,让模型在有限数据中多轮学习、加速收敛,弥补数据量少的短板。
  2. 控制过拟合风险
    保留 lora_rank=32(相对 64 更安全),配合 warmup 延长学习率适应过程,避免模型 “死记硬背” 小数据集。
  3. 参数协同适配
    调整 lora_alpha 匹配学习率变化,保证 Lora 模块参数更新的缩放比例合理,让训练更稳定。

按此配置,可在小数据场景下高效训练模型学习符号格式对齐,同时降低过拟合可能,若训练后验证集效果不佳(如过拟合),可进一步降低 epoch 或 learning_rate ;若收敛慢,则继续微调学习率或 warmup 比例 。

参数配置有了:

“混入预置数据集”和“验证集”怎么配?

Query:“给出下面这两个指标的值: 混入预置数据集:在用户上传的训练集数据中混入豆包模型的SFT(Supervised Fine Tuning,有监督微调)数据,混入比例表示混合后SFT数据占总数据量的比例  验证集:Validation Set,模型训练过程中,用于确定网络结构以及调整模型的超参数。可以从训练集中随机分割一定比例作为验证集,也可以上传独立于训练集的数据集。”

Answer:

结合你提供的 40 条专项微调数据(输出格式对齐V1),以及 “Quality Is All You Need” 和 “Less Is More” 的原则,这两个指标的推荐值及设置逻辑如下:

1. 混入预置数据集比例:0%(不混入)

核心原因

  • 本次 SFT 目标极其明确(仅解决 “-”“/” 前后多余空格问题),40 条数据已精准覆盖该场景,信号纯度极高。
  • 混入通用 SFT 数据会稀释专项信号,可能导致模型注意力分散(比如通用数据中可能存在符号格式不严格的样本,反而干扰学习)。
  • 小数据场景下,“纯专项数据” 更利于模型快速锁定目标规律,符合 “少而精” 的对齐逻辑。

2. 验证集比例:20%(从训练集中随机分割)

推荐设置

  • 从 40 条数据中随机抽取 8 条作为验证集,剩余 32 条作为训练集。
    核心原因
  • 数据量极小(仅 40 条),独立验证集难以保证分布一致性,从训练集中分割更能匹配数据分布。
  • 20% 比例既能保留足够训练样本(32 条),又能通过验证集监控过拟合(比如验证集中符号格式的正确率是否与训练集一致)。
  • 若后续补充数据至 100 条以上,可考虑独立验证集;当前规模下,优先保证验证集与训练集的场景一致性。

这两个指标的设置均以 “强化专项信号、控制过拟合” 为核心,适配小数据量下的精准微调需求。

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

经过49 分 38 秒,SFT任务执行完成。

看下效果:

精调后,格式ok。

精调后,格式ok。

精调后,格式ok。

精调后,格式ok。

等等,你忘记大模型的“幻觉”了吗?

要有PlanB。

PlanB

1、后处理层:兜底的格式修正

若训练后仍有残留问题,通过推理阶段后处理兜底修正,确保最终输出符合要求:

1.1 正则表达式替换(简单有效)

推理时,用 Python 正则自动清理符号前后空

import re

def fix_symbol_format(text):
# 处理“/”前后空格
    text = re.sub(r'\s*/\s*','/', text)
# 处理“-”前后空格(注意区分连字符与减号,可根据场景调整)
    text = re.sub(r'\s*-\s*','-', text)
return text

# 推理示例
output = model.generate(...)
fixed_output = fix_symbol_format(output)

1.2 构建格式校验器

  • 用规则引擎或小型分类模型,对输出文本做 “格式合规性检查”:
    • 若检测到符号格式错误,触发 “重新生成” 或 “后处理替换”;
    • 结合业务场景,可定制更复杂的格式规则(如 “/ 仅用于领域术语分隔,日常对话中保留空格”)。

2、验证与迭代:闭环优化确保效果

2.1 构建格式测试集
准备 100 + 条含 “/”、“-” 的测试用例,覆盖训练 / 未训练场景,验证格式对齐率。
2.2 迭代优化流程
    • 若测试集格式错误率>5%,回到数据层补充样本;
    • 若训练中验证集格式正确率低,调整训练参数增强约束;
    • 若推理后仍有漏网,优化后处理规则覆盖更多边界情况。

核心逻辑总结

格式对齐的本质是让模型在小数据中精准学习 “人类对符号的严格规范”,需通过:


  • 数据强化
    提供充足且清晰的格式样本;
  • 训练优化
    让模型聚焦格式学习而非过拟合;
  • 后处理兜底
    确保极端情况也能修正。


SFT训练数据集

https://f.chaojihao.net/ai/dataset/sft/format/symbol_format_finetune_data20250808V2.jsonl

SFT 最佳实践

https://www.volcengine.com/docs/82379/1221664

创建模型精调任务

https://www.volcengine.com/docs/82379/1099459

最后再补张图,没有完全理解的朋友可以整体再看一下,找找感觉:

面对传统Code RAG和Code Agent在召回率、准确率和稳定性上的不足,以及领域“黑话”和代码风格差异带来的挑战,使用以大模型微调(SFT)为核心的解决方案成功解决了问题。

博跃,公众号:阿里云开发者让AI读懂代码需求:模块化大模型微调助力高效代码理解与迁移

什么是LoRA?

LoRA(Low-Rank Adaptation,低秩适应)是一种高效微调大模型的技术,由微软团队于 2021 年提出。

LoRA的核心是在不改变原模型参数的情况下,通过添加少量低秩矩阵参数来适配新任务。训练时仅优化这些新增的少量参数,大幅降低计算成本;推理时将低秩矩阵的影响合并回原模型,不增加额外开销。这种方式用极少参数就能实现接近全量微调的效果,广泛用于大模型的任务适配。

具体来说,传统微调需要更新模型的全部参数,当模型规模庞大(如数十亿甚至千亿参数)时,会消耗大量计算资源和存储空间。而 LoRA 的做法是:

  • 在预训练模型的关键层(如注意力层的权重矩阵)中插入两个低秩矩阵(可理解为维度较小的矩阵),这两个矩阵的乘积近似于该层在新任务上所需的参数更新量;
  • 训练过程中,仅优化这两个低秩矩阵的参数,而冻结预训练模型的原始参数;
  • 推理时,将低秩矩阵的乘积与原始参数相加,等效于完成了参数更新,不增加额外计算开销。

由于低秩矩阵的参数规模远小于原始模型参数(通常仅为原始参数的 1%-10%),LoRA 大幅降低了微调的成本,同时还能有效避免过拟合,在多种自然语言处理任务(如文本分类、翻译、问答等)中表现出色,目前已成为大模型微调的主流技术之一。

立秋了,晚上天变凉了。21点慢跑3公里,今天只是微微出汗,上周每次跑完都是汗如雨下的。