蘑菇加速器苹果版
  • 3

通过 Amazon MemoryDB 为实时向量搜索功能加持 数据库博客

利用 Amazon MemoryDB 实现实时向量搜索功能

作者:Sanjit Misra CJ Chittajallu 和 Lakshmi Peri 日期:2024年8月7日 栏目:进阶 (300), Amazon MemoryDB, 生成 AI, 技术如何做永久链接评论 分享

关键点

在当今迅速发展的生成 AI 领域,各行各业的企业通过实时搜索改变了客户体验。利用不受结构限制的数据如文本、图像和视频,组织能够重新定义参与和个性化的标准。向量搜索是这项转型的重要组成部分,能够即时提供上下文相关的结果,极大提高用户体验和操作效率。通过 MemoryDB 的实时向量搜索,客户可以在单一毫秒内更新和搜索向量数据库,确保推荐引擎使用最新数据,从而提升用户体验。

在这篇文章中,我们将探讨如何在电子商务用例中使用 MemoryDB 进行向量搜索,并创建一个实时语义搜索引擎。

MemoryDB 的向量搜索

向量是数据及其含义的数值表示,通过机器学习ML生成,用于捕获复杂关系,适用于信息检索、图像识别等应用。向量搜索通过距离度量查找相似数据点,但最近邻查询可能计算密集。近似最近邻ANN算法通过查询向量子集来平衡准确性和速度。

内存数据库如 MemoryDB允许将向量存储在内存中以及索引,这显著降低与索引创建和更新相关的延迟。当新数据被添加或现有数据被更新时,MemoryDB 可以在单个毫秒内更新搜索索引,使后续查询能够在近实时中访问最新结果。MemoryDB 每秒处理数以万计的向量查询,提供高吞吐量应用所需的性能。

在 MemoryDB 中,你可以选择以下两种索引算法:

算法描述Flat线性处理每个向量的暴力算法,虽然结果准确但对于大型索引运行时间较长。HNSW近似算法,执行时间较短,平衡内存、CPU 使用和召回质量。

执行 MemoryDB 搜索时,你将使用 FTSEARCH 和 FTAGGREGATE 指令,这些命令依赖于查询表达式,该表达式由一个或多个操作符组成。通过布尔组合如 AND、OR 和 NOT和括号,你可以增强或限制结果集,确保高效和有效地提取所需数据。

MemoryDB 的混合过滤

MemoryDB 支持混合过滤,允许在进行向量搜索之前或之后过滤向量。混合过滤提供以下优势:

缩小搜索空间:通过基于数值或标签过滤在进行更耗时的语义搜索之前,消除无关文档或数据点,从而提高效率,称为预过滤。提升相关性:通过基于元数据、用户偏好或其他标准的过滤,预过滤确保只有最相关的文档被纳入语义搜索,提高结果的准确性。结合结构化与非结构化数据:混合过滤可以将存储为与向量关联的元数据的结构化数据过滤如标签、类别或用户属性与语义搜索的非结构化数据处理能力结合。

混合查询将向量搜索与数值和标签过滤等过滤能力相结合,简化了应用代码。

解决方案概述:使用 MemoryDB 进行语义搜索

向量搜索使用户可以找到语义上或概念上相似的文本。它能区分“汽车”和“车辆”等概念相关但语言上不同的词汇。这是因为向量搜索使用无结构、半结构和结构化内容的数值表示来索引和执行查询。这种技术也可以广泛应用于视觉搜索,使用些许变化来检测相似,例如一条有黄色点的白色裙子与一条有黄色方形的白色裙子进行比较。

作为一个实例,当用户在亚马逊上购买耳机时,传统数据库查询可以提供产品的基本特性,如产品标题、描述和其他特征。然而,当用户对耳机有问题时,使用向量搜索,你可能想搜索过去的语义相似问题,以提供相关答案。

在本文中,我们加载了AmazonPQA 数据集提供亚马逊产品问题及其答案,以及公开的产品信息进行搜索,并执行搜索以识别用户的问题是否曾经被提问过,并检索相应产品数据。

要为此数据生成向量嵌入,可以使用机器学习服务,如Amazon SageMaker或Amazon Bedrock。SageMaker 允许你轻松训练和部署机器学习模型,包括生成文本数据向量的模型,而 Amazon Bedrock 则提供构建和扩展生成 AI 应用的便捷方式。

