结合稀疏和密集向量,以利用 Amazon OpenSearch Service 增强 RAG 中的知

融合稀疏与密集向量以增强 RAG 知识检索

作者: Yuanbo Li River Xie Ren Guo 和 Charlie Yang日期: 2024年9月5日发表于: Amazon OpenSearch Service、Amazon SageMaker、最佳实践和 技术手册阅读原文

主要收获

在检索增强生成RAG中,知识检索的有效性对大型语言模型LLM的表现至关重要。传统的密集向量检索方法效率低于专业领域的术语理解。融合稀疏与密集向量的检索方法提供了更佳的术语扩展及可解释性。使用 Amazon OpenSearch Service 的实验结果显示,结合稀疏与密集向量的技术显著提升检索效果。

在检索增强生成RAG的背景下,知识检索扮演著至关重要的角色,因为检索的有效性直接影响大型语言模型LLM的生成潜力。目前,RAG 检索中最常用的方法是基于密集向量的语义搜索。然而,密集嵌入在理解专业术语或特定领域的行话时表现不佳。

为了解决这一问题,我们提出了一种新的方法:稀疏向量检索。这种方法不仅提高了术语扩展效果,同时保持了该方法的可解释性。我们接下来将介绍如何使用 Amazon OpenSearch Service 整合稀疏和密集向量以强化知识检索。完整的代码可以在 GitHub 上找到:awssamples/opensearchdensespaseretrieval。

什么是稀疏向量检索

稀疏向量检索是一种基于倒排索引的召回方法,并增加了术语扩展的步骤。它有两种模式:仅文档模式和双编码器模式。简而言之,在仅文档模式中,术语扩展仅在文档摄取时执行,而在双编码器模式中,术语扩展在摄取及查询时均会进行。双编码器模式提高了性能,但可能会导致更高的延迟。

以下是其有效性的一个示例:

在 OpenSearch 中,神经稀疏搜索较传统方法能提升 NDCG@10,数据达 127仅文档至 20双编码器。使用神经稀疏搜索,您无需自行配置字典,而是能自动扩展用户术语。此外,稀疏向量检索在小型专用数据集中的计算结果可显著减少BM25计分的偏差,提供更可靠的分数。

尽管稀疏模型的绝对指标无法超越最好的密集模型,但它具有独特优势。例如,在某些数据集上的 NDCG@10 评估显示其性能有时可超过最先进的密集向量模型,如DBPedia数据集,显示两者间有一定的互补性。

如何结合密集与稀疏向量?

1 部署密集向量模型

为了获得更有价值的测试结果,我们选择了 Cohereembedmultilingualv30 模型。可通过 Amazon Bedrock 访问它。接下来,我们将创建一个连接器并将其注册为 OpenSearch 中的模型。

pythondef createbedrockcohereconnector(accountid aosendpoint inputtype=searchdocument) # inputtype 可以是 searchdocument 或 searchquery service = es session = boto3Session() credentials = sessiongetcredentials() region = sessionregionname awsauth = AWS4Auth(credentialsaccesskey credentialssecretkey region service sessiontoken=credentialstoken)

path = /plugins/ml/connectors/createurl = https//  aosendpoint  pathrolename = OpenSearchAndBedrockRolerolearn = arnawsiam{}role/{}format(accountid rolename)modelname = cohereembedmultilingualv3bedrockurl = https//bedrockruntime{}amazonawscom/model/{}/invokeformat(region modelname)payload = {}  # 将实际payload内容替换进来headers = {ContentType application/json}r = requestspost(url auth=awsauth json=payload headers=headers)return jsonloads(rtext)[connectorid]

2 部署稀疏向量模型

目前,您无法直接在 OpenSearch 中部署稀疏向量模型,需先在 Amazon SageMaker 中部署,然后通过 OpenSearch 服务模型连接器进行整合。具体步骤如下:

结合稀疏和密集向量,以利用 Amazon OpenSearch Service 增强 RAG 中的知在 OpenSearch 控制台中,选择集成选项。根据提示配置 VPC 或公共域。输入必要的参数,获取稀疏模型 ID。

3 设置数据摄取及查询管道

使用以下代码创建摄取和查询管道。这些管道无需进行模型推理,只需进行文本字段的摄取。

jsonPUT /ingest/pipeline/neuralsparsepipeline{ description 神经稀疏编码管道 processors [ { sparseencoding { modelid fieldmap { content sparseembedding } } } { textembedding { modelid fieldmap { doc denseembedding } } } ]}

PUT /search/pipeline/hybirdsearchpipeline{ description 混合查询后处理器 }

4 创建带有密集和稀疏向量的 OpenSearch 索引

使用以下代码创建一个支持密集和稀疏向量的 OpenSearch 索引:

jsonPUT {indexname}{ settings { index { numberofshards 1 numberofreplicas 0 knn true } defaultpipeline neuralsparsepipeline } mappings { properties { content { type text } denseembedding { type knnvector } sparseembedding { type rankfeatures } } }}

测试方法论

1 实验数据选择

我们使用 BeIR 数据集进行检索评估,但并非所有 BeIR 数据集适合 RAG。为了模拟知识检索场景,我们选择了 BeIR/fiqa 和 squadv2 数据集。

2 数据摄取测试

以下脚本将数据摄取到 OpenSearch 服务域:

pythonimport jsonfrom setupmodelandpipeline import getaosclientfrom beirdatasetsdataloader import GenericDataLoaderfrom beir import LoggingHandler util

aosclient = getaosclient(aosendpoint)def ingestdataset(corpus aosclient indexname bulksize=50)

3 检索性能评估

在 RAG 知识检索中,我们通常关注顶部结果的相关性,因而使用 recall@4 作为评估指标,涵盖多种检索方法进行比较。

结果

在 RAG 的场景中,发展者通常不会过多关注 NDCG@10 指标,而是更注重于召回率。根据我们的经验,测量 recall@1、recall@4 和 recall@10 供参考。

测试结果显示如下表所示。

数据集BeIR/fiqasquadv2方法/指标Recall@1Recall@4bm2501120215dense01560316sparse01960334hybriddensesparse02030362hybriddensebm2501560316

结语

在 OpenSearch 服务版本 211 中,新推出的神经稀疏搜索功能可显著提升 RAG 场景下的知识检索有效性。相较于密集向量与 bm25 的组合,融合使用更加直观且更可能达成更好的结果。

随著技术的进步,神经稀疏搜索可能成为提升检索性能的流行且通用的解决方案。

蜜蜂加速器软件优势

关于作者

YuanBo Li 是 Amazon Web Services 的专家解决方案架构师,专注于 GenAI 和 AIML。他的研究兴趣涵盖 RAG 和 Agent 技术,致力于提出创新的技术解决方案以满足各种商业需求。

Charlie Yang 是 AWS 的工程经理,专注于 OpenSearch 专案,工作内容涉及机器学习、搜寻相关性和性能最佳化。

River Xie 是 Amazon Web Services 的 Gen AI 专家解决方案架构师,对 Agent/多智能体工作流以及大型语言模型推理优化等领域充满热情。

Ren Guo 是 AWS 大中国区生成式 AI 专家解决方案架构团队经理,专注于 AIML 和数据领域。

给我们留言