You need to enable JavaScript to run this app.
导航
基于 RediSearch 构建 VSS 向量数据库检索解决方案
最近更新时间:2024.12.04 10:53:39首次发布时间:2024.06.17 10:23:41

本文介绍基于 RediSearch 构建 Redis VSS 向量数据库检索解决方案。

方案简介

基于 Redis Stack 的 RediSearch Module 开发的 Redis 向量数据库检索能力,具有低延迟、高并发、高性能、部署灵活的特点。技术思路基于索引构建和维护,在每一个向量的搜索操作中都会指定一个单一的索引,该操作只在索引内进行,即单个索引检索只在此索引内进行,不会受到其他索引检索操作的影响。这种方式保障了即使在海量数据高并发检索情况下,Redis VSS(Vector Similarity Search)向量检索也能够实现高效的数据搜索。

Redis VSS 向量数据库特点

  • 向量相似性搜索: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 向量查询

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 技术发展。

实现方案

准备工作

  • 已创建 ECS 实例。具体操作步骤,请参见购买并使用云服务器实例
  • 已在 ECS 服务器上安装 Python 3.x 版本。

    说明

    您可以通过 python --version 命令检查当前 Python 的版本。

  • 已创建缓存数据库 Redis 企业版实例,且创建实例时已选择加载 RedisJSON 和 RediSearch 模块。具体操作步骤,请参见创建实例

    说明

    • 若需要通过私网访问 Redis 企业版实例,需确保 ECS 实例与 Redis 实例属于同一 VPC 网络。
    • 若需要通过公网访问 Redis 企业版实例,需先为实例开启公网访问。开启公网访问的操作步骤,请参见开启公网访问
  • 已为 Redis 实例设置访问白名单。具体操作步骤,请参见创建白名单

操作步骤

  1. 登录已安装了 Python 的 ECS 实例。ECS 实例登录方法,请参见登录概述

  2. 在 ECS 的命令行窗口或命令终端工具中,创建一个 VSS 项目目录。

    说明

    本文示例中 VSS 项目目录名称为 vss,后续操作步骤都将在该目录下执行。

  3. 在 VSS 项目目录下,创建一个名为 bikes.json 的文件,并将 bikes.json 内的 demo 数据复制到 bikes.json 的文件中。

  4. 在 VSS 项目目录下,创建一个 python 脚本文件(本文示例中 python 脚本文件名为 vss.py),并在文件中添加如下代码。

    如下代码里 config 中的 hostportpassword 信息需要替换为您缓存数据库 Redis 企业版实例的真实信息,其中:

    • host:Redis 企业版实例的连接地址。
    • port:Redis 企业版实例的端口,默认为 6379。
    • password:Redis 企业版实例 default 账号的密码。

    说明

    • 您可以在 Redis 控制台上查看实例的连接地址域名和端口号。具体操作步骤,请参见查看连接地址
    • 若您忘记 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)
    
  5. 在 VSS 项目目录下,执行如下命令运行 python 脚本。

    python <python 脚本文件名>
    

    代码示例如下(本文示例中 python 脚本文件名为 vss.py)。

    python vss.py
    

    返回结果如下。
    截图返回