以下部分将提供逐步演示,执行向量搜索和使用示例数据集的工作流程步骤如下:

创建 MemoryDB 集群加载示例产品数据集。使用句子变换器生成向量,并使用 MemoryDB 存储原始文本问题和答案及其向量表示。使用变换器将查询文本编码为向量。使用 MemoryDB 执行向量搜索。

前提条件

在此操作指导中,你需要拥有 AWS 账户 和适当的 AWS 身份与访问管理IAM权限,以启动解决方案。

创建 MemoryDB 集群

按照以下步骤创建支持向量搜索的 MemoryDB 集群:

在 MemoryDB 控制台中,选择导航窗格中的 Clusters。选择 Create cluster。在 Name 中输入集群名。选择 Enable vector search。

通过AWS 命令行接口AWS CLI创建 MemoryDB 集群的代码如下:

bashaws amazon memoryDB createcluster clustername ltvaluegt nodetype ltvaluegt engine redis engineversion 71 numshards 1 aclname ltvaluegt subnetgroupname ltvaluegt securitygroupids ltvaluegt parametergroupname defaultmemorydbredis7search region ltvaluegt endpointurl ltvaluegt

集群成功配置后,你可以开始在数据库中存储向量并根据需要进行搜索。有关更多详细信息,请参考Amazon MemoryDB 开发者指南。我们使用 Redispy 客户端库测试与提供的 MemoryDB 集群的连接,以下示例显示此过程:

pythonrc = Redis(host=clustercfgmemorydamazonawscom port=6379 decoderesponses=True ssl=True sslcertreqs=none)

rcping()

加载示例数据集

以下代码演示如何从注册表中检索 JSON 数据并加载到数据框中:

pythonimport jsonimport pandas as pd

def loadpqa(filename numberrows=1000) df = pdDataFrame(columns=(question answer)) with open(filename) as f i = 0 for line in f data = jsonloads(line) dfloc[i] = [data[questiontext] data[answers][0][answertext]] i = 1 if i == numberrows break return df

qalist = loadpqa(amazonpqa/amazonpqaheadsetsjson numberrows=1000)

在本文中,我们加载数据集的前1000行。

生成向量并使用 MemoryDB 作为向量存储

我们将问题、答案和从这个数据集中生成的向量作为哈希存储到 MemoryDB 中。MemoryDB 也支持 JSON 数据结构。

我们使用Hugging Face 的嵌入模型alldistilrobertav1生成产品 QA 数据的向量。以下代码示例展示了如何在应用程序中实现此过程:

pythonfrom sentencetransformers import SentenceTransformermodel = SentenceTransformer(sentencetransformers/alldistilrobertav1)itemkeywords = [productmetadata[i][question] for i in productmetadatakeys()]itemkeywordsvectors = [modelencode(sentence) for sentence in itemkeywords]

在 MemoryDB 中存储每个向量元数据时,哈希数据结构对简单的元数据需求效率较高。然而,如果你的元数据较复杂或差异较大,JSON 可能是更好的选择。以下代码块演示如何创建向量嵌入并将其作为哈希存储在 MemoryDB 中:

pythondef loadvectors(client qalist vectordict vectorfieldname) for index in productmetadatakeys() # 哈希键 key = product str(index)

    # 哈希值    itemmetadata = productmetadata[index]    itemkeywordsvector = vectordict[index]astype(npfloat32)tobytes()    itemmetadata[vectorfieldname] = itemkeywordsvector    # HSET    clienthset(key mapping=itemmetadata)

下一步是为数据集创建索引,使其能够执行向量搜索。每个向量搜索操作指定一个索引,其操作仅限于该索引一个索引上的操作不受其他索引操作的影响。在 cluster 层面,多个索引的多个操作可以同时进行。

个别索引是以唯一命名空间存在的对象,与其他 Redis 命名空间如键和函数分开。

在此示例中,我们创建索引并将数据作为哈希加载到 MemoryDB:

bashFTCREATE idxpqa SCHEMA question TEXT answer TEXT questionvector VECTOR HNSW 10 TYPE FLOAT32 DIM 768 DISTANCEMETRIC COSINE INITIALCAP 1000 M 16

让我们分解一下这个命令的作用:

