向量搜索

基于向量嵌入查询数据

本文为你提供了如何使用 Redis Stack 执行向量搜索查询的概述。有关 Redis 作为向量数据库的更多信息,请查看Redis 作为向量数据库快速入门指南。你还可以在向量参考文档中找到有关所有参数的更详细信息。

在向量字段上的向量搜索查询允许你查找向量空间中与给定向量相近的所有向量。你可以查询最近邻或在给定半径内的向量。

本文中的示例使用以下模式:

JSON 字段 字段别名 字段类型 描述
$.description description TEXT 自行车的描述,作为非结构化文本
$.description_embeddings vector VECTOR 机器学习模型从描述文本中推导出的向量

最近邻 (KNN)

Redis 命令 FT.SEARCH 以索引名、查询字符串和附加查询参数为参数。你需要传递最近邻的数量、向量字段名和向量的二进制表示,方式如下:

  1. FT.SEARCH index "(*)=>[KNN num_neighbours @field $vector]" PARAMS 2 vector "binary_data" DIALECT 2

以下是该查询的详细说明:

  1. 预过滤:圆括号中的第一个表达式是一个过滤器。它允许你在执行向量搜索之前决定哪些向量应该被考虑。表达式 (*) 意味着所有向量都被考虑。
  2. 下一步=> 箭头表示预过滤发生在向量搜索之前。
  3. KNN 查询:表达式 [KNN num_neighbours @field $vector] 是一个参数化的查询表达式。查询字符串中的 $ 前缀表示一个参数名称。
  4. 向量二进制数据:你需要使用 PARAMS 参数将 $vector 替换为向量的二进制表示。值 2 表示 PARAMS 后跟两个参数,第一个是参数名称 vector,第二个是参数值。
  5. 方言:向量搜索功能自查询方言的第二个版本以来就已经可用。

你可以在 FT.SEARCH 命令参考中阅读更多关于 PARAMS 参数的信息。

以下示例展示了如何基于自行车描述嵌入查询三个自行车,并使用字段别名 vector。结果将根据距离按升序返回。你可以看到查询仅返回 __vector_scoredescription 字段。字段 __vector_score 是默认存在的。由于你可以在模式中有多个向量字段,向量分数字段的名称取决于向量字段的名称。如果你将字段名 @vector 更改为 @foo,分数字段名称将更改为 __foo_score

  1. FT.SEARCH idx:bikes_vss "(*)=>[KNN 3 @vector $query_vector]" PARAMS 2 "query_vector" "Z\xf8\x15:\xf23\xa1\xbfZ\x1dI>\r\xca9..." SORTBY "__vector_score" ASC RETURN 2 "__vector_score" "description" DIALECT 2

在上面的 CLI 示例中,查询向量的二进制值已显著缩短。

半径

你需要传递半径以及索引名、向量字段名和向量的二进制值,而不是最近邻的数量:

  1. FT.SEARCH index "@field:[VECTOR_RANGE radius $vector]" PARAMS 2 vector "binary_data" DIALECT 2

如果你想按距离排序,那么你必须通过范围查询参数 $YIELD_DISTANCE_AS 返回距离:

  1. FT.SEARCH index "@field:[VECTOR_RANGE radius $vector]=>{$YIELD_DISTANCE_AS: dist_field}" PARAMS 2 vector "binary_data" SORTBY dist_field DIALECT 2

以下是该查询的详细说明:

  1. 范围查询:半径查询的语法与常规范围查询非常相似,唯一不同的是关键字 VECTOR_RANGE。你还可以将向量半径查询与其他查询组合,方式与常规范围查询相同。有关更多细节,请参阅组合查询文章
  2. 附加步骤=> 箭头表示范围查询后跟评估附加参数。
  3. 范围查询参数:如 $YIELD_DISTANCE_AS 等参数可以在向量参考文档中找到。
  4. 向量二进制数据:你需要使用 PARAMS 来传递向量的二进制表示。
  5. 方言:向量搜索功能自查询方言的第二个版本以来就已经可用。

注意:

默认情况下,FT.SEARCH 仅返回前十个结果。范围查询文章 解释了如何浏览结果集。

以下示例展示了一个半径查询,它返回在半径 0.5 内的描述和距离,结果按距离排序。

  1. FT.SEARCH idx:bikes_vss "@vector:[VECTOR_RANGE 0.5 $query_vector]=>{$YIELD_DISTANCE_AS: vector_dist}" PARAMS 2 "query_vector" "Z\xf8\x15:\xf23\xa1\xbfZ\x1dI>\r\xca9..." SORTBY vector_dist ASC RETURN 2 vector_dist description DIALECT 2