使用合成数据对RAG进行嵌入微调
2023年9月10日更新:我们已将嵌入微调抽象纳入LlamaIndex仓库,因此本仓库技术上已过时!请查看核心文档中的嵌入微调指南。
本仓库向您展示如何微调嵌入模型以提高RAG性能,即使您没有标记数据(即查询/相关文档的正样本对)。
我们将逐步介绍使用LLM生成合成数据集、微调开源嵌入模型以及最终评估微调模型的过程。
我们使用小规模金融PDF文档数据集进行实验,并展示微调嵌入模型可以显著提高检索性能。
设置
要开始,请克隆此仓库并安装依赖项。您还需要克隆llama_index仓库以获取示例PDF。
git clone git@github.com:jerryjliu/llama_index
git clone git@github.com:run-llama/finetune-embedding.git
cd finetune-embedding
pip install -r requirements.txt
然后您可以运行笔记本(例如通过jupyter lab
)。
这些笔记本相当轻量,几乎可以在任何机器上运行。
运行步骤
- 运行generate_dataset.ipynb以生成用于训练和评估的合成数据集
- 运行finetune.ipynb以微调预训练的开源嵌入模型
- 运行evaluate.ipynb以评估微调模型,并与预训练基础嵌入模型和专有的OpenAI嵌入模型进行比较。
工作原理
1. 生成用于训练和评估的合成数据集
这里的关键思想是我们可以利用LLM生成假设性问题,这些问题最好由给定的上下文来回答。这允许我们以可扩展的方式生成合成的(查询,相关文档)正样本对,而无需人工标注。
具体来说,我们首先将给定文档处理成文本块语料库。然后对于每个文本块,我们使用LLM生成几个可以用该文本块中的信息回答的假设性问题。最后,我们将所有问题和文本块对收集为数据集。
2. 微调开源嵌入模型
我们利用sentencetransformers
的高级模型拟合API,非常轻松地设置训练过程。我们使用MultipleNegativesRankingLoss
作为训练目标,使用InformationRetrievalEvaluator
作为训练期间的评估器。我们使用开源的"BAAI/bge-small-en"作为基础模型,并进行少量轮次的训练。
3. 评估嵌入模型
我们将微调模型与基础模型以及OpenAI嵌入模型进行比较。我们使用InformationRetrievalEvaluator
以及简单的命中率指标进行评估。