CREATE idxpqa FTCREATE 是 MemoryDB 中用于创建新搜索索引的命令,初始化一个名为 idx 的新索引。SCHEMA 模式定义索引中的字段定义列表。每个定义本质上是一个键值对,其中键是字段名称,后面跟着该字段的允许值。我们使用以下参数:question TEXT answer TEXT 定义索引中的两个附加文本字段,分别命名为 question 和 answer。questionvector 是存储向量数据的字段名。VECTOR 指定索引将存储向量数据。HNSW Hierarchical Navigable Small World是一种用于高效向量搜索的算法。TYPE FLOAT32 指定每个维度的向量数据类型。DIM 768 表示向量的维度数量,768 是维度数量,需与嵌入模型生成的向量维度一致。DISTANCEMETRIC COSINE 设置比较向量的距离度量。在 MemoryDB 中,你还可以选择使用欧几里得或内积点积度量。INITIALCAP 1000 当指定时,该参数为索引预分配内存,从而减少内存管理开销并提高向量吞吐率。当未指定时,该参数默认为1024。M 定义每层中每个节点最大传出边的数量。较高的 M 值可以提高召回率,但可能会降低整体查询性能。在零层时,最大传出边数量为 2M,默认值为 16,最大可达 512。

现在你已经在 MemoryDB 中创建了索引和数据,可以执行搜索。查询是一个两步骤过程。首先,你必须将查询转换为一个向量,然后执行相似性搜索以找到最相关的答案。

Streamlit 是一个开源 Python 框架,用于构建交互式 Web 应用。对于本用例,我们在 Streamlit 中构建用户界面,以允许用户提出耳机数据的问题,并查看相关的产品 ID 和问题答案:

pythonuserquery = Does this work with xboxqueryvector = modelencode(productquery)astype(npfloat32)tobytes()

通过 Amazon MemoryDB 为实时向量搜索功能加持 数据库博客

在 MemoryDB 中运行向量搜索

现在,你可以通过比较用户问题的向量表示,找到最相似的问题和答案。由于我们使用 HNSW,我们的搜索结果将是近似值,可能与准确的最近邻搜索结果不同。在此示例中,我们选择 k=5,查找五个最相似的问题:

连接日本的加速器

pythonq = Query(f=gt[KNN {topK} @{questionvector} vecparam AS vectorscore])paging(0 topK)returnfields(question answer)paramsdict = {vecparam queryvector}

执行查询

results = clientdevft(idxvss)search(q queryparams=paramsdict)

返回的结果是与查询向量相似度最高的 topK 文档由 vectorscore 表示,连同它们各自的 question 和 answer 字段。以下屏幕截图展示了一个示例:

清理

完成工作坊后,你需要删除在你的 AWS 账户中创建的资源,以停止产生费用。本节介绍如何删除这些资源的步骤。

删除 为测试配置的 MemoryDB 集群。移除所有用于测试的应用程序。

结论

MemoryDB 提供了在 AWS 上最快速的向量搜索性能,并在流行的向量数据库中具有最高的召回率,使其成为生成 AI 应用的优秀选择。MemoryDB 赋能企业通过高效、相关性强的向量搜索,转变其运营,支持实时搜索应用和强大的推荐引擎。这一能力为创新打开了新的可能性,帮助组织提升用户体验,实现实时反应,这对聊天机器人、实时推荐引擎和异常检测等应用至关重要。

欲了解有关 MemoryDB 向量搜索的更多信息,请参考向量搜索。要开始使用,请访问我们的GitHub 仓库,以找到本文中的代码以及与LangChain的额外示例。

MemoryDB 的向量搜索在所有提供 MemoryDB 的 AWS 区域均可用,且不收取额外费用。要开始,请使用 MemoryDB 版本 71 创建新的 MemoryDB 集群,并通过 MemoryDB 控制台或 AWS CLI 启用向量搜索。

关于作者

Sanjit Misra是亚马逊 ElastiCache 和 Amazon MemoryDB 团队的高级技术产品经理,工作地点位于华盛顿州西雅图。在过去的15年里,他一直从事与数据、分析和 AI/ML 相关的产品和工程岗位。他拥有杜克大学的 MBA 学位和北卡罗来纳大学教堂山分校的学士学位。

![](https//d2908q01vomqb2cloudfrontnet/887309d048beef83ad3