姑苏城有家“济世堂”老药铺,老掌柜医术精湛、见多识广,闭着眼都能开出一剂好方子。可老掌柜要开分店时,却犯了难:新店的小徒弟机灵是机灵,但没跟过几个真实病人,连药材都认不全。让老掌柜亲自坐镇分店?他分身乏术。就这样让小徒弟独当一面?又怕他开错方子砸了招牌。有人出了个主意——让老掌柜把自己的看家本领“讲”给徒弟听:诊什么脉、问什么症、开什么方、忌什么口,全写成带教手册,再编几千道“考题与标准答案”让徒弟反复研读。就这样,小徒弟的见识迅速见长,分店顺利开张。 这个故事里,老掌柜就是大语言模型(LLM),小徒弟就是要在金融、法律、医疗等垂直领域落地的小模型。小徒弟缺的不是聪明劲,而是“喂”进来的领域数据太少。让大模型当“带教老师”,批量产出高质量的领域问答数据,正是当下最火的“领域数据扩充”路线。本文就带你拆解这条路的完整环节:从知识注入、术语控制,到问答生成、事实校验,再到规模与质量管控,最后用评估闭环验证“徒弟”到底学没学会。

岗位关联

一句话价值:掌握用大模型为垂直领域批量“造”高质量训练数据的方法,你在数据稀缺的金融、法律、医疗行业做微调时,就拥有了补齐数据短板、提升模型表现的核心竞争力。

目录
  1. 可视化演示
  2. 领域知识注入
  3. 术语行话控制
  4. 专业问答生成
  5. 事实性校验
  6. 规模化量产
  7. 质量控制
  8. 效果评估闭环
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示领域数据不够?用大模型来扩充的核心机制,通过输入/处理/存储/输出四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

领域数据不够?用大模型来扩充:领域数据 领域数据扩充的工程动机与整体方 领域知识注入的提示工程技术 核心机制可视化 领域数据不够?用大模型来扩充整体架构与关键组件

领域知识注入

老掌柜要传艺,第一件事不是让徒弟背药名,而是先立一本带教手册:写明“我是济世堂老掌柜”“今天教风寒辨证”“照这几张经典方子来”“方子的依据是《伤寒论》”。没有这本手册,徒弟听到的只会是零散药名和偏方。大模型也一样——它本身是个“通用才子”,金融、医疗、法律都懂一点,但你不把领域背景讲清楚,它就会用通用套路给你写出“仅供参考”的正确废话。

这就引出了领域数据扩充的第一关:领域知识注入。所谓注入,就是把领域知识写进提示词,让大模型的输出从“通用模式”切换到“领域模式”。实践中,一个高质量的领域生成提示词通常由四部分组成:角色设定(你是谁)、任务指令(要干什么)、少样本示范(给你看怎么干)、知识参考(可查的依据)。四部分缺一不可,顺序上先立角色、再给任务、随后示范、最后给知识参考,效果最好。

以金融风控为例,完整提示可能是:“你是一名资深风控专家”“请基于以下材料生成一组反洗钱问答对”“问答需符合示例的术语风格”“参考《金融机构反洗钱规定》中关于客户尽职调查的定义”。这就是一次完整的领域知识注入。值得注意的是,知识库辅助(即把检索到的领域文档片段拼进提示)能显著降低大模型的自由发挥空间,属于注入的一种增强形态。

把带教手册写厚,徒弟才有章可循。同样,提示词中注入的领域知识越结构化,大模型生成的数据就越像这个圈子里的“行内人”写的。知识注入是整条流水线的地基——地基没打牢,后面生成、校验做得再多也是空中楼阁。

P=S角色⏟领域设定⊕S任务⏟任务指令⊕S示例⏟少样本示范⊕S知识⏟知识参考\mathcal{P} = \underbrace{\mathcal{S}_{\text{角色}}}_{\text{领域设定}} \oplus \underbrace{\mathcal{S}_{\text{任务}}}_{\text{任务指令}} \oplus \underbrace{\mathcal{S}_{\text{示例}}}_{\text{少样本示范}} \oplus \underbrace{\mathcal{S}_{\text{知识}}}_{\text{知识参考}}
这个公式表示:一个领域生成提示词 $\mathcal{P}$,由“角色设定”“任务指令”“少样本示范”“知识参考”四部分拼接($\oplus$ 表示拼接)而成。四要素齐备,大模型才真正“入戏”。
  1. 角色设定先告诉大模型它是谁,把它的语言风格切换到领域模式。
    S角色="你是一名资深风控专家"\mathcal{S}_{\text{角色}} = \text{"你是一名资深风控专家"}
  2. 任务指令明确要生成什么类型的数据,比如问答对、摘要或对话。
    S任务="请生成一组反洗钱问答对"\mathcal{S}_{\text{任务}} = \text{"请生成一组反洗钱问答对"}
  3. 少样本示范给出 3-5 个高质量领域样本,让模型模仿格式与风格。
    S示例={(问i,答i)}i=1k\mathcal{S}_{\text{示例}} = \{(\text{问}_i, \text{答}_i)\}_{i=1}^{k}
  4. 知识参考把检索到的领域知识片段拼接到提示中,约束生成的事实边界。
    S知识="参考《金融机构反洗钱规定》第X条"\mathcal{S}_{\text{知识}} = \text{"参考《金融机构反洗钱规定》第X条"}

