为 RAG 生成合成数据集
RAG 的合成数据设置
不幸的是,在机器学习工程师的职业生涯中,经常会面临标记数据不足或很少的情况。通常,当意识到这一点时,项目就会开始漫长的数据收集和标记过程。只有经过几个月后,才能开始开发解决方案。
然而,随着 LLM 的出现,某些产品的范式发生了转变:现在可以依赖 LLM 的泛化能力,几乎立即测试想法或开发 AI 驱动的功能。如果结果证明其(几乎)按预期工作,那么传统的开发过程就可以开始了。

图片来源:《AI 工程师的崛起》,作者 S. Wang (在新标签页中打开)
一种新兴的方法是检索增强生成(RAG) (在新标签页中打开)。它用于知识密集型任务,在此类任务中不能完全依赖模型的现有知识。RAG 将信息检索组件与文本生成模型相结合。要了解更多关于此方法的信息,请参阅指南中的相关章节 (在新标签页中打开)。
RAG 的关键组成部分是检索模型,它识别相关文档并将其传递给 LLM 进行进一步处理。检索模型的性能越好,产品或功能的效果就越好。理想情况下,检索模型开箱即用效果良好。然而,其性能在不同语言或特定领域中常常会下降。
想象一下:你需要创建一个基于捷克法律和法律实践(当然是捷克语)回答问题的聊天机器人。或者设计一个针对印度市场的税务助手(OpenAI 在 GPT-4 发布会上展示的一个用例)。你很可能会发现,检索模型经常会遗漏最相关的文档,并且总体性能不佳,从而限制了系统的质量。
但有一个解决方案。一种新兴趋势涉及使用现有 LLM 来合成数据,用于训练新一代的 LLM/检索器/其他模型。这个过程可以看作是通过基于提示的查询生成将 LLM 蒸馏到标准大小的编码器中。虽然蒸馏计算量很大,但它能显著降低推理成本,并可能极大地提高性能,尤其是在低资源语言或专业领域。
在本指南中,我们将依赖最新的文本生成模型,如 ChatGPT 和 GPT-4,它们可以根据指示生成大量的合成内容。Dai 等人(2022 年) (在新标签页中打开)提出了一种方法,仅需 8 个手动标记的示例和大量未标记数据(用于检索的文档,例如所有解析的法律条文),就可以达到接近最先进(State-of-the-Art)的性能。这项研究证实,合成生成的数据有助于训练任务特定的检索器,特别是在领域内监督微调因数据稀缺而面临挑战的任务中。
领域特定数据集生成
要利用 LLM,需要提供一个简短的描述并手动标记少量示例。重要的是要注意,不同的检索任务具有不同的搜索意图,这意味着“相关性”的定义不同。换句话说,对于相同的(查询,文档)对,它们的关联性可能完全基于搜索意图而不同。例如,论证检索任务可能寻求支持性论证,而其他任务则需要反驳性论证(如在ArguAna 数据集 (在新标签页中打开)中所示)。
请考虑下面的例子。尽管为了便于理解用英语写成,但请记住数据可以是任何语言,因为 ChatGPT/GPT-4 即使处理低资源语言也非常高效。
提示
Task: Identify a counter-argument for the given argument.
Argument #1: {insert passage X1 here}
A concise counter-argument query related to the argument #1: {insert manually prepared query Y1 here}
Argument #2: {insert passage X2 here}
A concise counter-argument query related to the argument #2: {insert manually prepared query Y2 here}
<- paste your examples here ->
Argument N: Even if a fine is made proportional to income, you will not get the equality of impact you desire. This is because the impact is not proportional simply to income, but must take into account a number of other factors. For example, someone supporting a family will face a greater impact than someone who is not, because they have a smaller disposable income. Further, a fine based on income ignores overall wealth (i.e. how much money someone actually has: someone might have a lot of assets but not have a high income). The proposition does not cater for these inequalities, which may well have a much greater skewing effect, and therefore the argument is being applied inconsistently.
A concise counter-argument query related to the argument #N:
输出
punishment house would make fines relative income
一般来说,此类提示可以表示为
其中 和 分别是任务特定的文档和查询描述, 是针对 ChatGPT/GPT-4 的任务特定提示/指令,而 是一个新文档,LLM 将为其生成查询。
从此提示中,只有最后一个文档 和生成的查询将被用于本地模型的进一步训练。当目标检索语料库 可用,但新任务的标注查询-文档对数量有限时,可以应用此方法。
整个流程概述

图片来源:Dai 等人(2022 年) (在新标签页中打开)
负责任地处理手动标注示例至关重要。最好准备更多示例(例如 20 个),然后随机选取 2-8 个用于提示。这可以在不显著增加标注时间成本的情况下提高生成数据的多样性。然而,这些示例应该具有代表性,格式正确,甚至详细说明目标查询长度或语气等具体细节。示例和指令越精确,用于训练检索器的合成数据就越好。低质量的少样本示例可能会对训练模型的最终质量产生负面影响。
在大多数情况下,使用像 ChatGPT 这样更经济的模型就足够了,因为它在不同寻常的领域和除英语以外的语言上表现良好。假设一个包含指令和 4-5 个示例的提示通常占用 700 个 token(假设每个段落由于检索器的限制不超过 128 个 token),生成内容为 25 个 token。因此,为一个包含 50,000 个文档的语料库生成合成数据集用于本地模型微调的成本为:50,000 * (700 * 0.001 * $0.0015 + 25 * 0.001 * $0.002) = 55
,其中 $0.0015
和 $0.002
是 GPT-3.5 Turbo API 中每 1,000 个 token 的成本。甚至可以为同一文档生成 2-4 个查询示例。然而,通常进一步训练的好处是值得的,特别是如果你使用的检索器不是用于通用领域(如英语新闻检索),而是用于特定领域(如前面提到的捷克法律)。
50,000 这个数字并非随意选取。在Dai 等人(2022 年) (在新标签页中打开)的研究中提到,这大致是一个模型达到与在合成数据上训练的模型相同质量所需的手动标记数据量。想象一下,在推出产品之前必须收集至少 10,000 个示例!这至少需要一个月时间,而且人工成本肯定会超过一千美元,远远高于生成合成数据和训练本地检索器模型的成本。现在,有了你今天学到的这项技术,你只需几天就能实现两位数的指标增长!

图片来源:Dai 等人(2022 年) (在新标签页中打开)
以下是同一篇论文中针对 BeIR 基准测试中某些数据集的提示模板。
