隔离网络环境中的合成数据生成用于微调
如何在隔离网络环境中生成合成训练数据——涵盖使用本地 LLM 的改写、指令生成、DPO 对和种子扩展。
企业数据集很小,而且这种小是结构性的。一家医院可能只有 1,500 份相关的放射学报告。一家律所可能只有 800 份特定类型的合同。一家银行可能只有 3,000 条符合分类任务的交易描述。
对微调来说,这个量往往不够。多数微调方法在 5,000 到 50,000 条训练样本的规模上才能拿到更好的结果,具体取决于任务复杂度。真实数据稀缺时,合成数据生成可以补上这个缺口:用模型造出更多训练样本,扩大覆盖面、平衡类别分布、引入变化。
隔离网络环境不允许任何网络流量,所有生成都必须依靠本地模型完成。本文讲清楚具体做法、工作流程和局限。
合成数据对服务商的意义
为企业客户交付微调的服务商,几乎每个项目都会碰上小数据问题。企业客户的数据量足够说明任务是什么,却很少够得上稳健地训练一个模型。
能走的路有三条:
- 用手里的数据直接训练:任务简单、数据集够大时可行。数据稀缺时训出来的模型很脆。
- 再采集真实数据:理想但慢。需要占用领域专家的时间,而客户未必给得起,攒够量可能要几个月。
- 生成合成数据:以现有真实数据为种子,立刻把数据集扩大。当下就能用,质量还可控。
合成数据的作用是放大真实数据的效果。1,500 条真实样本再补上 5,000 条合成样本,微调结果通常好过单用那 1,500 条真实样本,前提是合成数据经过质量过滤。
合成数据的生成技术
改写
取一条现有训练样本,生成若干含义不变、表述不同的变体。这是最简单也最稳妥的增强手段。
怎么做:把一条现有样本喂给本地 LLM,让它给出 3 到 5 条改写。再按相似度筛选生成结果,太像等于没有收益,太不像则语义已经跑偏。
什么时候用:标签分布本来就均衡,只是需要更多训练量的时候。改写不改变分布,只是把密度做厚。
质量控制:
- 原文与改写之间的语义相似度应落在 0.7 到 0.9(用本地嵌入模型测量)
- 完全一致或近乎一致的副本要丢 掉
- 领域专有术语要保留,不能被改写掉
从文档生成指令
把原始文档转成指令/回答训练对。用文档集合搭建微调数据集,主要靠这一招。
怎么做:给定一份源文档,让模型生成这份文档能够回答的问题或指令,然后从文档中生成(或抽取)对应的回答。
例如,给定一段关于终止权的合同条款,可以生成:
- “本协议中的终止条件有哪些?”
- “概括这条提前终止条款。”
- “在什么情况下任何一方可以终止?”
每一组问答对都是一条训练样本。
什么时候用:客户手上有文档,但没有指令/回答对的时候。这是企业场景里最常见的情况:知识都在文档里,形式却不是微调需要的那种。
质量控制:
- 生成的问题必须能从源文档中找到答案
- 回答必须以文档为事实依据,不能是模型编出来的
- 问题的类 型(事实型、分析型、概括型)和难度要有变化
DPO 对的构造
直接偏好优化(DPO)训练需要成对的回答,其中一条优于另一条。当训练目标是引导模型的行为,比如偏好简洁的回答、偏好正式的语气、偏好会引用来源的回答,合成这类数据对就很有价值。
怎么做:对同一条指令生成两条回答,一条符合目标行为,一条违背目标行为,再把这一对标成 chosen/rejected。
什么时候用:微调目标除了事实准确,还包含行为对齐(语气、格式、安全性、引用习惯)的时候。
质量控制:
- chosen 与 rejected 之间的差别要清晰,而且前后一致
- 两条回答都要通顺,rejected 那条要避免一眼就看出是坏的
- 偏好的方向要和成文的风格指南保持一致
种子样本扩展
从一小批高质量、经人工核验的样本出发,生成在模式、分布和质量上都与种子相符的更多样本。
怎么做:把 10 到 20 条种子样本作为上下文提供给模型,让它照同样的模式生成新样本,再做质量筛选和去重。
什么时候用:手上只有少量专家编写的样本,需要把量做上去的时候。对模式稳定的专门任务效果好,比如临床记录概括、合同条款抽取。
质量控制:
- 生成样本在主题、长度、复杂度上要贴合种子样本的分布
- 随机抽取 10% 到 20% 做人工复核,验证质量
- 生成样本与种子之间的语义相似度要落在事先定好的区间里,既不能太近,也不能太远
隔离网络带来的约束
上面这些技术用云 API 都跑得通。隔离网络环境的约束在于,生成只能用本地模型。由此带来几项具体的限制和考量:
模型能力上限:本地模型(7B 到 70B 参数)在生成任务上比不过前沿 API 模型(GPT-4、Claude)。生成文本的质量更低,幻觉率更高,指令遵循也更不可靠。
缓解办法:把质量过滤做得更严。生成量超出所需,再按质量分数只留下最好的 60% 到 70%。
吞吐量约束:在单块 GPU 上生成 10,000 条合成样本,视模型规模和输出长度,需要数小时到数天。把生成时间算进项目排期里。
缓解办法:先用小模型(7B 到 8B)高吞吐地跑初始生成,再用更大的模型(13B 到 70B)做质量过滤。质量的把关交给过滤这一步,生成模型可以不必完美。
无法更新模型:在隔离网络环境里,项目进行途中没法下载新的模型权重。断网之前,把可能用到的模型全部预先装好。
对比:合成数据工具
Distilabel(Argilla)
用 LLM 做合成数据生成的开源库。以流水线为组织方式,把生成步骤定义成一张有向图。
优点:灵活,支持多种 LLM 后端,文档完善。缺点:配置需要 Python 功底,没有图形界面,流水线的定义是代码而非配置,领域专家没法自己上手。
Gretel
商业化的合成数据平台,重点在隐私安全的数据生成,表格数据和文本数据都支持。
优点:隐私保障强,适合做表格数据增强。缺点:采用云端/混合部署模式,无法用于完全隔离网络的环境。商业许可。
自研脚本
不少团队自己写生成脚本:一个 Python 循环调用 Ollama 的 API,配上提示词模板和质量过滤。
优点:完全可控,除了 LLM 运行时之外没有别的依赖。缺点:维护成本高,没有内置的质量指标,没有审计留痕,也没法跨项目复用。
实操工作流
在隔离网络环 境中做合成数据生成,可以按下面的步骤走一遍:
第 1 步:挑选种子样本(1 到 2 小时) 从已标注数据集中挑出 20 到 50 条高质量、有代表性的样本,覆盖数据集里全部的类别、复杂度和格式。
第 2 步:配置本地 LLM(30 分钟) 用 Ollama 或 llama.cpp 部署生成模型。拿几条样例提示词测一下推理速度和输出质量,调好 temperature(生成任务上 0.7 到 0.9 比较合适)和最大 token 数。
第 3 步:设计生成提示词(2 到 4 小时) 为要用到的每一种生成技术写提示词并测试。拿 20 条种子样本试,反复迭代到输出质量稳定为止。
第 4 步:规模化生成(4 到 24 小时,视量而定) 把所有技术批量跑一遍。目标产量按实际需求的 3 到 5 倍来,后面还要筛。
第 5 步:质量过滤(2 到 4 小时) 跑一遍自动化质量过滤:
- 与种子的语义相似度(保留 0.6 到 0.9 区间)
- 对真实数据以及合成数据内部做去重
- 启发式质量检查(长度、连贯性、格式合规)
- 可选:用一个更大的本地模型充当质量评判
第 6 步:人工复核(2 到 8 小时) 让领域专家随机抽查过滤后合成数据的 10% 到 20%,把事实有误、跑题、风格不一致的样本剔掉。
第 7 步:与真实数据合并(30 分钟) 把过滤后的合成数据与真实标注数据合到一起,给合成样本打上元数据标记,便于追溯。最终配比通常是 20% 到 40% 合成、60% 到 80% 真实。
质量过滤:不能省的一步
不做质量过滤的合成数据,还不如不用合成数据。未经筛选的生成文本会带进幻觉、事实错误和分布偏移,把模型效果拖下去。
最起码要有这样一条过滤流水线:
- 格式合规:生成的样本符合要求的 schema 吗?
- 去重:这条样本与其他所有样本(真实的和合成的)都不重复吗?
- 语义相关:这条样本切合训练任务的主题吗?
- 事实依据:由源文档生成的样本,答案能回到源文档里核对吗?
- 多样性检查:合成集合的分布与真实数据一致,还是挤在少数几团里?
Ertas Data Suite 的 Augment 模块用本地 LLM(通过 Ollama/llama.cpp)完成合成数据生成,内置质量过滤和去重。生成提示词通过可视化界面配置,每一条生成样本都会标记来源种子、生成方法和质量分数,并全部写入项目审计日志。
与整条流水线的衔接
增强后的数据(真实 + 合成)进入导出环节,在这里把合并后的数据集整理成目标用途需要的格式:微调用的 JSONL、RAG 用的分块文本,或者其他所需格式。
想了解完整的流水线,参见如何搭建用于 LLM 微调的本地数据准备流水线。
Ship AI that runs on your users' devices.
Free plan with 30 credits/mo, no card required. Paid plans from $10/mo USD.