衡量向量查询召回率

本页面介绍了如何在 AlloyDB for PostgreSQL 中衡量向量查询召回率。召回率是索引返回的最近邻中,实际上的真正最近邻所占的百分比。例如,如果对 20 个最近邻进行的最近邻查询返回 19 个接地最近邻,则召回率为 19/20x100 = 95%。

在向量查询中,召回率很重要,因为它衡量的是通过搜索检索到的相关结果的百分比。召回率有助于您评估 ANN 搜索结果的准确率,将其与速度较慢的 KNN 搜索结果进行比较。

本页面假定您熟悉 PostgreSQL、AlloyDB 和向量搜索。

准备工作

  1. 如需将生成的嵌入存储为 vector 值,请安装 vector 扩展程序版本 0.8.0.google-2 或更高版本,其中包含 pgvector 函数和运算符。Google 通过特定于 AlloyDB 的优化扩展了此版本的 pgvector

    CREATE EXTENSION IF NOT EXISTS vector;
    

    如需了解详情,请参阅对向量进行存储、索引编制和查询

  2. 如需生成 ScaNN 索引,请安装 alloydb_scann 扩展程序和 vector 扩展程序。

    CREATE EXTENSION IF NOT EXISTS alloydb_scann;
    

评估对 ScaNN 索引进行的向量查询的召回率

您可以使用 evaluate_query_recall 函数获得采用给定配置时,对 ScaNN 索引进行的向量查询的召回率。借助此函数,您可以对参数进行调优以实现所需的向量查询召回率结果。召回率是一种用于搜索质量的指标,定义为返回结果中与查询向量客观上最接近的结果所占的百分比。

获得向量查询的召回率

  1. AlloyDB Studio 中打开 SQL 编辑器,或打开 psql 客户端
  2. 创建 alloydb_scann 扩展程序,然后使用 ScaNN 索引方法创建索引
  3. 执行 evaluate_query_recall 函数,该函数会将查询作为参数并返回以下召回率:

    SELECT * FROM evaluate_query_recall( QUERY_TEXT, QUERY_TIME_CONIGURATIONS )
    

    在运行此命令之前,请先进行以下替换:

    • QUERY_TEXT:查询的文本。
    • QUERY_TIME_CONFIGURATIONS:您可以为 ANN 查询设置的配置。这必须采用 JSON 格式。默认值为 NULL

    QUERY_TIME_CONFIGURATIONS 中提供的所有配置都必须存在于 pg_settings 中。配置在函数的范围中进行本地设置。如果您未设置任何配置,AlloyDB 会使用在会话中设置的所有配置。您也可以仅设置最适合您的应用场景的配置。

    如需查看默认配置设置,请运行 SHOW CONFIG_NAME 命令,或通过运行以下命令来查看 pg_settings

    SELECT * FROM pg_settings;
    

    如需了解详情,请参阅 pg_settings

    如果您具有要为其进行召回率调优的 ScaNN 索引,请参阅 ScaNN 索引参考中的调优参数。

    如需将查询输入内容提供给函数,请将查询包含在 $$ on both sides.

    The following is an example output, where ann_execution_time is the time that it takes a vector query to execute using index scans. ground_truth_execution_time is the time that it takes the query to run using a sequential scan. You can use any PostgreSQL configuration that supports your use case.

    SELECT *
    FROM evaluate_query_recall(
    $$ SELECT id FROM t ORDER BY val <=> '[1,2,1]' LIMIT 10 $$, '{"scann.num_leaves_to_search":55}');
    id |                         query                          |          configurations           | recall | ann_execution_time | ground_truth_execution_time | index_type
    ----+--------------------------------------------------------+-----------------------------------+--------+--------------------+-----------------------------+------------
     1 |  SELECT id FROM t ORDER BY val <=> '[1,2,1]' LIMIT 10  | {"scann.num_leaves_to_search":55} |    0.2 |             16.772 |                        28.8 | scann
    (1 row)
    

限制

如果在召回率计算查询中使用的向量列具有 ScaNN 以外的向量索引,则评估的召回率可能不准确。

后续步骤