术语行话控制

老掌柜教徒弟时,总爱说“这味药要活血化瘀、理气止痛”,而不是“让血走快一点、气顺一点、不那么疼”。行话——也就是领域术语——是身份的标志。如果徒弟记下的都是大白话,等真正开方时,病人听着就像江湖郎中,同行一看就知道不是科班出身。同样道理,大模型生成的领域数据若没有术语,微调出来的小模型也“不像内行”。

术语控制的核心是术语表构建与约束生成。先梳理出领域专属词汇集 $\mathcal{T}_{\text{术语}}$,比如反洗钱领域的"KYC"“可疑交易”“大额交易报告”,医疗领域的“适应证”“禁忌证”“用药监护”。然后在生成阶段做“单词重加权”:模型每生成一个词,如果这个词在术语表里,就给它额外加分;如果不在,就不加分甚至减分。这样整篇文本的术语密度就会明显提升。

除了解码期的硬控制,软性手段同样有效:在少样本示范里故意放术语密集的例句,让模型“模仿行话风格”;或者用一个小模型评估生成文本的术语覆盖率,不达标的批次重新生成。术语表本身也需要动态更新——把生成文本中出现频率高、且与真实领域语料高度重合的词,自动补充进术语表,形成“术语飞轮”。

行话这东西,不光是“说得好听”,更是“想得精准”。术语背后是领域专家多年沉淀的思考框架。让生成的问答充满地道的行话,小模型微调后才能在真实场景里准确调用这些概念,而不是用一堆模糊的日常词汇打转。

