论文地址:Clustered Retrieved Augmented Generation (CRAG) (arxiv.org)
摘要
在现实世界的应用中,为大型语言模型(LLMs)提供外部知识是其有效应用的关键,原因包括:实时引入最新内容、访问特定领域知识,以及减少幻觉现象的发生。为此,基于向量数据库的检索增强生成(RAG)方法已被广泛采用。这种方法可以将任何外部知识片段检索出来,作为输入上下文提供给LLM。
尽管RAG方法取得了成功,但在某些应用中仍可能不可行,因为检索到的上下文长度可能超过LLM支持的上下文窗口大小。即便上下文可以容纳在窗口内,其Token数量可能非常大,从而导致成本上升和处理时间延长,在大多数应用中变得不切实际。
为了解决这些问题,我们提出了一种新方法——CRAG。该方法能够在不降低生成回答质量的前提下,有效减少提示中的Token数量,与传统RAG方法相比更加高效。
通过实验表明,与RAG相比,CRAG在多数情况下至少可减少46%的Token使用量,在某些场景下甚至能减少超过90%。此外,当分析的评论数量增加时,CRAG所使用的Token数量并不会显著增加,而RAG在评论数量从4条增加到75条时,Token数量几乎增长了9倍。
1 引言
基于向量数据库的检索增强生成(RAG)方法最早由 Lewis 等人于 2020 年提出,已被广泛应用于结合大型语言模型(LLM)构建的问答系统(QA)中(如 Anand 等,2023;Wang 等,2023;Mansurova 等,2023)。在这类系统中,我们可以将与某一主题相关的所有内容索引进一个知识库(即向量数据库)。当用户提出问题时,RAG方法会从该知识库中检索出相关知识,并将其提供给LLM用于生成回答。
通过这种方式,将RAG与LLM结合,可以绕过上下文窗口大小的限制,并且有效降低使用LLM的成本,因为输入与输出Token的数量直接影响计算资源的消耗。此外,RAG还帮助解决LLM面临的其他关键限制,例如:引入来自外部源的最新内容,以及访问特定领域知识等问题。
除了问答系统之外,RAG与LLM的结合还可以支持许多其他应用场景,如:语义搜索、智能助手以及创意内容生成等。这类应用的共同特点是:将知识库中的部分内容分段提供给LLM,便足以生成期望的响应。然而,在某些应用中,LLM可能需要访问整个知识库才能生成回答,这将不可避免地超出上下文窗口的限制。
例如,假设一家大型零售公司希望更深入地了解客户对其产品的意见。为此,他们决定收集过去一年内所有产品的客户评论,这些评论都是以自然语言撰写的,总量达数十万条。随后,公司将所有评论存储在一个向量数据库中,并希望通过LLM就这些评论回答相关问题,从而提取有价值的洞察。然而,他们仍需解决如何将庞大的评论数据与LLM连接的问题,因为分析所有评论需要极大量的输入Token,使得RAG方法在这种场景下不可行。
为此,我们提出了一种新的方法——聚类式检索增强生成(CRAG),其处理流程如图1所示。与传统RAG流程不同,CRAG包含三个连续步骤:聚类(clustering)、摘要(summarization)和聚合(aggregation)。具体而言,CRAG首先将评论划分为 k个聚类(k 由用户设定),然后对每个聚类内容进行摘要,生成一段简短评论,提炼出代表整个聚类的关键信息。最后,所有摘要被合并成一段统一文本,形成由CRAG生成的知识内容。
我们的实验表明,在不降低回答质量的前提下,CRAG相较于RAG能够至少减少46%的Token数量,在某些情况下甚至可以减少超过90%。这一效果对所使用的LLM类型没有依赖。
通过这种方式,CRAG不仅降低了成本,还能适应LLM的上下文窗口限制,同时减少模型生成回答的延迟,是一种高效、实用的外部知识接入解决方案。
2 方法
2.1 数据集
以前文提到的大型零售公司为例,我们在 Kaggle 平台上找到一个与亚马逊手机产品评论相关的公开数据集。该数据集共包含 413,841 条记录,每条记录包括以下字段:产品名称、品牌名称、价格、评分(范围为 1 到 5)、评论内容以及评论投票数(表示有多少用户对该评论进行了投票)。
在本研究中,我们仅使用产品名称及其对应的评论内容。所有信息均为英文。总共有 4,410 个不同的产品,评论总数为 41.4 万条,平均每个产品大约有 94 条评论。评论数量最多的产品共有 1,451 条评论,如果全部输入 GPT-4,约需 35,787 个 Token。部分评论内容非常简短、泛泛而谈(例如:“非常满意”),易造成评论重复。不过,整体上该数据集中仍有超过 162,000 条唯一评论。
2.2 向量表示(Embeddings)
获取评论数据后,下一步是将其转换为数值化表示(即向量表示 Embeddings),以便存储到向量数据库中。为此,我们采用了名为 paraphrase-multilingual-mpnet-base-v2 的句子Transformer模型(Reimers 和 Gurevych,2019a)。该模型是基于 MPNet 架构,在 50 种语言的同义句任务上预训练得到的版本。
MPNet 将 BERT(使用掩码语言建模,MLM) 和 XLNet(使用置换语言建模,PLM) 的优点结合在一起,从而弥补了各自的缺陷(Song 等,2020)。这种能力使该模型非常适合处理语义文本相似度任务(Reimers 和 Gurevych,2019b),因此也适用于对评论进行聚类分析。
通过该模型处理评论内容后,每条评论被映射为一个 768维的稠密向量,语义相似的评论将在向量空间中彼此靠近,从而可以通过向量距离来衡量它们之间的相似性。
2.3 聚类
在获得所有评论的向量表示之后,我们可以使用聚类算法对相同产品的相似评论进行分组。聚类可采用多种技术,其中最常见的方法之一是 K-means 聚类算法,因其操作简洁直观(Tan 等,2018)。
K-means 是一种无监督机器学习算法,在开始运行前需要设定聚类的数量 k 作为参数。之后会在多维空间中为每个聚类定义一个初始质心,该质心可随机选取或通过启发式方法确定(MacQueen,1967)。接着,每个对象将被分配到与其最相近的质心所属的聚类中。完成后,根据各聚类内点的平均距离,重新调整质心位置,并重复该过程,直到算法收敛(即数据点不再更换聚类)或达到设定的迭代次数上限(MacQueen,1967)。
为了确定合适的 k 值,我们采用了肘部法(Elbow Method),尝试 k 从 1 到 10 的不同取值,并计算惯性(Inertia)——即样本到其最近聚类中心的平方距离之和,用以评估聚类效果。通过对评论数据的经验性测试,我们最终选定了 k = 4。尽管 k = 5 或 k = 6 也表现良好,但我们仍倾向选择较小的候选值以简化处理。
2.4 总结与聚合
对于数据集中的每个产品,我们将其评论划分为 四个聚类,每个聚类中的评论在语义上相似。例如,在分析某些聚类时,我们发现几十条评论都在反复提到同一产品的相同内容,这为我们提供了显著的证据表明可以减少大量的 Token 使用。
为此,我们选用了 Mistral 7B(Jiang 等,2023)进行聚类内容的摘要。Mistral 7B 是一个开源的 70亿参数的大语言模型,在多个基准测试中表现出色,优于一些更大的模型如 LLaMA-13B。该模型基于 Transformer 架构,适用于多种自然语言处理任务,如文本生成、代码生成和数学推理等。
我们采用了 One-shot Prompting(一次示例提示)方式,即从数据集中选取一个实例,经过处理后作为目标输出样例,引导 Mistral 7B 生成摘要。我们尝试过 Zero-shot 提示,但效果不理想。在某些复杂任务中可能需要提供多个示例(即 Few-shot 提示),但在本研究中,仅一个示例就足够满足需求。
以下是用于 Mistral 7B 的 One-shot Prompting 示例:
[INST] 给定一系列评论,请创建一个简洁的摘要,准确传达整体情感和关键主题,不得直接引用原评论。重点提炼评论中的主要观点与情绪,清晰准确地反映评论的语气与内容。请勿引用评论原文。
评论内容:{{PRODUCT_REVIEWS}}
问题:{{ONESHOT_QUESTION}} [/INST]
回答:{{ONESHOT_ANSWER}}
其中 [INST]
与 [/INST]
是 Mistral 用于标识指令内容的特殊标记,{{PRODUCT_REVIEWS}}
表示某产品的评论集合,{{ONESHOT_QUESTION}}
与 {{ONESHOT_ANSWER}}
分别是提供给 Mistral 7B 参考的问题和示例答案。
通过该方式,我们为每个聚类生成了一个摘要,共获得 四个摘要,分别代表该产品评论的不同方面。我们将上述聚类和摘要流程应用于整个数据集的所有产品评论,从而有效过滤了冗余内容并融合了相似信息,显著减少了 Token 的数量。
最后,我们将每个产品的四个摘要合并为一段统一文本,作为 CRAG 所生成的知识内容。
2.5 问答机器人:基于知识的LLM问答
与 RAG 流程类似,在完成知识处理后,CRAG 也会将处理好的外部知识输入至大语言模型(LLM)中,用于辅助生成预期回答。
我们选用了三个当前最先进的 LLM 模型来构建三种不同版本的问答机器人(QA Chatbot):
-
GPT-4-0613(以下简称 GPT-4)
-
LLaMA2-70B
-
Mixtral 8x7B
用于生成回答的提示词如下:
你将获得一组消息内容的描述,同时也会收到一个问题。请基于这些描述内容,生成该问题的回答,限制在 300 字以内。如有可能,请附上例子支持你的观点。请使用项目符号格式回答。
相关描述:{{KNOWLEDGE}}
问题:{{USER_QUESTION}}
其中 {{KNOWLEDGE}}
表示由 CRAG 或 RAG 提供的知识内容,{{USER_QUESTION}}
是用户提出的问题。
借助这样的提示和结构,我们可以与问答机器人交互,获取基于客户评论的高质量解答和洞察,有效实现客户反馈分析与知识问答结合的目标。
3 实验
这些实验使用 Python 3.9 和 PyTorch 库实现,并借助两块 NVIDIA GeForce RTX 3090 显卡完成向量生成与摘要任务。
3.1 实验设置
3.1.1 数据集
如第 2.1 节所述,我们采用了关于用户在亚马逊购买手机的评论数据集。对于评论数量少于 4 条的产品,我们进行了筛除。因为在这种情况下,所有评论的 Token 总数不会超过大语言模型的上下文窗口限制,因此无需进行额外处理,可以直接将所有评论作为 Prompt 输入。
3.1.2 比较方案
我们将基于 CRAG 方法生成的答案与传统 RAG 流程生成的答案进行对比。为此,我们构建了一个 RAG 流程,使用 ElasticSearch 作为检索数据库。借助 ElasticSearch,我们能够高效地检索所需的相关信息。在 RAG 流程中,一个产品的所有评论都会被检索出来,并作为 Prompt 输入给问答机器人(QA Chatbot),这在某些情况下会导致 Token 数量非常庞大。
3.1.3 评估指标
为了比较 CRAG 与 RAG 的性能,我们统计了两种方法在问答任务中 Prompt 的 Token 数量,分别用于三种大语言模型(GPT-4、LLaMA2-70B 和 Mixtral8x7B)。由于这些模型使用的分词器不同,Token 数可能略有差异。因此我们记:
-
T-CRAG
表示使用 CRAG 方法时的最大 Token 数; -
T-RAG
表示使用 RAG 方法时的最大 Token 数。
通过比较 T-CRAG
与 T-RAG
,我们可以评估哪种方法在 Token 使用上更少,也意味着成本更低。
此外,我们引入 CiT
(Change in Tokens)来表示 Token 数的百分比变化:
-
若为负数,表示 CRAG 使用的 Token 更少;
-
若为正数,表示 RAG 更节省。
为了进一步评估两种方法在输出质量上的差异,我们比较了 CRAG 与 RAG 所生成回答的语义相似度,以判断尽管 Token 数不同,输出是否保持一致性。
为此,我们计算两种方法输出文本的 余弦相似度(Cosine Similarity,记作 CosSim),以评估不同大模型下两种方法生成答案之间的语义相似性。