Mengukur recall kueri vektor

Pilih versi dokumentasi:

Halaman ini menjelaskan cara mengukur recall kueri vektor di AlloyDB Omni. Dalam konteks penelusuran vektor, perolehan mengacu pada persentase vektor yang ditampilkan indeks yang merupakan tetangga terdekat sebenarnya. Misalnya, jika kueri tetangga terdekat untuk 20 tetangga terdekat menampilkan 19 tetangga terdekat dari kebenaran nyata, maka perolehannya adalah 19/20x100 = 95%.

Dalam kueri vektor, perolehan penting karena mengukur persentase hasil yang relevan yang diambil dari penelusuran. Recall membantu Anda mengevaluasi akurasi hasil dari penelusuran perkiraan tetangga terdekat (ANN) dibandingkan dengan hasil dari penelusuran k-nearest neighbors (KNN).

ANN adalah algoritma yang menemukan titik data yang mirip dengan titik kueri tertentu, dan meningkatkan kecepatan dengan menemukan tetangga perkiraan, bukan tetangga sebenarnya. Saat menggunakan ANN, Anda menyeimbangkan kecepatan dengan ingatan.

KNN adalah algoritma yang menemukan k vektor yang paling mirip dengan vektor kueri tertentu dalam set data, berdasarkan metrik kesamaan. k adalah jumlah tetangga yang Anda inginkan untuk ditampilkan oleh kueri.

Anda dapat mengukur recall kueri penelusuran vektor untuk berbagai indeks vektor, termasuk:

  • Scalable Nearest Neighbors (ScaNN): algoritma untuk penelusuran kesamaan vektor yang efisien.
  • Hierarchical Navigable Small World (HNSW): algoritma berbasis grafik yang digunakan untuk penelusuran perkiraan tetangga terdekat yang efisien dalam database vektor.
  • File Terbalik dengan Kompresi Datar (IVFFLAT) dan File Datar Terbalik (IVF): jenis indeks vektor yang digunakan untuk penelusuran ANN, terutama dalam database seperti ekstensi pgvector PostgreSQL.

Halaman ini mengasumsikan bahwa Anda sudah memahami PostgreSQL, AlloyDB Omni, dan penelusuran vektor.

Sebelum memulai

  1. Instal atau update ekstensi pgvector.

    1. Jika ekstensi pgvector tidak diinstal, instal ekstensi versi vector 0.8.0.google-3 atau yang lebih baru untuk menyimpan embedding yang dihasilkan sebagai nilai vector. Ekstensi vector mencakup fungsi dan operator pgvector. Google memperluas versi pgvector ini dengan pengoptimalan untuk AlloyDB Omni.

      CREATE EXTENSION IF NOT EXISTS vector WITH VERSION '0.8.0.google-3';
      

      Untuk mengetahui informasi selengkapnya, lihat Menyimpan, mengindeks, dan membuat kueri vektor.

    2. Jika ekstensi pgvector sudah diinstal, upgrade ekstensi vector ke versi 0.8.0.google-3 atau yang lebih baru untuk mendapatkan kemampuan evaluator recall.

      ALTER EXTENSION vector UPDATE TO '0.8.0.google-3';
      
  2. Untuk membuat indeks ScaNN, instal ekstensi alloydb_scann.

    CREATE EXTENSION IF NOT EXISTS alloydb_scann;
    

Mengevaluasi perolehan untuk kueri vektor pada indeks vektor

Anda dapat menemukan recall untuk kueri vektor pada indeks vektor untuk konfigurasi tertentu menggunakan fungsi evaluate_query_recall. Fungsi ini memungkinkan Anda menyesuaikan parameter untuk mendapatkan hasil recall kueri vektor yang diinginkan. Perolehan adalah metrik yang digunakan untuk kualitas penelusuran, dan didefinisikan sebagai persentase hasil yang ditampilkan yang secara objektif paling dekat dengan vektor kueri. Fungsi evaluate_query_recall diaktifkan secara default.