P输出(w)={λ⋅P(w),w∈T术语P(w),w∉T术语P_{\text{输出}}(w) = \begin{cases} \lambda \cdot P(w), & w \in \mathcal{T}_{\text{术语}} \\ P(w), & w \notin \mathcal{T}_{\text{术语}} \end{cases}
这个公式表示:解码时如果候选词 $w$ 落在术语表 $\mathcal{T}_{\text{术语}}$ 里,它的生成概率就被放大 $\lambda$ 倍;否则保持原样。$\lambda$ 通常取 1.2-2.0,过大反而会让文本生硬。
  1. 术语表领域专属词汇的集合,是加权控制的判定依据。
    T术语={KYC,可疑交易,五级分类,⋯ }\mathcal{T}_{\text{术语}} = \{\text{KYC}, \text{可疑交易}, \text{五级分类}, \cdots\}
  2. 加权系数一个大于 1 的常数,控制术语在生成时的“话语权”。
    λ>1\lambda > 1
  3. 概率调制对术语表中的词提高采样概率,非术语保持原有概率。
    P输出(w)=λ⋅P(w),∀w∈T术语P_{\text{输出}}(w) = \lambda \cdot P(w), \quad \forall w \in \mathcal{T}_{\text{术语}}

专业问答生成

带教手册有了,行话也教会了,接下来是重头戏——出考题。老掌柜要把毕生经验变成一本考题册:每一页左边是问题、右边是标准答案。比如“心悸患者日常调护应注意什么?”——“注意情绪稳定,避免浓茶咖啡,遵医嘱服用稳心颗粒……”。考题要多样,不能十万道全是“感冒怎么办”;难度要有梯度,从“什么是心悸”到“如何辨证施治”逐级递进;答案要规范,结构统一、术语准确。

专业问答对(Question-Answer Pair)是领域微调最常用的数据形态。批量生成时,最有效的锚点是种子数据扩写:拿几十条真实的高质量问答为种子,让大模型参照它们改写、扩写、变换提问角度。比如种子问题是“什么是洗钱?”,可以扩写为“洗钱的常见方式有哪些?”“为什么反洗钱要关注大额交易?”“KYC 在反洗钱中的作用是什么?”,一条变十条。

为了让问答对真正有用,还要控制三个质量维度:正确性(内容有没有硬伤)、完整性(答案是不是答到点子上)、规范性(术语和格式是否统一)。业界常用一个加权评分公式来量化答案质量:正确性权重最高,完整性和规范性次之。生成时按难度分级设计不同的提示策略——简单题直接问定义,难题要求给出推理链和法规依据。

出考题是门手艺。考题质量直接决定徒弟(小模型)的“见识上限”。种子数据就是老掌柜压箱底的真实病历,大模型则像一位勤快的徒弟——把每一份病历都拆解、重组、衍生出无数变体。生成出来的问答对,就是给未来小模型准备的“教材”。

Q(a)=w1C正确+w2C完整+w3C规范Q(a) = w_{1} C_{\text{正确}} + w_{2} C_{\text{完整}} + w_{3} C_{\text{规范}}
这是答案质量评分公式:答案 $a$ 的总分 $Q$ 等于“正确性”“完整性”“规范性”三个维度的加权和。实际使用中权重常取 $w_1=0.5$,$w_2=0.3$,$w_3=0.2$,分数低于阈值的问答对直接淘汰。
  1. 正确性检查答案是否与领域事实一致,是决定数据可用性的第一关。
    C正确∈[0,1]C_{\text{正确}} \in [0, 1]
  2. 完整性评估答案是否覆盖了问题要求的所有要点。
    C完整∈[0,1]C_{\text{完整}} \in [0, 1]
  3. 规范性判断术语使用与格式是否符合领域惯例。
    C规范∈[0,1]C_{\text{规范}} \in [0, 1]
  4. 加权求和三个维度按重要性加权汇总,得到最终质量分。
    Q=0.5 C正确+0.3 C完整+0.2 C规范Q = 0.5\,C_{\text{正确}} + 0.3\,C_{\text{完整}} + 0.2\,C_{\text{规范}}

事实性校验

老掌柜编考题有个规矩:每道题写完,必须与《药典》和历年医案对一遍。万一方子里有两味药相克,这题就不能收进考题册。大模型生成的内容,哪怕读起来再顺溜,也可能是凭空编造的——这种现象叫“幻觉”。如果把错误答案当成标准答案灌给小模型,徒弟学到的就是一本错书,越学越歪。所以领域数据扩充的第四关,是事实性校验。

校验手段大致有四层。第一层是交叉验证:请另一个大模型扮演“质检员”,对生成的问答做正误判断,两票制通过。第二层是自一致性:同一个问题让生成模型独立生成多次,如果答案彼此矛盾,说明知识掌握不牢,数据可疑。第三层是知识库比对:把答案与权威资料做向量检索匹配,计算语义重合度。第四层是专家抽审:从批次中随机抽样交给领域专家人工复核。前两层适合全量自动跑,后两层往往按比例抽样。

自一致性是实践中最常用的自动化手段,因为它不需要外部知识库,成本低。它的数学表达很朴素:如果答案 $a$ 是事实正确的,那么多轮独立生成的答案应该高度一致;反之,如果模型每次给的答案都不一样,那这个“标准答案”本身就站不住脚。

药方要复核才能抓药,考题要验证才能入库。事实性校验不是可选项,而是合成数据的“安检门”。一个没有过安检的领域数据集,生成得越漂亮,对下游模型的毒害就越深。

F自洽(a)=1K∑k=1KI[a(k)与a语义一致]F_{\text{自洽}}(a) = \frac{1}{K} \sum_{k=1}^{K} \mathbb{I}\left[ a^{(k)} \text{与} a \text{语义一致} \right]
这个公式衡量答案的“自洽程度”:对同一个问题独立生成 $K$ 次答案 $a^{(1)}, a^{(2)}, \ldots, a^{(K)}$,统计其中与初始答案 $a$ 语义一致的占比。$F$ 越接近 1,说明答案越稳定可靠,通常要求 $F \geq 0.8$ 才入库。
  1. 独立生成用相同问题多次调用模型,每次使用不同的采样随机性。
    {a(k)}k=1K=LLM(q),k=1,2,…,K\{a^{(k)}\}_{k=1}^{K} = \text{LLM}(q), \quad k = 1, 2, \ldots, K
  2. 语义比较用 $\mathbb{I}[\,\cdot\,]$ 指示函数判断两个答案是否表达同一个意思。
    I[a(k)与a语义一致]={1,一致0,不一致\mathbb{I}[a^{(k)} \text{与} a \text{语义一致}] = \begin{cases} 1, & \text{一致} \\ 0, & \text{不一致} \end{cases}
  3. 求平均所有轮次的一致性得分取平均,得到最终自洽分数。
    F=一致次数KF = \frac{\text{一致次数}}{K}

规模化量产

一个徒弟可以手把手教,一百个徒弟就得开班办学。当你要扩充的领域数据从几千条涨到几十万条时,老掌柜一个人再能干也应付不来,必须有一套标准化的“教学工厂”流程。规模化量产的秘诀不是让大模型更快,而是让流水线不堵车。

第一条是并行管道:把大模型 API 调用做成异步队列,几十路并发同时请求。比如用 asyncio 或线程池开 20 个 worker,每个 worker 从任务队列里取一个种子问题、生成一个问答对、返回结果。注意要做失败重试和限流,避免触发 API 限流被集体封禁。第二条是去重技术:大量生成的问答对里,语义重复的比例往往很高。用 SimHash 或 Embedding 相似度做近似去重,能砍掉三成以上的冗余数据。第三条是成本控制:根据问题难度动态选择模型——简单的定义题用便宜的小模型,复杂的推理题才用高端模型,整体成本能降一半以上。

在批量流水线下,抽检机制替代全量检查成为标配:每 100 条生成数据随机抽 5-10 条做人工复核,只要抽检合格率稳定在 95% 以上,就认为该批次质量达标。这个“有效数据量”的计算公式很直白——生成出来的数据,只有通过校验的才算数。

办学堂要懂管理,量产数据要懂工程。规模化的本质是把“老师傅的手艺”拆解成标准动作:取题、生成、校验、去重、抽检,每个环节都有明确指标。这样才能把大模型的产能真正转化为领域数据的“规模优势”。

N有效=N生成×p通过N_{\text{有效}} = N_{\text{生成}} \times p_{\text{通过}}
这个公式说明:最终能用于微调的有效数据量 $N_{\text{有效}}$,等于生成总量 $N_{\text{生成}}$ 乘以校验通过率 $p_{\text{通过}}$。通过率通常稳定在 60%-85%——你若发现通过率太低,就该回头优化提示词,而不是盲目加大生成量。
  1. 生成总量流水线里大模型实际产出的原始数据条数。
    N生成=采样次数×每条输出数N_{\text{生成}} = \text{采样次数} \times \text{每条输出数}
  2. 通过率通过事实性校验与质量过滤的数据比例。
    p通过=N合格N生成p_{\text{通过}} = \frac{N_{\text{合格}}}{N_{\text{生成}}}
  3. 有效数据两者相乘即得可入库的最终数据量。
    N有效=N生成×p通过N_{\text{有效}} = N_{\text{生成}} \times p_{\text{通过}}

质量控制

开办“教习班”后,老掌柜发现学生良莠不齐,得有一套“分班标准”——月考不合格的退回去重学。质量控制,就是给生成的数据建一道多级“筛子”。数据量一大,单靠事实性校验远远不够,还需要成体系的质量评分卡和清洗过滤流程。

质量评分卡是这套体系的打分表。规则类维度包括:文本长度是否合理(太短说明没答到内容,太长可能是废话连篇)、术语覆盖率是否达标(领域词汇占比过低说明不像内行)、是否包含明显的重复片段。模型类维度则让大模型按“正确性、完整性、规范性”三个维度打分。规则打分成本低所以全量跑,模型打分成本高所以抽样跑,两者加权合成为最终质量分。

冗余生成是提升质量的又一利器:同一个问题生成 3-5 个答案,挑选最一致的那个入库。这相当于让几位老师都做一遍同一道题,答案一致的才记进标准答案。人工复审则作为兜底闭环——按批次定期抽样,如果抽检发现异常比例上升,立即暂停流水线、回溯提示词设定。质量控制的目标,不是把每一条数据都做成满分,而是把质量下限抬到一个可接受的高度。

分班不是要淘汰孩子,而是要因材施教。质量控制的每一步筛掉的是“烂题”,留下的不是最多而是最稳。数据干净了,小徒弟后面的路才走得直。

p终检=p规则×p模型判×p人工核p_{\text{终检}} = p_{\text{规则}} \times p_{\text{模型判}} \times p_{\text{人工核}}
这是质量漏斗公式:最终通过率 $p_{\text{终检}}$ 等于规则过滤通过率、模型评分通过率、人工抽检合格率三者的乘积。任何一个环节的通过率低,都会拉低最终能用的数据比例。
  1. 规则过滤用长度、术语密度、重复度等硬指标先筛掉明显不合格的样本。
    p规则=N过规则N输入p_{\text{规则}} = \frac{N_{\text{过规则}}}{N_{\text{输入}}}
  2. 模型评分请大模型对答案质量打分,低于阈值者淘汰。
    p模型判=N过评分N过规则p_{\text{模型判}} = \frac{N_{\text{过评分}}}{N_{\text{过规则}}}
  3. 人工核验抽样人工复审,确认整个批次可信后才放行入库。
    p人工核=N抽检合格N抽检p_{\text{人工核}} = \frac{N_{\text{抽检合格}}}{N_{\text{抽检}}}

效果评估闭环

徒弟学了仨月,到底能不能独当一面?老掌柜的办法是:让他在模拟诊室里接诊。评估是领域数据扩充的最后一关,也是常常被忽视的一关——合成数据造了一大堆,却没人验证它到底有没有用。效果评估闭环就是要在“扩充数据”和“模型表现”之间建立可度量的因果。

具体做法是:先用扩充后的数据微调一个领域基础模型,然后在专门构建的基准集(benchmark)上做评测。基准集里全是真实场景中的人工标注题目,模拟徒弟“出诊”时会遇到的真实病人。评测指标根据任务而定:问答用 EM/F1,生成用 BLEU/Rouge,分类用 Accuracy。关键是要看加了扩充数据和不加扩充数据的对比曲线——如果评测指标提升明显,说明这批数据确实有效;如果提升微弱甚至下降,说明数据质量或配比出了问题。

数据配比是评估环节最值得调的超参数:合成数据与真实数据的混合比例,常见有 1:1、3:1、5:1 等。合成数据占比过高,模型会学到“人工味”,泛化变差;占比过低,扩充效果又不明显。建议从 1:1 起步,在验证集上二分搜索最优比例。更成熟的团队会把评估结果反馈到生成环节——发现哪类问题答得差,就多生成哪类数据,形成“评测—补数据—再评测”的迭代闭环。

出诊考核是最好的师傅。效果评估闭环让“扩充数据”这件事从“我觉得有用”变成了“评测证明有用”。每次评估都在回答一个问题:这批数据到底让徒弟变强了多少?答得好,继续扩;答得差,回头补。如此循环,领域数据的飞轮才能越转越快。

D微调=D真实 ∪ β⋅D合成D_{\text{微调}} = D_{\text{真实}} \, \cup \, \beta \cdot D_{\text{合成}}
这个公式表示:最终用于微调的数据集 $D_{\text{微调}}$,由真实数据 $D_{\text{真实}}$ 和合成数据 $D_{\text{合成}}$ 按比例混合组成。$\beta$ 是混合权重,实践中 $\beta$ 从 1.0 起步,根据评测效果上下调整。
  1. 真实数据人工标注的种子数据,是质量的锚点。
    D真实={(xi真,yi真)}i=1nD_{\text{真实}} = \{(x_i^{\text{真}}, y_i^{\text{真}})\}_{i=1}^{n}
  2. 合成数据大模型批量生成的领域数据,是规模的来源。
    D合成={(xj合,yj合)}j=1mD_{\text{合成}} = \{(x_j^{\text{合}}, y_j^{\text{合}})\}_{j=1}^{m}
  3. 混合比例控制合成数据在整个训练集里的占比。
    β=∣D合成∣∣D真实∣\beta = \frac{|D_{\text{合成}}|}{|D_{\text{真实}}|}

AI 应用场景

场景一:金融风控领域的反洗钱问答对扩充

阶段:训练数据准备

解决的问题:银行风控团队要微调一个领域问答模型,但真实标注的反洗钱问答对只有几百条,远远不够微调使用。人工标注一条专业问答要半小时,成本高且周期长。用大模型做领域数据扩充,可以在一天内生成上万条专业问答对,把数据量提升两个数量级。

具体案例:某银行算法团队收集了 500 条真实的反洗钱问答,用提示工程注入“风控专家”角色和《反洗钱规定》条文,再以“种子数据扩写 + 术语加权 + 自一致性校验”的流程批量生成。最终产出 1.2 万条问答对,经专家抽样审核后混入真实数据,微调后的模型在内部评测集上回答准确率从 68% 提升到 82%。

场景二:医疗领域的诊断知识库扩充

阶段:数据增强与知识注入

解决的问题:医疗问答模型普遍缺乏罕见病和基层常见病的问答数据。直接从公开数据集采集存在版权和隐私风险,而大模型生成则可以绕开隐私问题,覆盖更广的疾病谱系。

具体案例:某医疗科技公司围绕高血压、糖尿病等慢性病,用大模型生成“患者常问问题—医生标准回答”配对数据。生成时先用术语表约束医学名词(如“收缩压”“依从性”“药物相互作用”),再做事实性校验——与《中国高血压防治指南》做知识库比对,最后请两位专科医生抽审 10% 样本。扩充后的数据让基层版医疗问答模型的回答专业度评分提高 15%。

场景三:法律领域的合同条款问答生成

阶段:垂直领域模型微调

解决的问题:中小律所训练“合同审查助手”时,缺乏租赁合同、劳动合同等细分场景的问答数据。垂直领域术语(如“违约责任”“不可抗力”“格式条款”)对模型的专业度要求极高。

具体案例:某法律科技团队以 300 份真实合同为种子,用大模型批量生成“条款含义—风险提示—修改建议”三类问答对。通过术语行话控制确保输出包含法言法语,再用交叉验证剔除错误引用法条的数据。最终用 3 万条合成数据微调模型,合同风险点识别的召回率提升了 20 个百分点。

Python 演示

python83 行
import hashlibimport jsonfrom openai import OpenAI SYSTEM_PROMPT = "你是资深金融风控专家,请使用领域术语回答问题。" FEW_SHOT = [    {"question": "什么是贷款五级分类?",     "answer": "五级分类指按风险程度将贷款分为正常、关注、次级、可疑、损失五类,是银行信用风险管理的核心工具。"},     {"question": "不良贷款率如何计算?",     "answer": "不良贷款率等于次级、可疑、损失三类贷款余额之和除以各项贷款余额,再乘以百分之百。"},]  def build_prompt(topic, question):    demos = ""    for shot in FEW_SHOT:        demos += f"问:{shot['question']}\n答:{shot['answer']}\n\n"    return f"领域:{topic}\n请参照示例,生成专业问答对。\n{demos}问:{question}\n答:"  def generate_qa(client, topic, question, model="gpt-4o-mini", temperature=0.7):    resp = client.chat.completions.create(        model=model,        temperature=temperature,        messages=[            {"role": "system", "content": SYSTEM_PROMPT},            {"role": "user", "content": build_prompt(topic, question)},        ],    )    answer = resp.choices[0].message.content.strip()    return {"topic": topic, "question": question, "answer": answer}  def judge(client, question, answer):    resp = client.chat.completions.create(        model="gpt-4o-mini",        temperature=0.0,        messages=[            {"role": "system",             "content": "你是质检员,只回答'对'或'错',判断答案是否与金融领域常识一致。"},            {"role": "user",             "content": f"问题:{question}\n答案:{answer}\n请判断:"},        ],    )    return resp.choices[0].message.content.strip().startswith("对")  def check_factuality(client, question, answer, k=2):    votes = sum(1 for _ in range(k) if judge(client, question, answer))    return votes >= k - 1  # 两票制:至少一票通过  def dedup(items):    seen = set()    result = []    for item in items:        key = hashlib.md5(item["question"].strip().encode("utf-8")).hexdigest()        if key in seen:            continue        seen.add(key)        result.append(item)    return result  def main():    client = OpenAI()    seeds = ["什么是KYC?", "大额交易报告的标准是什么?"]    generated = []    for q in seeds:        item = generate_qa(client, "反洗钱", q)        if check_factuality(client, item["question"], item["answer"]):            generated.append(item)    clean = dedup(generated)    with open("domain_qa.jsonl", "w", encoding="utf-8") as f:        for item in clean:            f.write(json.dumps(item, ensure_ascii=False) + "\n")    print(f"生成 {len(clean)} 条领域问答对")  if __name__ == "__main__":    main()
目的:这是“领域问答对批量生成流水线”的简化版——先用种子问题让大模型生成专业问答,再用大模型自己当“质检员”做事实性校验,最后哈希去重并落盘,演示了领域数据扩充的核心链路。
  1. SYSTEM_PROMPT = "你是资深金融风控专家,请使用领域术语回答问题。"设定领域角色,把模型切到“专业模式”
  2. demos += f"问:{shot['question']}\n答:{shot['answer']}\n\n"把示范样本拼成 few-shot 提示块,让模型模仿风格
  3. "content": build_prompt(topic, question)组装好的提示词作为用户消息发给模型
  4. answer = resp.choices[0].message.content.strip()取出模型返回的答案并去掉首尾空白
  5. return votes >= k - 1两票制:至少一票通过,这一行是事实性校验的核心逻辑
  6. key = hashlib.md5(item["question"].strip().encode("utf-8")).hexdigest()对问题文本取哈希指纹,快速去重
  7. f.write(json.dumps(item, ensure_ascii=False) + "\n")将校验通过的问答对逐行写入 JSONL 文件,方便后续微调读取

常见误区

误区大模型反正不要钱似的,尽量多生成,100 万条合成数据一股脑灌给小模型,效果肯定好。数据量大了,模型见识自然就广了。

正解数据多不等于质量高。低质量合成数据会引入幻觉和噪声,模型学到的不是领域知识而是“编造话术”。济世堂带徒弟,背一百本错书不如读透十本好书。业界普遍做法是“少量高质量 + 精清洗 + 与真实数据按比例混合”,而不是盲目追求数量。

为何常见:直觉上“量变引起质变”,忽略了错误样本的累积破坏力——模型对反复出现的错误模式记得更牢。

误区把领域专业词汇表往 prompt 后面一贴,模型就会自动使用这些术语。词汇表越全,生成的结果越专业。

正解堆词汇表缺少结构化引导,模型不知道何时用、怎么用。关键是给出术语的上下文示例和风格校准,让模型在类似语境里模仿“行话用法”。就像只给徒弟一本《药典》却不教辨证,他连伤寒和温病都分不清。术语必须放进具体问答场景里才有生命力。

为何常见:人们习惯把知识理解为“词汇列表”,忽略了知识的结构化属性——术语的使用方式与场景紧密绑定。

误区大模型生成的问答读起来很专业、很流畅,肯定是对的,直接拿去微调就行。校验太麻烦,还花钱。

正解LLM 的“幻觉”恰恰表现为生成得越流畅、越笃定,越像真的。例如“KYC 的含义”这种基础概念正确率还行,但“大额交易报告阈值是多少”这类数值问题很容易过时或出错。必须做交叉验证/知识库比对,甚至人工抽检,否则错误答案会被当成标准答案教给小模型。

为何常见:模型的输出自带“权威口吻”,流畅自信的表达容易让人放下戒备心。

误区既然大模型什么都能写,那就让它从零生成所有领域数据,完全抛开真实数据。合成数据质量高,真实数据反而多余。

正解纯合成数据的分布会和真实世界偏离——真实用户的提问习惯、真实场景的噪声、真实的长尾问题,大模型都想象不出来。更好的做法是以真实种子数据为锚点做扩写、改写、变体,并保留一部分真实数据参与混合训练。老掌柜编的题目再妙,也得结合济世堂的真实病历才能接地气。

为何常见:被大模型“无所不能”的营销话术迷惑,忽略了真实锚点对数据分布的核心价值。

面试题

Q1. 用大模型扩充领域数据时,把术语表直接贴在提示词末尾通常效果较差,最可能的原因是?

单选题 · easy

  • A.术语表太长超出模型上下文窗口
  • B.缺少结构化指引模型不知怎么用← 正确答案
  • C.术语与通用词汇混合导致解混乱
  • D.术语表越全模型越容易产生幻觉

答案:B。提示词不是“知识堆砌”。模型需要角色设定、任务指令、示例示范等结构化信息,才知道术语该在什么位置、以什么方式使用。就像给徒弟一本药典却不教辨证,他仍然不会看病。其他选项要么把问题归因于上下文长度,要么归因于幻觉,都不是核心原因。

Q2. 关于少样本示范(few-shot)在领域问答生成中的作用,说法正确的是?

单选题 · mid

  • A.示范样本越多样效果就一定越好
  • B.少量高质量样本即可显著约束输出← 正确答案
  • C.少样本会让模型过度模仿示例格式
  • D.少样本会显著增加推理时的延迟

答案:B。3-5 个精心挑选的高质量领域样本,足以让大模型学会“这类问题应该用什么风格回答”。这相当于给老掌柜看了几张标准方子,他立刻明白病人的体质类型。选项 A 太绝对;C 是夸大了副作用的误解;D 是把 prompt 长度影响 token 数混同为“显著延迟”。

Q3. 领域数据事实性校验的常用手段有哪些?

多选题 · mid

  • A.多模型交叉判断即模型当裁判← 正确答案
  • B.同一问题多轮生成看自一致性← 正确答案
  • C.与外部知识库向量检索比对← 正确答案
  • D.对全部生成数据人工逐条审核

答案:ABC。交叉验证、自一致性、知识库比对都是可规模化落地的事实性校验方法。人工逐条审核虽然准确,但几十万条数据全部人工审阅成本太高、周期太长,业界通常抽样审核,所以 D 不是“常用手段”。

Q4. 批量生成专业问答对时,提升问题多样性最直接有效的策略是?

单选题 · mid

  • A.提高采样温度并无限次重试同一题
  • B.从为何怎么办等多元视角设计提问← 正确答案
  • C.把通用数据集翻译成领域风格
  • D.控制上下文只让模型关注一个主题

答案:B。从“是什么、为什么、怎么办、有何风险、如何防范”等不同视角设计提问模板,能系统性地扩充问题空间。这与老掌柜从辨证、立法、用方、调护等不同角度出题同理。单纯调温度只会产生近义表述,翻译通用集合并不能获得真正的领域问题。

Q5. 在解码阶段做术语白名单加权,核心思想是?

单选题 · hard

  • A.禁止模型输出任何通用高频词汇
  • B.对术语集合内的词提升采样概率← 正确答案
  • C.用正则替换将通用词改成术语
  • D.缩短上下文以减少非术语的干扰

答案:B。加权解码是在模型生成每个词时,若候选词在术语表集合中,则将其概率乘以一个大于 1 的系数,从而让术语更可能被选中。A 错在“禁止所有通用词”——模型仍需要通用词来组织语言;C 是文本后处理而非解码控制;D 与术语加权毫无关系。

Q6. 规模化扩充领域数据时,合理的工程策略包括?

多选题 · hard

  • A.用异步队列并行调用模型接口← 正确答案
  • B.用SimHash识别并丢弃近似重复← 正确答案
  • C.对每个批次随机抽样人工复核← 正确答案
  • D.关闭校验环节以节省API成本

答案:ABC。并行管道提升吞吐量,SimHash 去重消除冗余,按批次抽样复核保证质量下限,这些都是规模化生产的标准动作。校验环节是数据质量的“安检门”,绝不能省——关闭校验省下的成本,会在下游微调效果上加倍还回来。

Q7. 扩充数据在模型微调前,最合理的处理方式是?

单选题 · easy

  • A.直接混入训练集不作任何过滤
  • B.清洗过滤后与真实数据按比例混合← 正确答案
  • C.全部采用合成数据并移除真实数据
  • D.手动堆叠数据确保总量更大

答案:B。合成数据需要先清洗过滤(去重、去幻觉、去低分),再与真实数据按比例混合,这样既保持数据规模,又锚定真实分布。直接混入可能引入噪声;只留合成数据会让模型偏离真实场景;盲目堆叠只会放大问题。这不就像徒弟既要背考题册,也要跟诊真实病人吗?

Q8. “种子数据扩写”的正确含义是?

单选题 · mid

  • A.随机生成文本再挑选其中较好的
  • B.以少量真实样本为种子生成变体← 正确答案
  • C.从通用语料中抓取相关段落
  • D.对模型重复采样直到输出满意

答案:B。种子数据扩写是以真实的高质量问答为“种子”,让大模型通过改写、变换提问角度、补充细节来批量生成变体。随机生成的文本没有锚点,通用语料抓取不解决领域问题,只对模型重复采样是在原地打转——产出再多也离不开种子的范畴。

Q9. 评估领域数据扩充效果最可靠的最终指标是?

单选题 · hard

  • A.生成文本的格式是否整齐规范
  • B.微调模型在下游评测集的指标← 正确答案
  • C.生成数据总量是否超过百万条
  • D.数据生成过程是否完全自动化

答案:B。数据扩充是否有效,最终要看微调后的领域模型在真实标注的评测集上表现是否提升——这是唯一直接衡量“数据价值”的标尺。格式美观、总量大、流程自动化都只是手段。就像徒弟学得好不好,不能看记得多不多,要看门诊时能不能治好病人。

Q10. 领域知识注入提示词时,合理的策略包含?

多选题 · easy

  • A.设定领域角色比如你是风控专家← 正确答案
  • B.明确任务指令并附高质量示例← 正确答案
  • C.给出可查询的领域知识参考← 正确答案
  • D.只写多说术语不提供任何例子

答案:ABC。角色设定让模型进入领域语境,任务指令明确产出目标,高质量示例示范格式风格,知识参考划定事实边界——这是知识注入的四要素。D 只叮嘱“多说术语”而不给例子,等于只喊口号不教方法,模型不知道该在什么情境下使用术语,与第二题同理。