原文:Efficient Information Retrieval with RAG Workflow - 2023.10.09

实现: Implementing RAG with Langchain and Hugging Face - 2023.10.16

检索增强生成(RAG)突破了知识限制,融入外部数据,并增强了上下文理解。

由于其能够高效整合外部数据而无需持续微调,这一技术正变得越来越受欢迎。

LLM Knowledge Limitations

大型语言模型在知识的准确性和时效性方面面临诸多挑战,其中两个常见问题是幻觉和知识截断。

  • 幻觉(Hallucination): 这是指模型自信地生成了错误的回应。例如,如果模型声称“googly retriever”是一种真实存在的犬种,这就是一种幻觉,可能会导致误导性信息。

    ![](https://www.aiuai.cn/uploads/2501/b4de3095f380f45f.png)
  • 知识截断(Knowledge Cut-off): 这是指大型语言模型(LLM)基于其训练数据返回过时信息的情况。每个基础模型都有一个知识截断点,这意味着其知识仅限于训练时可用的数据。例如,如果询问模型最近的NBA冠军得主,它可能会给出过时的信息。

RAG 提供了一种缓解这些挑战的技术。它使模型能够访问外部数据源,通过引入事实背景来减少幻觉,并通过整合最新信息来克服知识截断的问题。

Retrieval-Augmented Generation (RAG)

检索增强生成(RAG)是一种灵活的框架,使大型语言模型(LLM)能够访问超出其训练数据范围的外部数据。RAG 并不局限于单一实现,而是可以适应不同任务和数据格式的多种方法。

它使 LLM 在运行时能够利用外部数据源,包括知识库、文档、数据库以及互联网。这对于利用外部数据增强语言模型至关重要,有助于弥补其训练数据未涵盖的知识空白。

为了高效地从文档中检索信息,常见的做法是使用嵌入向量来捕捉语义信息,并将文档索引到向量数据库中。此外,对大型文档进行分块(chunking)可以提高相关性并减少噪音,从而通过提供更具体的上下文信息来增强模型的响应质量。

RAG Framework

在 RAG 框架中有两种关键模型:

RAG-Sequence Model

该模型使用相同的检索文档来生成完整的序列。它将检索到的文档视为单个潜在变量,并通过 Top-K 近似 进行边际化,以获取序列到序列的概率。在此方法中,检索器提取 前 K 个 相关文档,生成器计算每个文档对应的输出序列概率,最终通过边际化合并这些概率。

RAG-Token Model

在该模型中,每个目标 token(输出的每个词)都可以来自不同的潜在文档,使得生成器在回答时能够从多个文档中选择内容。与 RAG-Sequence 模型类似,它首先检索 前 K 个 相关文档,然后针对每个文档生成 下一个输出 token 的概率分布。这一过程会对每个输出 token 进行重复计算,并相应地进行边际化处理。

此外,RAG 还可以用于序列分类任务,将目标类别视为单一序列目标。在这种情况下,RAG-Sequence 模型和 RAG-Token 模型的表现将趋于一致。

RAG 组成

  1. 检索器(Retriever):

    检索器(DPR)根据查询和文档索引检索相关文档。该检索组件基于 **Dense Passage Retrieval(DPR)**,采用 **双编码器(bi-encoder)** 结构,其中密集表示(dense representations)和查询表示(query representations)均由 **BERT** 生成。随后,通过 **最大内积搜索(MIPS, Maximum Inner Product Search)** 算法,选择 **前 K 个** 具有最高先验概率的文档。
    
  1. 生成器(Generator):

    生成器基于 **BART-large**,负责生成文本序列。它通过 **简单地将输入与检索到的内容拼接(concatenation)**,来增强生成效果。
    

训练阶段

在训练过程中,检索器(Retriever)生成器(Generator) 采用 联合训练(joint training),且 不会对具体应检索的文档进行直接监督。训练目标是最小化每个目标的负边际对数似然(negative marginal log-likelihood)

解码阶段

在解码阶段,RAG-Sequence 和 RAG-Token 模型需要不同的方法。RAG-Token 使用标准的自回归序列生成和束搜索解码(beam decoder)。相比之下,RAG-Sequence 对每个文档运行束搜索,并使用生成器概率对假设进行评分。对于较长的输出序列,采用了一种高效的解码方法,以避免过多的前向传播。

RAG 实现

实施 RAG 工作流程可能很复杂,涉及多个步骤,从接受用户提示到查询数据库、文档分块,以及协调整个过程。

框架如 LangChain 通过提供模块化组件来简化这一过程,使其能够与大型语言模型(LLMs)和增强技术(如 RAG)协同工作。LangChain 包括用于各种输入格式的文档加载器、用于分割文档的文档转换器,以及其他组件,以简化 LLM 驱动应用程序的开发。

LangChain RAG

LangChain 是一个全面的自然语言处理平台,在使 RAG 模型变得可访问和高效方面发挥了关键作用。以下是 LangChain 如何融入 RAG 工作流程的:

Document Loaders and Transformers

LangChain 提供了广泛的文档加载器,可以从各种来源获取文档,包括私有 S3 存储桶和公共网站。这些文档可以是多种类型,例如 HTML、PDF 或代码。文档转换器组件负责准备这些文档以便检索,包括将大型文档拆分成更小、更易管理的块。

Text Embedding Models

LangChain 中的文本嵌入模型旨在与各种文本嵌入提供者和方法接口,包括 OpenAI、Cohere 和 Hugging Face。这些模型创建文本的向量表示,捕捉其语义含义。这种向量化使得高效检索相似文本片段成为可能。

Vector Stores

随着嵌入(embeddings)技术的兴起,存储和搜索这些嵌入所需的高效数据库变得至关重要。LangChain 提供与超过 50 种不同向量存储的集成,使得选择最适合您需求的存储方案变得简单

Retrievers

LangChain中的检索器提供了一个接口,用于根据查询检索相关文档。这些检索器可以使用向量存储作为其基础,但也支持其他类型的检索器。LangChain的检索器在自定义检索算法方面提供了灵活性,范围从简单的语义搜索到增强性能的高级方法。

Caching Embeddings

LangChain 的缓存嵌入(Caching Embeddings)功能允许将嵌入存储或临时缓存,从而减少重新计算的需要,提高整体性能

Integration with Hugging Face

Hugging Face 是一个领先的基于变换器模型的平台,提供包括 RAG 中使用的预训练模型。这使得 LangChain 可以无缝集成 Hugging Face 的模型,帮助您对其进行微调和适应,以满足特定任务的需求。

总结

检索增强生成(RAG)模型代表了大型语言模型领域的一项突破性进展。

LangChain 和类似的框架使得实现 RAG 及其他增强技术变得更加容易,从而能够快速开发利用大型语言模型(LLMs)全部潜力的应用程序。

这些技术之间的协同作用为知识密集型语言任务领域的创新开辟了令人兴奋的可能性。

Last modification:January 21st, 2025 at 03:54 pm