一个 7B 业务模型微调实践
很多企业开始做大模型应用时,第一反应是:“要不要训练一个自己的模型?”多数情况下,并不需要从零训练一个通用大模型。更现实的做法,是把已有开源基座模型调成一个更稳定、更符合业务口径的场景模型。
本文用一个 7B 级别开源指令模型举例,说明业务场景微调到底在做什么,适合放在研发链路的哪个位置,以及如何用 LLaMA-Factory 跑通一轮可复现的 LoRA/QLoRA。
这里讨论的是业务后训练,不是从零预训练。示例场景是脱敏后的企业评估任务,所有数据、模型名称和路径都只是示意,不对应真实业务项目。
微调不是重新训练一个 ChatGPT
通用大模型在预训练阶段已经学到了语言、知识、代码和推理模式。业务微调通常不是重新创造这些能力,而是让模型在指定场景里更稳定地做一类任务。
对企业评估类模型来说,微调更像是在训练模型形成一组稳定习惯:
| 目标 | 含义 |
|---|---|
| 任务形态 | 看到企业资料后,知道要做风险归纳、证据说明和尽调建议 |
| 输出格式 | 能稳定输出摘要、风险点、证据边界、后续问题等固定结构 |
| 业务口径 | 使用审慎、可复核、不过度下结论的表达方式 |
| 边界意识 | 对未提供、未验证、非公开的信息不编造 |
| 评测适配 | 面对不同问法时,仍能保持格式和边界稳定 |
如果把大模型看成一个已经具备通用能力的分析助手,微调更像岗前培训:让它按这个岗位的规范写,而不是重新培养一个人。
微调在研发链路中的位置
大模型研发通常不是一个单独训练任务,而是一条工程链路。
flowchart LR
A[需求定义] --> B[数据工程]
B --> C[基座模型选择]
C --> D[继续预训练/CPT]
D --> E[SFT 微调]
E --> F[评测]
F --> G[部署优化]
G --> H[反馈闭环]
其中,预训练、继续预训练和微调解决的问题并不相同。
| 阶段 | 主要目标 | 常见数据 | 是否直接学习业务回答 |
|---|---|---|---|
| 预训练 | 学习通用语言、知识和推理模式 | 网页、书籍、论文、代码、大规模文本 | 否 |
| 继续预训练 | 熟悉特定领域语料分布 | 行业报告、制度文件、公告、长文本资料 | 通常否 |
| SFT 微调 | 学习业务任务、输出格式和回答口径 | instruction + input + output 样本 | 是 |
| 偏好/边界训练 | 学习更偏好的答案和不可答边界 | 偏好对、拒答样本、失败样本 | 是 |
flowchart TD
A[预训练<br/>学习通用语言和知识] --> B[继续预训练<br/>熟悉领域语料分布]
B --> C[SFT 微调<br/>学习业务任务和输出方式]
C --> D[偏好/边界训练<br/>学习什么该答和怎么答]
如果目标是让模型熟悉大量制度文件、年报文本和行业术语,继续预训练可能有价值。如果目标是让模型按固定格式输出企业风险初筛报告,SFT 往往更直接。
微调适合解决什么
业务微调解决的是“模型怎么完成任务”,不是“系统如何拥有所有事实”。
| 适合用微调解决 | 不适合只靠微调解决 |
|---|---|
| 固定报告结构 | 实时事实查询 |
| 风险线索归纳方式 | 数据库权限控制 |
| 证据边界表达 | 企业最新经营状态同步 |
| 多种问法下的口径一致性 | 审批流和审计留痕 |
| 常见错误回答修复 | 凭空补足缺失材料 |
| 可答/不可答样式训练 | 替代正式授信决策 |
在企业评估场景里,模型可以根据已提供材料生成初筛意见、列出风险线索、提示证据缺口,也可以生成后续尽调问题。但它不应该在没有材料的情况下编造财务断裂风险、真实授信额度、担保关系或最终审批结论。
示例场景:金融信贷风控企业评估
这里用一个抽象的企业评估场景。假设我们要做一个评估助手,帮助业务人员基于公开资料和内部授权材料生成初筛分析。
输入可能包括:
| 数据类型 | 示例 |
|---|---|
| 企业基本信息 | 注册资本、成立年限、行业分类、经营范围 |
| 经营摘要 | 营收趋势、利润趋势、现金流摘要 |
| 信用线索 | 逾期记录、诉讼记录、行政处罚、负面舆情 |
| 交易记录 | 采购、销售、回款、合同履约摘要 |
| 行业信息 | 行业周期、价格波动、政策变化 |
| 人工补充 | 客户经理备注、尽调访谈摘要 |
期望输出不是“是否放款”的最终结论,而是类似这样的辅助分析:
| 输出部分 | 作用 |
|---|---|
| 企业概况摘要 | 压缩输入资料,形成可读摘要 |
| 主要风险线索 | 归纳现金流、诉讼、行业、履约等风险点 |
| 正向支撑因素 | 说明经营稳定性、客户结构、历史履约等有利信息 |
| 证据边界 | 明确哪些结论仅基于已提供材料 |
| 尽调问题 | 生成后续需要人工核验的问题清单 |
这类模型的价值不是替代审核人员,而是把大量材料整理成结构化、可复核、便于继续审查的初筛文本。
为什么从 7B 模型开始
7B 不是能力最强的参数规模,但很适合做业务验证的起点。
| 维度 | 7B 模型的优势 |
|---|---|
| 训练成本 | 可用 4-bit QLoRA 在较低显存下训练 |
| 迭代速度 | 数据、参数和评测调整的反馈周期更短 |
| 部署成本 | 推理显存和并发压力相对可控 |
| 工程风险 | 比更大模型更容易定位训练和部署问题 |
| 业务验证 | 足以验证数据设计、任务形态和评测体系 |
对多数垂直业务场景,第一阶段的问题往往不是模型参数不够大,而是任务定义不清、样本不稳、评测指标不贴近业务。先用 7B 模型把数据闭环和评测方法跑通,通常比直接上更大模型更稳。
硬件与训练环境
本文讨论的训练资源是 7B 级别开源基座模型的业务微调环境,不是从零预训练环境。
| 项目 | 示例配置 |
|---|---|
| GPU | 2 x NVIDIA RTX 3090 |
| 单卡显存 | 24GB |
| CPU | 常规多核服务器 CPU |
| 内存 | 建议 128GB 以上 |
| CUDA | CUDA 12.x |
| 训练框架 | LLaMA-Factory |
| 训练方式 | 4-bit QLoRA + LoRA adapter |
| 基座模型 | 7B 级别开源指令模型 |
| 典型任务 | SFT 指令微调、格式学习、边界表达修复 |
在这类资源配置下,7B 模型的 4-bit QLoRA 微调是可行的。它适合业务场景验证、分阶段 SFT、失败样本修复和小规模迭代,不适合承担大规模预训练。
不同训练方式对资源的压力差异很大:
| 训练方式 | 资源压力 | 适用场景 |
|---|---|---|
| 全参数微调 | 高 | 预算充足且需要整体更新模型参数 |
| LoRA | 中 | 保留基座能力,只训练少量 adapter 参数 |
| QLoRA | 较低 | 显存有限时微调 7B/14B 级模型 |
| 继续预训练 | 中到高 | 需要模型熟悉大量领域文本分布 |
| SFT 指令微调 | 中 | 学习业务任务、输出格式和回答边界 |
硬件能跑通训练,不代表模型能直接上线。能不能用,还是取决于数据质量、评测集设计、失败样本修复和上线后的反馈闭环。
数据设计比参数更关键
业务微调最容易被低估的是数据设计。模型学到的不是“金融风控”四个字,而是样本里反复出现的任务结构、表达方式和边界习惯。
一条典型 SFT 样本可以写成 Alpaca 风格:
{
"instruction": "请根据以下公开资料生成企业信贷风险初筛报告。",
"input": {
"企业名称": "示例科技有限公司",
"成立年限": "8 年",
"近三年营收趋势": "连续增长",
"现金流情况": "经营现金流波动较大",
"诉讼记录": "存在 2 条合同纠纷",
"行业": "制造业"
},
"output": "该企业具备一定经营稳定性,近三年营收连续增长是正向因素。但经营现金流波动较大,且存在合同纠纷记录,建议进一步核验回款周期、主要客户集中度、涉诉金额和合同履约情况。以上判断仅基于已提供资料,不能替代正式授信审批。"
}
这里模型学的不是“示例科技有限公司真实风险如何”,而是看到这类材料时,如何组织分析、如何表达不确定性、如何提示人工复核。
微调数据通常需要覆盖几类样本:
| 样本类型 | 作用 |
|---|---|
| 标准任务样本 | 学习正常企业评估报告写法 |
| 风险线索样本 | 学习如何归纳现金流、诉讼、行业和履约风险 |
| 证据缺口样本 | 学习资料不足时如何说明边界 |
| 格式约束样本 | 学习 JSON、表格、短答等固定输出 |
| 反例修复样本 | 修复编造、过度结论、格式不稳定等问题 |
| 验证集样本 | 用于观察泛化,而不是继续训练 |
如果训练集只有“完美输入”和“完美输出”,模型很容易在真实问题里失控。业务样本必须包含资料缺失、问题模糊、字段冲突、无法判断和需要人工复核的情况。
7B 微调路线
稳妥的业务微调通常不是一次训练完,而是分阶段迭代。
flowchart LR
S1[Stage 1<br/>任务形态] --> S2[Stage 2<br/>风险归因]
S2 --> S3[Stage 3<br/>格式稳定]
S3 --> S4[Stage 4<br/>失败样本修复]
S4 --> E[业务评测]
可以把 7B 微调拆成四个阶段:
| 阶段 | 目标 | 数据重点 | 验证重点 |
|---|---|---|---|
| Stage 1 | 建立任务形态 | 企业资料到初筛报告 | 输出是否像业务助手 |
| Stage 2 | 强化风险归因 | 风险线索、证据缺口、尽调问题 | 是否基于材料分析 |
| Stage 3 | 强化格式稳定 | JSON、短答、固定模板、多问法 | 是否稳定遵循格式 |
| Stage 4 | 修复失败样本 | 编造、过度结论、过度拒答、漏答 | 回归是否改善 |
Stage 1 解决“模型知道自己要做什么”。这个阶段的样本应该覆盖主要业务任务,例如企业风险摘要、经营稳定性分析、负面线索解释、尽调问题生成。
Stage 2 解决“模型能不能基于证据分析”。这个阶段重点增加证据不足、字段缺失、结论不确定的样本,让模型学会把不确定性写出来。
Stage 3 解决“模型能不能稳定输出”。业务系统经常需要 JSON、固定字段或短回答,如果模型一会儿输出 Markdown,一会儿输出自然语言,一会儿多加解释,后续集成会很困难。
Stage 4 解决“真实失败样本”。评测和试用中发现的典型失败样本,不应该简单堆进训练集,而要先归因:是数据缺失、指令不清、模型编造、格式不稳,还是任务本身不该由模型回答。
LLaMA-Factory 配置示例
LLaMA-Factory 的训练入口比较直接。基础命令通常是:
llamafactory-cli train examples/train_qlora/business_7b_lora_sft.yaml
一个脱敏后的 7B QLoRA SFT 配置可以类似这样:
### model
model_name_or_path: Qwen/Qwen2.5-7B-Instruct
trust_remote_code: true
### method
stage: sft
do_train: true
finetuning_type: lora
lora_target: all
lora_rank: 16
lora_alpha: 32
lora_dropout: 0.05
### quantization
quantization_bit: 4
### dataset
dataset: finance_risk_sft_demo
template: qwen
cutoff_len: 4096
max_samples: 10000
overwrite_cache: true
preprocessing_num_workers: 8
### output
output_dir: saves/business-7b/lora/stage1
logging_steps: 10
save_steps: 200
plot_loss: true
overwrite_output_dir: true
### train
per_device_train_batch_size: 1
gradient_accumulation_steps: 8
learning_rate: 2.0e-4
num_train_epochs: 2.0
lr_scheduler_type: cosine
warmup_ratio: 0.03
bf16: true
### eval
val_size: 0.1
per_device_eval_batch_size: 1
eval_strategy: steps
eval_steps: 200
实际配置要根据显存、上下文长度、数据规模和模型模板调整。对于 2 x 24GB 显存,4-bit QLoRA 通常比全参数微调更适合快速业务迭代。
训练完成后,可以用 LoRA adapter 进行推理验证:
llamafactory-cli chat examples/inference/business_7b_lora_sft.yaml
也可以导出合并后的模型,但合并和量化要单独验证,不能把“训练成功”等同于“部署成功”。
评测不要只看 loss
训练日志里的 train_loss 和 eval_loss 有用,但不能直接代表业务质量。不同阶段的数据分布不同,loss 也不能简单横向比较。
业务评测更应该看这些问题:
| 指标 | 问题 |
|---|---|
| 任务完成度 | 是否完成了企业评估、风险归纳、尽调建议等任务 |
| 输出格式有效率 | JSON 是否可解析,字段是否齐全 |
| 证据边界表达率 | 是否说明结论基于哪些材料 |
| 幻觉率 | 是否编造未提供的企业事实 |
| 过度结论率 | 是否直接给出最终授信、审批或准入结论 |
| 拒答准确率 | 不该回答的问题是否能拒绝或转为边界说明 |
| 过度拒答率 | 正常可答问题是否被错误拒绝 |
| 人工可读性 | 业务人员是否能继续使用输出 |
一个简单的评测集可以包含:
| 评测子集 | 用途 |
|---|---|
| 标准企业资料 | 验证正常任务能力 |
| 缺字段资料 | 验证证据边界 |
| 高风险线索 | 验证风险归因 |
| 无关问题 | 验证任务边界 |
| 格式输出题 | 验证 JSON 或固定模板 |
| 历史失败样本 | 验证修复是否有效 |
不要只用训练集附近的样本做评测。更有价值的是 held-out 样本、人工构造的边界样本,以及试用过程中收集到的失败样本。
失败样本如何进入下一轮
业务模型的迭代靠失败样本闭环。
flowchart LR
A[失败样本] --> B[人工归因]
B --> C[进入评测集]
B --> D[补充训练集]
C --> E[回归评测]
D --> F[重新微调]
F --> E
E --> G[版本冻结]
失败样本不一定都该进入训练集。先归因更稳:
| 失败类型 | 处理方式 |
|---|---|
| 输出格式不稳 | 增加格式样本,或在推理侧增加 schema 校验 |
| 编造企业事实 | 增加证据边界样本和反例样本 |
| 正常问题被拒答 | 增加可答样本,明确可答边界 |
| 敏感结论过度直接 | 增加审慎表达和人工复核样本 |
| 问题缺少必要输入 | 训练模型要求补充材料,而不是自行补全 |
如果不做归因,只是把失败样本反复加入训练,模型可能在一个问题上变好,却在另一个问题上退化。
常见经验
第一,业务微调不是知识库。模型可以学习回答方式,但不应该承担所有事实存储职责。实时、精确、可追溯的事实,应由数据库、检索系统或业务系统提供。
第二,数据里的边界表达很重要。企业评估场景最常见的风险不是模型不会写,而是写得太像确定结论。训练样本要反复出现“基于已提供材料”“需要进一步核验”“不能替代正式审批”。
第三,小规模修复样本有用,但不能解决所有系统性问题。如果模型在某类问题上持续失败,要检查任务定义、prompt、输出格式、数据配比和评测口径,而不是只增加同类样本。
第四,7B 模型适合快速建立业务闭环。它不一定是最终形态,但适合验证数据工程、训练流程、评测指标和部署成本。等任务边界和评测体系稳定后,再考虑更大模型会更稳。
第五,训练完成只是中间节点。一个业务场景模型能不能用,取决于数据、模型、评测、推理服务和人工流程能不能形成闭环。
结论
业务场景微调不是重新训练一个通用大模型,而是把已有基座模型调成稳定、可控、符合业务口径的任务模型。
对企业评估这类场景,7B 模型配合 4-bit QLoRA 已经可以完成不少有价值的业务后训练实验。重点不是让模型“敢下结论”,而是让模型基于证据组织信息、说明不确定性、输出可复核建议,并在资料不足时守住边界。
如果从零开始做业务场景模型,先用 7B 跑通四件事:数据样本设计、分阶段 SFT、业务评测集和失败样本闭环。等这些基础稳定后,再扩大参数规模才有意义。
参考项目
- LLaMA-Factory: https://github.com/hiyouga/LLaMA-Factory
- PEFT: https://github.com/huggingface/peft
- QLoRA: https://github.com/artidoro/qlora
- Transformers: https://github.com/huggingface/transformers
评论
评论由 GitHub Issues 提供支持,需要登录 GitHub。