手工微调embedding模型,让RAG应用检索能力更强

BAAI/bge-small-en

目前HuggingFace的MTEB(海量文本Embedding基准)排行榜上排名第一的Embedding模型是big-large-en,它由北京人工智能研究院(BAAI,智源)开发。它是一种预训练的transformer模型,可用于各种自然语言处理任务,如文本分类、问答、文本生成等。该模型在海量文本和代码数据集上进行训练,并在海量文本Embedding基准(MTEB)上进行了微调。

在本文中,我们将使用 big-large-en的缩小版big-small-en,这是一个384维的小规模模型(OpenAI是1500+维),具有竞争力的性能,非常适合在Google Colab中运行。大家也可以选择中文版的bge-base-zh-v1.5,只有0.1G。当然你的硬件环境允许,也可以使用1.3G的bge-large-zh-v1.5等embedding模型。

微调Embedding模型与微调LLM

与LLM(大语言模型)微调相比,big-small-en微调的实现有一些不一样,下面简单说一下异同点:

相似点

  • 两种类型的微调都遵循相同的方法,即生成用于训练和评估的数据集,微调模型,最后评估基本模型和微调模型之间的性能。
  • 使用LLM自动生成训练和评估数据集。

不同点

  • 数据集内容在LLM微调和Embedding模型微调之间有所不同。用于LLM微调的数据集包含LLM生成的问题。在微调过程中,包括问题、答案、系统prompt等在内的一系列数据将以JSON行( jsonl)文件的形式传递给要进行微调的模型。

不同的是,用于Embedding模型微调的数据集包含以下三组:

  1. queriesnode_id映射和LLM生成的问题的集合。
  2. corpusnode_id映射和相应节点中的文本的集合。
  3. relevant_docs:查询的node_id和语料库 node_id之间的交叉引用映射的集合。给定一个查询,它告诉Embedding模型要查找哪个文本节点/语料库。
  • 由于我们使用开源Embedding模型bge-small-en ,微调的前提就是要先把它下载到您的本地环境。以Google Colab为例,经过微调的模型将被下载到笔记本的根目录中。
  • 评估方法在微调Embedding模型和微调LLM之间有所不同,我们可以使用Ragas框架来衡量精准度和答案相关性。然而,当使用Embedding模型微调时,我们无法测量答案的正确性,因为我们只能为我们的问题检索相关节点。相反,我们使用一个称为“命中率”的简单度量,这意味着对于每个(query, relevant_doc)对,我们用查询检索top-k文档,如果结果包含relevant_doc,则它被认为是“命中”的。该指标可用于专有Embeddings,如OpenAI的Embedding模型和开源Embedding模型。对于开源Embedding模型,我们还可以使用来自sentence_transformersInformationRetrievalEvaluator进行评估,因为它提供了一套更全面的指标。

微调Embedding模型似乎涉及到很多问题。幸运的是,LlamaIndex(我个人感觉LlamaIndex目前的发展可能会在RAG方面打败LangChain)在最近的0.8.21版本中引入以下关键类/函数,使得微调Embedding模型变得超级简单:

  • SentenceTransformersFinetuneEngine
  • generate_qa_embedding_pairs
  • EmbeddingQAFinetuneDataset

这些类和函数为我们抽象了底层的详细集成逻辑,使开发人员能够非常直观地调用它。

<

### RAG 嵌入式模型在 NLP 中的实现与使用 #### 背景概述 检索生成(Retrieval-Augmented Generation, RAG)是一种结合了检索模块和生成模块的方法,旨在解决知识密集型自然语言处理任务中的信息不足问题[^1]。RAG 的核心在于其能够动态地从外部数据库或文档集合中检索相关信息,并将其融入到生成过程之中。 #### 文本嵌入的作用 文本嵌入通过捕捉丰富的语言特征和语义细微差别,增RAG 模型的生成能力[^3]。具体而言,在答案生成阶段,RAG 利用预训练的编码器将输入查询映射到高维向量空间,并在此基础上执行相似度匹配以找到最相关的上下文片段。这些上下文随后被传递给解码器用于最终响应的构建。 #### 实现流程 以下是基于 Python 和 Hugging Face Transformers 库的一个简单示例,展示如何加载并运行一个基本版本的 RAG 模型: ```python from transformers import RagTokenizer, RagTokenForGeneration # 初始化 tokenizer 和 model tokenizer = RagTokenizer.from_pretrained("facebook/rag-token-base") model = RagTokenForGeneration.from_pretrained("facebook/rag-token-base") def generate_answer(question): input_ids = tokenizer.question_encoder([question], return_tensors="pt")["input_ids"] generated = model.generate(input_ids) answer = tokenizer.batch_decode(generated, skip_special_tokens=True)[0] return answer # 测试函数 print(generate_answer("What is Retrieval Augmented Generation?")) ``` 此脚本定义了一个 `generate_answer` 函数,它接受一个问题字符串作为参数,并返回由 RAG 模型产生的相应解答[^2]。 #### 技术细节扩展 对于复杂的场景或者定制需求,可以考虑调整以下几个方面: - **索引优化**: 使用 FAISS 或 Annoy 等高效近似最近邻算法加速大规模数据集上的检索操作。 - **领域适配**: 对特定行业术语较多的应用场合重新微调 embeddings 表征层以便好地理解专业词汇含义。 - **多模态支持**: 将视觉、音频等形式的信息纳入考量范围从而拓宽应用场景边界。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值