RAG系统:通过重排序器提升LLM回答的准确性
大型语言模型(LLM)展现出令人印象深刻的文本生成能力,然而,它们“幻觉”(即生成虚假或未经证实的信息)的倾向仍然是一个重大挑战。为了解决这一问题,检索增强生成(RAG)架构被广泛采用。RAG使LLM能够利用外部的、经过验证的数据源,从而大幅提高生成响应的可靠性和相关性。本文将深入探讨RAG的运作原理,审视其关键组成部分,如嵌入、向量数据库、检索器,并特别关注重排序器在平衡搜索速度与信息准确性方面的关键作用。
RAG基础:从幻觉到事实
LLM幻觉问题源于模型在海量数据集上进行训练,这使得它们即使在缺乏特定主题知识的情况下,也能生成听起来合理 的文本。RAG系统通过为模型提供访问外部知识库中最新且相关信息的能力来解决这一问题。该过程涉及两个主要阶段:检索(Retrieval)和生成(Generation)。在检索阶段,系统从数据库中提取与用户查询最相关的文本片段,然后将其作为额外上下文传递给LLM,以生成响应。
为了有效利用外部数据,必须对其进行准备。长文档被分解成更小、更有意义的片段,即块(chunks)。这一点至关重要,因为LLM的上下文窗口(context window)有限,这意味着它们一次可以处理的最大文本量是有限的。为了保持相邻块之间的信息连贯性,采用了重叠(overlap)技术,即前一个片段的一小部分会包含在下一个片段的开头。这有助于模型在处理单个文本部分时更好地理解上下文。
向量数据库与嵌入:语义搜索
RAG系统的核心在于查找相关数据片段的机制。计算机无法直接理解词语的含义;它们通过数字进行操作。因此,文本被转换为称为嵌入(embeddings)或向量的数值表示。嵌入是一个多维向量(一串数字),它编码了单词、短语或整个文本片段的语义。含义相似的词语或短语在多维空间中将具有彼此靠近的向量。
创建嵌入的过程通过专门的嵌入模型(embedding models)进行,这些模型在海量文本语料库上进行训练。这些模型学习将词语及其上下文映射到独特的数值表示。例如,如果你获取“国王”、“男人”和“女人”的向量,那么“女王”的向量将非常接近“向量(国王) - 向量(男人) + 向量(女人)”的操作结果。这表明嵌入能够捕捉语言中复杂的语义和句法关系。
生成的嵌入存储在向量数据库(vector databases)中。这些数据库针对快速的最近邻搜索进行了优化。当用户提出问题时,他们的查询也会被转换为嵌入,然后向量数据库会找到其嵌入与查询嵌入最相似的文本片段。向量相似度通常使用余弦相似度等指标进行衡量。
以下是一个使用OpenAI API演示嵌入创建的Python代码示例:
# To run this example, you need to install the openai library and obtain an API key
from openai import OpenAI
import os
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
text = "A fluffy cat named Whiskers enjoys telling tales of ancient explorers."
response = client.embeddings.create(
model="text-embedding-3-small",
input=text,
dimensions=768 # explicitly set the dimensionality
)
vector = response.data[0].embedding
print(f"Vector dimensionality: {len(vector)}") # will output 768
print("First 20 numbers:", vector[:20])
print("... and so on up to the 768th number")
这段代码将一个文本短语转换为一个包含768个元素的数值向量,然后可以将其用于向量数据库中的搜索。
检索器与扩展:性能挑战
检索器(retriever)是RAG系统的一个组件,负责从向量数据库中提取一组初步相关的文档或片段。它使用用户查询的嵌入来查找存储块中最相似的嵌入。对于小型文档集合,检索器可以执行暴力搜索,将查询嵌入与所有存储的向量进行比较。然而,随着数据量增长(数十亿个片段),这种方法变得低效且过于缓慢。
为了解决扩展性问题,采用了各种近似最近邻(Approximate Nearest Neighbor, ANN)算法。这些算法创建特殊的索引,例如IVF(倒排文件索引)、HNSW(分层可导航小世界)或LSH(局部敏感哈希)。ANN索引通过牺牲少量精度来显著加快搜索速度。它们在更短的时间内找到并非完全精确但非常接近的邻居。因此,在召回率(recall)(完整性,即找到所有相关项的能力)和延迟(latency)(响应速度)之间出现了权衡。
尽管进行了速度优化,但检索器返回的结果并非总是理想的。检索器可能会提取出语义上与查询接近,但对于形成最终答案而言并非最相关或最精确的片段。这是因为用于搜索的嵌入通常是单向的(双编码器),这意味着查询和文档是独立编码的,然后比较它们的向量。虽然这种方法对于快速搜索是高效的,但它可能会错过细微的上下文连接。
通过重排序器提升准确性
为了克服检索器的局限性并提高RAG系统响应的准确性,重排序器(rerankers)被采用。重排序器是一个附加组件,它接收来自检索器的一小组(例如10-100个)潜在相关片段,并根据更深入的相关性评估重新排序它们。它充当过滤器,丢弃不太有用的结果,并将最重要的结果提升到顶部。
与检索器使用的嵌入模型不同,重排序器通常利用跨编码器(cross-encoders)。跨编码器将“查询-文档”对作为输入,并联合处理它们,评估它们之间的相互关联性。这使得它们能够捕捉查询和上下文之间比简单向量比较更复杂和细致的交互。尽管跨编码器比双编码器嵌入模型慢得多,但它们应用于已经过滤过的、较小的文档集,这使得它们的计算变得可行。
因此,重排序器有助于在速度和准确性之间取得最佳平衡。带有ANN索引的快速检索器迅速选择广泛的潜在相关块,然后一个较慢但更精确的重排序器重新评估这个有限的集合,确保LLM获得最高质量的上下文以生成响应。这种多阶段方法显著提高了RAG系统提供信息的质量和可靠性,最大限度地降低了幻觉的风险,并提升了整体用户满意度。
关键要点
- RAG系统使LLM能够利用外部数据生成准确可靠的答案,从而解决“幻觉”问题。
- 嵌入将文本转换为编码语义意义的数值向量,便于在向量数据库中进行相似性搜索。
- 检索器利用嵌入和ANN索引快速提取一组初步相关的片段,在速度和召回率之间取得平衡。
- 重排序器(通常基于跨编码器)重新评估检索器结果,过滤掉不太相关的片段,并提高LLM上下文的准确性。
- 快速检索器和精确重排序器的结合在RAG系统中实现了性能和质量之间的最佳平衡。
— Editorial Team
暂无评论。