Menemukan recall untuk kueri vektor

  1. Buka editor SQL di AlloyDB Studio atau buka klien psql.
  2. Buat indeks vektor ScaNN, HNSW, atau IVFFLAT.

  3. Pastikan flag enable_indexscan diaktifkan. Jika tanda dinonaktifkan, tidak ada pemindaian indeks yang dipilih dan perolehan untuk semua indeks adalah 1.

  4. Jalankan fungsi evaluate_query_recall, yang menggunakan kueri sebagai parameter dan menampilkan perolehan berikut:

    SELECT * FROM evaluate_query_recall( QUERY_TEXT, QUERY_TIME_CONFIGURATIONS, INDEX_METHODS )
    

    Sebelum menjalankan perintah ini, lakukan penggantian berikut:

    • QUERY_TEXT: kueri SQL, yang diapit dalam $$.
    • QUERY_TIME_CONFIGURATIONS: Optional: the configuration that you can set for the ANN query. This must be in JSON format. The default value is NULL.
    • INDEX_METHODS: Optional: a text array that contains different vector index methods for which you want to calculate the recall. If you set an index method for which a corresponding index doesn't exist, the recall is 1. The input must be a subset of {scann, hnsw, ivf, ivfflat}. If no value is provided, the ScaNN method is used.

      To view differences between query recall and execution time, change the query time parameters for your index.

      The following table lists query time parameters for ScaNN, HNSW, and IVF/IVFFLAT index methods. The parameters are formatted as {"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10, "hnsw.ef_search": 1}.

      Index type Parameters
      ScaNN
      • scann.num_leaves_to_search
      • scann.pre_reordering_num_neighbors
      • scann.pct_leaves_to_search
      • scann.num_search_threads
      HNSW
      • hnsw.ef_search
      • hnsw.iterative_scan
      • hnsw.max_scan_tuples
      • hnsw.scan_mem_multiplier
      IVF
      • ivf.probes
      IVFFLAT
      • ivfflat.probes
      • ivfflat.iterative_scan
      • ivfflat.max_probes

      For more information about ScaNN index methods, see AlloyDB Omni ScaNN Index reference. For more information about HNSW and IVF/IVFFLAT index methods, see pgvector.

  5. Optional: You can also add configurations from pg_settings to the QUERY_TIME_CONFIGURATIONS. For example, to run a query with columnar engine scan enabled, add the following config from pg_settings as {"google_columnar_engine.enable_columnar_scan" : on}.

    The configurations are set locally in the function. Adding these configurations doesn't impact the configurations that you set in your session. If you don't set any configurations, AlloyDB uses all of the configurations that you set in the session. You can also set only those configurations that are best suited for your use case.

  6. Optional: To view the default configuration settings, run the SHOW command or view the pg_settings.

  7. Optional: If you have a ScaNN index for which you want to tune the recall, see the tuning parameters in ScaNN index reference.

    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.

    ann_execution_time and ground_truth_execution_time are different from but directly dependent on Execution time in the query plan. Execution time is the total time to execute the query from the client.

    t=# SELECT * FROM evaluate_query_recall( $$ SELECT id FROM t1 ORDER BY val <=> '[1000,1000,49000]' LIMIT 10 $$, '{"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10, "hnsw.ef_search": 1}', ARRAY['scann', 'hnsw']);
    NOTICE:  Recall is 1. This might mean that the vector index is not present on the table or index scan not chosen during query execution.
    id|               query                                               |                                         configurations                                         |  recall |ann_execution_time | ground_truth_execution_time |  index_type
    ----+-------------------------------------------------------------------+------------------------------------------------------------------------------------------------+--------+--------------------+-----------------------------+------------
    1 |  SELECT id FROM t1 ORDER BY val <=> '[1000,1000,49000]' LIMIT 10  | {"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10, "hnsw.ef_search": 1} |    0.5 |               4.23 |                     118.211 | scann
    2 |  SELECT id FROM t1 ORDER BY val <=> '[1000,1000,49000]' LIMIT 10  | {"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10, "hnsw.ef_search": 1} |      1 |            107.198 |                     118.211 | hnsw
    (2 rows)
    
    

    Jika hasilnya adalah Recall is 1 (pengingatan kueri adalah 1), hal ini mungkin menunjukkan bahwa indeks vektor tidak ada di tabel atau bahwa indeks vektor tidak dipilih selama eksekusi kueri. Situasi ini terjadi jika tidak ada indeks vektor pada tabel atau saat perencana tidak memilih pemindaian indeks vektor.

    Jika kuerinya adalah select id, name from table order by embedding <->'[1,2,3]' LIMIT 10;. dan nilai nama kolom yang diharapkan adalah NULL, maka ubah kueri menjadi salah satu dari berikut ini:

    select id, COALESCE(name, 'NULL') as name from table order by embedding <-> '[1,2,3]' LIMIT 10;
    

    Atau

    select id from table order by embedding <-> '[1,2,3]' LIMIT 10;
    

Langkah berikutnya