dot Redis 8 来了——而且它是开源的

了解更多

通过微调嵌入模型获得更好的 RAG

GitHub 上的完整 Notebook.

GitHub 上的修改后 Notebook.

要构建像金融领域的 RAG 这样有效的问答系统,你需要一个理解该行业词汇的模型。通用嵌入模型通常缺乏准确检索信息所需的领域特定知识。

微调正是为此而来。使用金融数据集训练领域特定的嵌入模型,或使用为金融文本构建的预训练模型,有助于系统根据用户查询检索准确、相关的信息。

让嵌入模型真正理解医学、法律或金融等专业领域,仅靠现成解决方案是不足够的。本指南将逐步介绍如何使用领域特定数据集进行微调,以捕捉细微的语言模式和概念。其回报是在你的领域中实现更准确的检索和更强大的 NLP 性能。

作为向量的嵌入

嵌入是将文本、图像或音频映射到多维空间中以捕捉语义关系的数值表示。在这个空间中,相似的项目(例如,单词或短语)位置更接近,反映了它们的语义相似性,而不同的项目则相距更远。这种结构使得嵌入在自然语言处理、图像识别和推荐系统等任务中非常强大。

嵌入对于许多 NLP 任务至关重要,例如

  • 语义相似性:衡量两个文本或图像之间的关联紧密程度。
  • 文本分类:根据文本的含义对数据进行分类。
  • 问答:识别最相关的文档来回答查询。
  • 检索增强生成 (RAG):通过将用于检索的嵌入模型与语言模型相结合来增强文本生成。

Bge-base-en

由北京人工智能研究院 (BAAI) 开发的 BAAI/bge-base-en-v1.5 模型是一款通用文本嵌入模型,在 NLP 任务中表现出色。它在 MTEB 和 C-MTEB 等基准测试中表现良好,特别适用于计算资源有限的应用。

为什么要微调嵌入?

为特定领域微调嵌入模型可以通过将模型的相似性指标与领域特定上下文和语言对齐来增强检索增强生成 (RAG) 系统。这提高了相关文档的检索效率,从而产生更准确、更符合上下文的响应。

数据集格式:构建微调的基础

  • 正样本对:一对相关的句子,例如问题及其对应的答案,它们彼此相似。
  • 三元组:由三个元素组成的集合——一个锚点、一个正样本和一个负样本——其中锚点与正样本相似,但与负样本不同。
  • 带相似性分数的对:一对句子以及量化它们关系的相似性分数。
  • 带类别的文本:文本与其对应的类别标签配对,指示其类别或分类。

损失函数:指导训练过程

损失函数对于训练嵌入模型至关重要,因为它们衡量模型预测与实际标签之间的差异,指导权重调整。不同的损失函数适用于各种数据集格式

  • 三元组损失:与(锚点、正样本、负样本)三元组一起使用,使相似的句子更接近,不相似的句子更远。
  • 对比损失:应用于正样本对和负样本对,鼓励相似的句子接近,不相似的句子远离。
  • 余弦相似度损失:与句子对和相似性分数一起使用,旨在将余弦相似度与提供的分数对齐。
  • Matryoshka loss:用于创建可截断 Matryoshka 的专用损失函数。
  • MultipleNegativesRankingLoss:如果您只有正样本对,例如只有相似文本对,如释义对、重复问题对、(查询, 响应) 对或 (源语言, 目标语言) 对,这是一种出色的损失函数。

代码示例

我们将使用 unstructured 库从 PDF 文件中提取文本和表格。

unstructured library

使用 LangChain 将提取的文本分解为可管理的小块。这对于使文本更适合 LLM 处理至关重要。

chunks using LangChain

合成数据集生成

为 Hugging Face Llama 模型创建一个提示,要求根据给定的文本块生成一个问题-答案对。

Hugging Face Llama model

LLM 的示例响应

问题:2004 年 NVIDIA 公司 10-K 报告的提交日期是多久? 

答案:2004 年 NVIDIA 公司 10-K 报告的提交日期是 5 月 20 日、3 月 29 日和 4 月 25 日。

接下来,将从 CSV 文件生成的 QA 对加载到 HuggingFace 数据集中。我们确保数据格式正确,以便进行微调。

QA pairs

使用 sentence_transformers 从 Huggingface ( BGE: 用于搜索和 RAG 的一站式检索工具包 ) 加载 bge-base-en-v1.5

Huggingface

创建一个 InformationRetrievalEvaluator 评估器,用于衡量模型在训练期间的性能。评估器使用 InformationRetrievalEvaluator 评估模型的检索性能。

InformationRetrievalEvaluator

损失函数 MultipleNegativesRankingLoss 有助于模型生成适合检索任务的嵌入。

MultipleNegativesRankingLoss,

使用 SentenceTransformerTrainingArguments 定义训练参数。这包括

  • 输出目录,
  • 训练轮数 (epochs)
  • 批处理大小 (batch size)
  • 学习率
  • 评估策略

metric_for_best_model=”bge-base-en_dot_ndcg@10″, # 针对 128 维度的最佳 ndcg@10 分数进行优化

metric_for_best_model

创建一个 SentenceTransformerTrainer 对象,指定模型、训练参数、数据集、损失函数和评估器

SentenceTransformerTrainer object

trainer.train() 方法启动微调过程,使用提供的数据和损失函数更新模型的权重。

trainer.train

微调前 bge-base-en_dot_ndcg@10 指标为 0.5949908809486526。

bge-base-en_dot_ndcg

微调后 bge-base-en_dot_ndcg@10 指标为 0.8245911858212284。

metric after tuning

为您的领域微调嵌入模型有助于 NLP 应用更好地理解行业特定语言和概念,从而使问答、文档检索和文本生成等任务更加准确。

构建领域特定嵌入模型的实用技术包括利用 MRL 和使用 BGE-base-en 等强大模型。虽然微调是关键,但数据集的质量和精心策划对于取得最佳结果同样重要。

NLP 正在不断发展,新的嵌入模型和微调方法不断拓展可能性。紧跟这些变化并完善您的方法将有助于您构建更智能、更有效的领域特定应用。