Back to blog
    synthetic-datadata-augmentationair-gappedfine-tuninglocal-llmon-premise

    隔离网络环境中的合成数据生成用于微调

    如何在隔离网络环境中生成合成训练数据——涵盖使用本地 LLM 的改写、指令生成、DPO 对和种子扩展。

    Edward Xi Yang

    企业数据集很小,而且这种小是结构性的。一家医院可能只有 1,500 份相关的放射学报告。一家律所可能只有 800 份特定类型的合同。一家银行可能只有 3,000 条符合分类任务的交易描述。

    对微调来说,这个量往往不够。多数微调方法在 5,000 到 50,000 条训练样本的规模上才能拿到更好的结果,具体取决于任务复杂度。真实数据稀缺时,合成数据生成可以补上这个缺口:用模型造出更多训练样本,扩大覆盖面、平衡类别分布、引入变化。

    隔离网络环境不允许任何网络流量,所有生成都必须依靠本地模型完成。本文讲清楚具体做法、工作流程和局限。


    合成数据对服务商的意义

    为企业客户交付微调的服务商,几乎每个项目都会碰上小数据问题。企业客户的数据量足够说明任务是什么,却很少够得上稳健地训练一个模型。

    能走的路有三条:

    1. 用手里的数据直接训练:任务简单、数据集够大时可行。数据稀缺时训出来的模型很脆。
    2. 再采集真实数据:理想但慢。需要占用领域专家的时间,而客户未必给得起,攒够量可能要几个月。
    3. 生成合成数据:以现有真实数据为种子,立刻把数据集扩大。当下就能用,质量还可控。

    合成数据的作用是放大真实数据的效果。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% 真实。


    质量过滤:不能省的一步

    不做质量过滤的合成数据,还不如不用合成数据。未经筛选的生成文本会带进幻觉、事实错误和分布偏移,把模型效果拖下去。

    最起码要有这样一条过滤流水线:

    1. 格式合规:生成的样本符合要求的 schema 吗?
    2. 去重:这条样本与其他所有样本(真实的和合成的)都不重复吗?
    3. 语义相关:这条样本切合训练任务的主题吗?
    4. 事实依据:由源文档生成的样本,答案能回到源文档里核对吗?
    5. 多样性检查:合成集合的分布与真实数据一致,还是挤在少数几团里?

    Ertas Data Suite 的 Augment 模块用本地 LLM(通过 Ollama/llama.cpp)完成合成数据生成,内置质量过滤和去重。生成提示词通过可视化界面配置,每一条生成样本都会标记来源种子、生成方法和质量分数,并全部写入项目审计日志。


    与整条流水线的衔接

    增强后的数据(真实 + 合成)进入导出环节,在这里把合并后的数据集整理成目标用途需要的格式:微调用的 JSONL、RAG 用的分块文本,或者其他所需格式。

    想了解完整的流水线,参见如何搭建用于 LLM 微调的本地数据准备流水线

    就本文向 AI 提问

    Ship AI that runs on your users' devices.

    Free plan with 30 credits/mo, no card required. Paid plans from $10/mo USD.

    Keep reading