【论文阅读】CLUSTERED RETRIEVED AUGMENTED GENERATION (CRAG)

论文地址: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 = 5k = 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-CRAGT-RAG,我们可以评估哪种方法在 Token 使用上更少,也意味着成本更低。

此外,我们引入 CiT(Change in Tokens)来表示 Token 数的百分比变化:

  • 若为负数,表示 CRAG 使用的 Token 更少;

  • 若为正数,表示 RAG 更节省。

为了进一步评估两种方法在输出质量上的差异,我们比较了 CRAG 与 RAG 所生成回答的语义相似度,以判断尽管 Token 数不同,输出是否保持一致性。

为此,我们计算两种方法输出文本的 余弦相似度(Cosine Similarity,记作 CosSim),以评估不同大模型下两种方法生成答案之间的语义相似性。


<think>好的,我现在需要处理用户关于Clustered Non-Maximum Suppression(Clustered NMS)的查询。首先,我得确保自己正确理解这个概念,然后按照用户的要求结构化回答,并生成相关问题。 首先,Clustered NMS是计算机视觉中用于目标检测的后处理技术,目的是消除冗余的检测框。传统的NMS是逐个处理重叠框,而Clustered NMS可能涉及将检测框分组处理,以解决密集或重叠物体的问题。我需要确认这一点是否正确,可能需要查阅相关资料或论文。 接下来,用户要求回答结构清晰,分步解决问题。因此,我需要将Clustered NMS的实现步骤分解,例如聚类方法、组内抑制、参数调整等。同时,要确保使用正确的中文术语,并遵循LaTeX格式,比如数学表达式用$...$,独立公式用$$...$$。 然后,用户提到需要生成相关问题,我需要思考与Clustered NMS相关的扩展问题,比如与传统NMS的区别、优化方法、应用场景等。这些问题应该能帮助用户更深入理解该主题。 关于引用部分,用户提供的引用似乎与图像处理、特征匹配相关,可能与Clustered NMS的应用场景如目标检测或图像分割有关。但需要确保引用的正确性,可能需要调整引用标识的位置,使其自然融入回答中。例如,在提到密集物体检测时引用相关文献。 此外,用户提供的示例回答中包含了Python代码,因此可能需要在Clustered NMS的实现部分提供伪代码或代码片段,但需要确保代码正确且符合用户要求的格式(如使用代码块)。 还需要注意,用户提到系统级指令中要求所有行内数学表达式使用$...$,例如IoU的计算公式应该写成$IoU = \frac{Area(B_i \cap B_j)}{Area(B_i \cup B_j)}$。同时,独立公式如聚类公式需要用$$...$$。 现在需要检查是否有遗漏的步骤,比如Clustered NMS的具体算法流程,是否需要详细说明聚类的方法(如基于距离、IoU阈值等),以及如何在不同组内应用NMS。此外,可能需要比较Clustered NMS与其他变体如Soft-NMS、Matrix-NMS等的区别。 最后,确保回答符合用户的所有要求:中文回答、LaTeX格式正确、生成相关问题,并在适当位置添加引用标识。同时,保持回答结构清晰,逐步解释概念、实现步骤、代码示例、优缺点和应用场景。</think>### Clustered Non-Maximum Suppression(Clustered NMS)解释与实现 #### 概念说明 Clustered NMS 是目标检测中用于优化边界框筛选的后处理算法,特别适用于**密集物体检测场景**。传统NMS逐个抑制重叠框,可能导致漏检;而Clustered NMS先将检测框聚类成组,再在组内独立抑制,保留更多有效检测结果[^1]。 #### 实现步骤 1. **框聚类** 根据边界框的**空间位置或类别相似性**进行聚类,常用方法: - **距离阈值**:框中心距离小于阈值时归为一组 - **IoU聚类**:满足$$IoU(B_i,B_j) > \theta_{cluster}$$时合并 - **特征嵌入**:利用神经网络生成的特征向量聚类 2. **组内NMS** 对每个聚类组独立执行传统NMS,保留组内最高分框: ```python def clustered_nms(boxes, scores, cluster_thresh=0.5, nms_thresh=0.6): clusters = [] # 1. 聚类过程(示例:基于IoU的简单实现) for box in boxes: matched = False for cluster in clusters: if any(iou(box, c_box) > cluster_thresh for c_box in cluster): cluster.append(box) matched = True break if not matched: clusters.append([box]) # 2. 组内NMS keep = [] for cluster in clusters: cluster_boxes = np.array(cluster) indices = nms(cluster_boxes, nms_thresh) # 调用传统NMS函数 keep.extend(cluster_boxes[indices]) return keep ``` 3. **参数优化** 关键参数包括聚类阈值($\theta_{cluster}$)和组内NMS阈值($\theta_{nms}$),需通过验证集调优。 #### 优缺点分析 | 优势 | 局限性 | |------|--------| | 提升密集小物体检测率 | 计算复杂度高于传统NMS | | 保留同类多实例 | 依赖聚类算法效果 | | 兼容多数检测模型 | 需额外调参 | #### 应用场景 1. 人群检测(如RetailStore场景) 2. 遥感图像多目标识别 3. 文本检测(密集文字区域)[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值