本文介绍基于 RediSearch 构建 Redis VSS 向量数据库检索解决方案。
基于 Redis Stack 的 RediSearch Module 开发的 Redis 向量数据库检索能力,具有低延迟、高并发、高性能、部署灵活的特点。技术思路基于索引构建和维护,在每一个向量的搜索操作中都会指定一个单一的索引,该操作只在索引内进行,即单个索引检索只在此索引内进行,不会受到其他索引检索操作的影响。这种方式保障了即使在海量数据高并发检索情况下,Redis VSS(Vector Similarity Search)向量检索也能够实现高效的数据搜索。
向量相似性搜索:VSS 是向量数据库中的关键功能,可以查找与给定查询向量相似的数据点,在推荐系统、图像和视频搜索等应用场景具有很大价值。
整合于 Redis Enterprise 平台的 RedisVL:RedisVL(Redis Vector Library) 向量工具库是面向生成式 AI(GenAI)应用开发提供的客户端辅助工具集合库,与具备实施向量检索、LLM 大模型缓存和聊天历史记录存储能力的 Redis 企业版数据库协作实现向量存、算、查、看一体化能力。该系统整合在了 Redis Enterprise 平台中,简化了客户端设计,更便于在 AI 驱动的任务中使用向量数据。关于 RedisVL 的更多信息,请参见 RedisVL。
高效查询:无论是向量搜索还是标量搜索,在 Redis 中都是以 key-value 的方式存储在内存中,因此查询效率非常高。
强大的混合查询功能:Redis 允许同时查询向量数据和其他类型的数据(如文本、数值或 GPS 等信息),这种原生的混合查询功能使得 Redis 在向量数据库领域具有显著优势。
Redis VSS 向量检索在既有 key-value 查询能力基础上,还支持在 FT.SEARCH 命令中使用向量相似性查询,包括 KNN 检索(KNN search)和范围查询(Range query )两种查询方法。其中:
KNN search
KNN (K-Nearest Neighbors)是一种基础算法,旨在找到与给定输入最相似的项目,KNN 算法根据所选的距离函数计算查询向量和数据库中每个向量之间的距离,并返回与查询向量距离最小的 K 个项目。Redis 的 KNN 检索支持如下两类查询语句:
*=>[<vector_similarity_query>]
:用于在整个向量字段上运行查询。<primary_filter_query>=>[<vector_similarity_query>]
:用于在主过滤器查询的结果上运行相似性查询。上述语句中的 <vector_similarity_query>
为向量查询语法,需符合如下格式。
KNN (<number> | $<number_attribute>) @<vector_field> $<blob_attribute> [<vector_query_param_name> <value>|$<value_attribute>] [...]] [ AS <dist_field_name> | $<dist_field_name_attribute>]
更多关于 KNN 查询语法的详细说明,请参见 KNN search。
Range query
范围查询是一种根据向量字段值与查询向量之间的距离,按照相关向量字段距离度量来过滤查询结果的方法。范围查询可以作为 KNN search 语法中 <primary_filter_query>
的一部分。
范围查询支持如下查询语法。
@<vector_field>: [VECTOR_RANGE (<radius> | $<radius_attribute>) $<blob_attribute>]
更多关于 范围查询语法的详细说明,请参见 Range query。
图像和视频搜索:将图像、视频等转化为向量形式存储在 Redis 中,可以通过 VSS 迅速找出与目标图像或视频相似的内容,广泛应用于广告匹配、版权检测、相似内容推荐等。
内容安全风控:在搜索引擎场景下,将新添加到数据库的内容作为查询对象,可以用于内容发布、上架前的内容安全风险控制。
大型语言模型(LLM)缓存场景:Redis 向量数据库可以用于大型语言模型的缓存,提高模型查询速度,方便大数据处理。
聊天历史记录:用于实时记录和检索用户聊天历史,以便进行内容监控、聊天机器人自动回复等操作。
其他复杂的向量搜索场景:借助 Redis 向量数据库的高性能向量检索能力,Redis 还可应用于更多的复杂向量搜索场景中,包括但不限于声音分析、行为检测、视频分析等。
推荐系统:可以利用 VSS 的数据相似程度进行智能推荐,如商品推荐、音乐推荐等,从而提高用户体验并促进销售。
自然语言处理:VSS 可以有效地处理和分析大量文本数据,帮助企业从中获取有价值的信息,如舆情分析、评论分析等。
收入来源:精心设计的基于人工智能的应用程序可以利用 Redis 快速筛选庞大的数据集,产生新的见解并最终推动产生新的收入来源,为企业创造真正的价值。
AI 技术的推动:Redis 能够提供持续、可伸缩的服务,为 AI 提供独立的、可扩展的存储和计算平台,推进 AI 技术发展。
说明
您可以通过 python --version
命令检查当前 Python 的版本。
说明
登录已安装了 Python 的 ECS 实例。ECS 实例登录方法,请参见登录概述。
在 ECS 的命令行窗口或命令终端工具中,创建一个 VSS 项目目录。
说明
本文示例中 VSS 项目目录名称为 vss
,后续操作步骤都将在该目录下执行。
在 VSS 项目目录下,创建一个名为 bikes.json
的文件,并将 bikes.json 内的 demo 数据复制到 bikes.json
的文件中。
在 VSS 项目目录下,创建一个 python 脚本文件(本文示例中 python 脚本文件名为 vss.py
),并在文件中添加如下代码。
如下代码里 config 中的 host
、port
和 password
信息需要替换为您缓存数据库 Redis 企业版实例的真实信息,其中:
host
:Redis 企业版实例的连接地址。port
:Redis 企业版实例的端口,默认为 6379。password
:Redis 企业版实例 default 账号的密码。说明
import json import time import numpy as np import pandas as pd import redis import requests import os from redis.commands.search.field import ( NumericField, TagField, TextField, VectorField, ) from redis.commands.search.indexDefinition import IndexDefinition, IndexType from redis.commands.search.query import Query from sentence_transformers import SentenceTransformer from pprint import pprint # from transformers import T5Model os.environ["TRANSFORMERS_OFFLINE"] = "1" os.environ["HF_DATASETS_OFFLINE"] = "1" with open('bikes.json','r',encoding='utf8')as fp: bikes = json.load(fp) json.dumps(bikes[0], indent=2) # 创建 Redis 企业版数据库连接 config = { "host": "<Redis 企业版实例的连接地址>", "port": "<Redis 企业版实例的端口,默认为 6379>", "password": "<Redis 企业版实例 default 账号的密码>" } client = redis.StrictRedis(**config) res = client.ping() pprint(res) # 创建 pipeline,并指定 Json 字段查询 pipeline = client.pipeline(transaction=False) for i, bike in enumerate(bikes, start=1): redis_key = f"bikes:{i:03}" pipeline.json().set(redis_key, "$", bike) res = pipeline.execute() # 将查询结果进行排序 keys = sorted(list(client.scan_iter('bikes*'))) pprint(keys)
在 VSS 项目目录下,执行如下命令运行 python 脚本。
python <python 脚本文件名>
代码示例如下(本文示例中 python 脚本文件名为 vss.py
)。
python vss.py
返回结果如下。