Tüm Ürünler
Search
Belge Merkezi

ApsaraDB RDS:Vector search (PASE)

Son Güncelleme:Oct 12, 2026

Bu konu, IVFFlat veya HNSW algoritmasına dayanan PASE eklentisini kullanarak RDS for PostgreSQL'de vektör aramasının nasıl verimli bir şekilde yapılacağını açıklar.

Not

PASE eklentisi artık bakım almamaktadır. Bunun yerine pgvector eklentisini kullanmanızı öneririz.

Ön koşullar

Örneğiniz RDS for PostgreSQL 11 ila 16 sürümünü çalıştırıyor olmalıdır.

Arka plan bilgileri

Son yıllarda derin öğrenme alanındaki temel teknolojilerden biri olan temsil öğrenimi önemli ilerlemeler kaydetmiştir. Reklam teslimatı, yüz tanıma ile ödeme, görüntü ve konuşma tanıma gibi endüstriyel uygulamalarda yaygın olarak kullanılmaktadır. Bu senaryolarda veriler yüksek boyutlu vektörlere gömülür ve benzer öğeleri bulmak için vektör araması kullanılır.

PASE (PostgreSQL ANN search extension), PostgreSQL için geliştirilmiş yüksek performanslı bir vektör arama dizini eklentisidir. Yaklaşık en yakın komşu (ANN) arama algoritmaları arasında yer alan IVFFlat ve HNSW gibi olgun, kararlı ve verimli algoritmaları kullanarak son derece hızlı vektör sorguları yapmanızı sağlar. PASE, özellik vektörlerinin çıkarılmasını veya oluşturulmasını desteklemez. Varlıklarınız için özellik vektörlerini oluşturmak sizin sorumluluğunuzdadır. PASE, oluşturduğunuz büyük hacimli vektörler üzerinde benzerlik aramaları yapar.

Hedef kitle

Bu konuyu anlamak için makine öğrenimi, arama ve öneri sistemleri hakkında temel bilgilere sahip olmanız gerekir.

Kullanım notları

  • Dizin şişebilir. Dizin boyutunu kontrol etmek için select pg_relation_size('index_name'); komutunu çalıştırın. Boyutu veri boyutundan önemli ölçüde büyük hale gelirse ve sorgu performansı belirgin şekilde düşerse dizini yeniden oluşturun.

  • Sık veri güncellemeleri sonrası dizin doğruluğu azalabilir. Mutlak doğruluk sağlamak için dizini periyodik olarak yeniden oluşturun.

  • Dahili merkezlere sahip bir IVFFlat dizini (clustering_type=1) kullanmak için dizini oluşturmadan önce tabloya bazı veriler eklemeniz gerekir.

  • Bu konudaki SQL örneklerini çalıştırmak için yetkili bir hesap kullanın.

PASE algoritmaları

  • IVFFlat algoritması

    IVFFlat, IVFADC'nin basitleştirilmiş bir sürümüdür; yüksek geri çağırma gerektiren ve orta düzeyde sorgu gecikmesini (100 ms aralığında) tolere edebilen senaryolar için uygundur. Diğer algoritmalara kıyasla IVFFlat algoritması aşağıdaki avantajları sunar:

    • Sorgu vektörü aday veri kümesinin bir parçasıysa IVFFlat %100 geri çağırma sağlayabilir.

    • Algoritma basittir; bu durum daha hızlı dizin oluşturma ve daha küçük depolama alanı kullanımı sağlar.

    • Merkezleri belirtebilir ve basit parametreleri ayarlayarak geri çağırmayı kontrol edebilirsiniz.

    • Algoritmanın parametreleri yüksek derecede yorumlanabilir olup doğruluk üzerinde tam kontrol sağlar.

    Aşağıdaki şekil IVFFlat algoritmasının çalışma mantığını göstermektedir.

    IVFFlat算法原理

    İşlem şu adımlardan oluşur:

    1. Yüksek boyutlu uzaydaki vektörler, k-means gibi bir kümeleme algoritması kullanılarak kümeler halinde gruplandırılır. Her kümenin bir merkezi bulunur.

    2. Arama sırasında algoritma öncelikle tüm kümelerin merkezlerini dolaşarak hedef vektöre en yakın olan n kümeyi bulur.

    3. Algoritma ardından bu n küme içindeki tüm öğeleri dolaşır ve nihai k en yakın vektörü bulmak için genel bir sıralama yapar.

    Not
    • Merkezler aranırken uzak kümeler otomatik olarak dışlanarak sorgu hızlandırılır. Ancak bu durum, en iyi ilk k vektörün tamamının seçilen n küme içinde olacağının garanti edilmediği anlamına gelir; bu da doğruluğu azaltabilir. IVFFlat algoritmasının doğruluğunu tarama yapılacak küme sayısı olan n değerini ayarlayarak kontrol edebilirsiniz. Daha büyük bir n değeri doğruluğu artırır ancak hesaplama yükünü de yükseltir.

    • IVFFlat ve IVFADC'nin ilk aşaması aynıdır. Temel fark ikinci hesaplama aşamasında yatar. IVFADC, kapsamlı hesaplamadan kaçınmak için ürün kuantizasyonunu kullanır; bu durum belirli bir doğruluk kaybına yol açar. Buna karşılık IVFFlat, hesaplamayı yönetilebilir tutarken bu kaybı önlemek için doğrudan hesaplama (brute-force) yöntemi kullanır.

  • HNSW algoritması

    Hiyerarşik Navigable Small World (HNSW) algoritması çok büyük ölçekli vektör veri kümeleri (on milyonlarca veya daha fazla) ve sıkı sorgu gecikmesi gereksinimleri (10 ms aralığında) olan senaryolar için uygundur.

    HNSW, potansiyel yakın komşuları bulmak için bir yakınlık grafiğinde hızla dolaşan grafik tabanlı bir algoritmadır. HNSW algoritmasının performans iyileştirmesi, diğer algoritmalara kıyasla büyük veri kümelerinde daha belirgindir. Ancak komşu noktaların saklanması ek depolama alanı tüketir ve yalnızca parametre ayarlamasıyla geri çağırmayı iyileştirme konusunda azalan getiriler söz konusudur.

    Aşağıdaki şekil HNSW algoritmasının çalışma mantığını göstermektedir.

    HNSW算法原理

    İşlem şu adımlardan oluşur:

    1. Algoritma çok katmanlı bir grafik oluşturur; her katman altındaki katmanın daha seyrek bir versiyonudur ve alt katman için ekspres yol sistemi benzeri bir atlama listesi görevi görür.

    2. Arama üst katmandan rastgele seçilen bir noktadan başlar.

    3. Algoritma başlangıç noktasının komşularını bulur ve bunları hedefe olan uzaklıklarına göre sıralanmış sabit boyutlu dinamik bir listede saklar. Sonraki adımlarda listeden noktalar alır, bunların komşularını bulur ve yeni keşfedilen komşuları tekrar listeye ekler. Her eklemeden sonra liste yeniden sıralanır ve yalnızca ilk k nokta korunur. Liste stabilize olana kadar bu süreç yinelemeli olarak devam eder. Stabilize olmuş listedeki ilk nokta daha sonra bir alt katman için giriş noktası olarak kullanılır.

    4. Arama en alt katmana ulaşana kadar bu işlem her katman için tekrarlanır.

    Not

    HNSW algoritması, NSW algoritmasının tek katmanlı grafiğini temel alarak çok katmanlı bir grafik oluşturur. Bu grafikte en yakın komşuları aramak, kümeleme tabanlı algoritmalara göre daha yüksek bir hızlanma oranı elde etmenizi sağlar.

Her algoritmanın belirli kullanım durumları vardır. Örneğin IVFFlat algoritması yüksek hassasiyetli görüntü karşılaştırma için uygunken HNSW algoritması arama ve öneri senaryolarındaki geri getirme işlemleri için idealdir.

PASE kullanımı

Yordam

  1. PASE eklentisini oluşturun. Aşağıdaki komutu çalıştırın:

    CREATE EXTENSION pase;
  2. Vektör benzerliğini hesaplayın. Vektör benzerliğini hesaplamak için iki yapıcı yöntemden birini kullanabilirsiniz:

    • PASE veri türü yapıcısını kullanma

      Örnekler

      SELECT ARRAY[2, 1, 1]::float4[] <?> pase(ARRAY[3, 1, 1]::float4[]) AS distance;
      SELECT ARRAY[2, 1, 1]::float4[] <?> pase(ARRAY[3, 1, 1]::float4[], 0) AS distance;
      SELECT ARRAY[2, 1, 1]::float4[] <?> pase(ARRAY[3, 1, 1]::float4[], 0, 1) AS distance;
      Not
      • <?> operatörü sol taraftaki vektör (float4[]) ile sağ taraftaki vektör (pase) arasındaki benzerliği hesaplar.

      • pase türü, eklenti içinde tanımlanan bir veri türüdür. Örneklerde gösterildiği gibi üç yapıcı yöntemi vardır. pase(ARRAY[3, 1, 1]::float4[], 0, 1) örneğini ele alalım: İlk parametre float4[] türündedir ve sağ vektörü temsil eder. İkinci parametre bu bağlamda kullanılmaz ve 0 olarak ayarlanabilir. Üçüncü parametre benzerlik hesaplama yöntemini belirtir: 0 Öklid mesafesi, 1 ise nokta çarpımı (iç çarpım) içindir.

      • Sol ve sağ vektörlerin boyutları eşit olmalıdır. Aksi takdirde hesaplama başarısız olur.

    • Dize yapıcısını kullanma

      Örnekler

      SELECT ARRAY[2, 1, 1]::float4[] <?> '3,1,1'::pase AS distance;
      SELECT ARRAY[2, 1, 1]::float4[] <?> '3,1,1:0'::pase AS distance;
      SELECT ARRAY[2, 1, 1]::float4[] <?> '3,1,1:0:1'::pase AS distance;
      Not

      Hem dize yapıcısı hem de PASE veri türü yapıcısı iki vektör arasındaki benzerliği hesaplar. Fark, dize yapıcısının sınırlayıcı olarak iki nokta (:) kullanmasıdır. '3,1,1:0:1' örneğini ele alalım: İlk kısım sağ vektörü temsil eder. İkinci kısım bu bağlamda kullanılmaz ve 0 olarak ayarlanabilir. Üçüncü kısım benzerlik hesaplama yöntemini belirtir: 0 Öklid mesafesi, 1 ise nokta çarpımı (iç çarpım) içindir.

  3. Dizin oluşturun. İki algoritmadan birini kullanarak dizin oluşturabilirsiniz:

    Not

    Benzerlik ölçüsü olarak Öklid mesafesi kullanılan bir PASE vektör diziniyle çalışırken orijinal vektörleri işlemeye gerek yoktur. Ancak iç çarpım veya kosinüs benzerliğini ölçü olarak kullanmak istiyorsanız vektörler üzerinde normalleştirme yapmanız gerekir. Orijinal vektör ise koşulunu sağlamalıdır. Normalleştirme sonrası iç çarpım ve kosinüs benzerliği değerleri sıralama açısından eşdeğerdir.

    • IVFFlat algoritmasını kullanarak dizin oluşturma

      CREATE INDEX ivfflat_idx ON table_name
      USING
        pase_ivfflat(column_name)
      WITH
        (clustering_type = 1, distance_type = 0, dimension = 256, base64_encoded = 0, clustering_params = "10.100");

      Aşağıdaki tabloda parametreler açıklanmaktadır.

      Parametre

      Açıklama

      clustering_type

      IVFFlat algoritması için kümeleme yöntemi. Bu parametre zorunludur. Geçerli değerler:

      • 0: Harici kümeleme. clustering_params parametresi tarafından belirtilen harici merkez dosyasını yükler.

      • 1: Dahili kümeleme. Dizin oluşturma sırasında k-means algoritmasını kullanarak dahili olarak bir kümeleme işlemi yapar. Bu işlem clustering_params parametresi tarafından kontrol edilir.

      Yeni kullanıcılar için dahili kümeleme kullanmanızı öneririz.

      distance_type

      Benzerlik hesaplama yöntemi. Varsayılan: 0. Geçerli değerler:

      • 0: Öklid mesafesi.

      • 1: Nokta çarpımı (iç çarpım). Bu yöntemi kullanmak için vektörler üzerinde normalleştirme yapmanız gerekir. Bu durumda nokta çarpımı (iç çarpım) değerlerinin sıralaması, Öklid mesafesi değerlerinin sıralamasının tersidir.

      Şu anda dizin oluşturma için yalnızca Öklid mesafesi doğrudan desteklenmektedir. Nokta çarpımı (iç çarpım) kullanmak için vektörleri normalleştirmeniz ve Ek bölümünde sağlanan yöntemi kullanmanız gerekir.

      dimension

      Vektör boyutu. Bu parametre zorunludur. Desteklenen maksimum boyut 512'dir.

      base64_encoded

      Verilerin Base64 kodlamalı olup olmadığını belirtir. Varsayılan: 0. Geçerli değerler:

      • 0: Vektör türü float4[].

      • 1: Vektör türü, bir float dizisinin Base64 kodlamalı dizesidir.

      clustering_params

      Harici kümeleme için bu parametre merkez dosyasının yolunu belirtir. Dahili kümeleme için kümeleme parametrelerini "clustering_sample_ratio,k" biçiminde belirtir. Bu parametre zorunludur.

      • clustering_sample_ratio: Paydası 1000 olan kümeleme örnek oranı. Geçerli aralık (0, 1000] aralığında bir tamsayıdır. Örneğin, 1 değeri tablodaki verilerin 1/1000'inin k-means kümelemesi için örneklendiği anlamına gelir. Daha büyük bir değer sorgu doğruluğunu artırır ancak dizin oluşturma süresini uzatır. Toplam örneklenen veri noktası sayısının 100.000'i aşmamasını öneririz.

      • k: Merkez sayısı. Daha büyük bir değer sorgu doğruluğunu artırır ancak dizin oluşturma süresini uzatır. [100, 1000] aralığında bir değer önerilir.

    • HNSW algoritmasını kullanarak dizin oluşturma

      CREATE INDEX hnsw_idx ON table_name
      USING
        pase_hnsw(column_name)
      WITH
        (dim = 256, base_nb_num = 16, ef_build = 40, ef_search = 200, base64_encoded = 0);

      Aşağıdaki tabloda parametreler açıklanmaktadır.

      Parametre

      Açıklama

      dim

      Vektör boyutu. Zorunludur. Değer aralığı [8.512].

      base_nb_num

      Grafikteki her düğüm için komşu sayısı. Bu parametre zorunludur. Daha yüksek bir değer sorgu doğruluğunu artırır ancak dizin oluşturma süresini ve dizin boyutunu büyütür. Önerilen değer aralığı [16-128].

      ef_build

      Dizin oluşturma süreci için yığın uzunluğu. Bu parametre zorunludur. Daha büyük bir değer daha iyi sonuçlar verir ancak oluşturma sürecini yavaşlatır. Önerilen değer aralığı [40.400].

      ef_search

      Sorgu için yığın uzunluğu. Bu zorunlu bir parametredir. Daha büyük bir değer sonuç kalitesini artırır ancak sorgu performansını düşürür. Değer [10.400] aralığında olmalıdır.

      base64_encoded

      Verilerin Base64 kodlamalı olup olmadığını belirtir. Varsayılan: 0. Geçerli değerler:

      • 0: Vektör türü float4[].

      • 1: Vektör türü, bir float dizisinin Base64 kodlamalı dizesidir.

  4. Sorgu çalıştırın. Verileri her iki dizin türünü kullanarak da sorgulayabilirsiniz:

    • IVFFlat dizini kullanarak sorgulama

      SELECT id, vector <#> '1,1,1'::pase as distance
      FROM table_name
      ORDER BY
      vector <#> '1,1,1:10:0'::pase
      ASC LIMIT 10;
      Not
      • <#> operatörü IVFFlat dizinini sorgulamak için kullanılır.

      • Vektör dizini ORDER BY yan tümcesi tarafından etkinleştirilir. Artan sıralama düzenini (ASC) destekler.

      • pase veri türü iki nokta (:) ile ayrılmış üç bölümden oluşur. Örneğin 1,1,1:10:0 ifadesinde ilk bölüm sorgu vektörüdür. İkinci bölüm IVFFlat için bir sorgu parametresidir ve değer aralığı (0,1000] şeklindedir. Daha büyük bir değer daha yüksek sorgu doğruluğu ancak daha düşük sorgu performansı sağlar. Optimal değeri gerçek verilerinize göre hata ayıklama yaparak belirlemeniz önerilir. Üçüncü bölüm sorgu için benzerlik hesaplama yöntemini belirtir; burada 0 Öklid mesafesini, 1 ise nokta çarpımını (iç çarpım) ifade eder. Nokta çarpımı (iç çarpım) yöntemini kullanırsanız vektör normalleştirmesi yapmanız gerekir. Bu durumda nokta çarpımı (iç çarpım) değerlerinin sırası, Öklid mesafesi değerlerinin sırasının tersidir.

    • HNSW dizini kullanarak sorgulama

      SELECT id, vector <?> '1,1,1'::pase as distance
      FROM table_name
      ORDER BY
      vector <?> '1,1,1:100:0'::pase
      ASC LIMIT 10;
      Not
      • <?> operatörü HNSW dizinini sorgulamak için kullanılır.

      • Vektör dizini ORDER BY yan tümcesi tarafından etkinleştirilir. Artan sıralama düzenini (ASC) destekler.

      • pase veri türü iki nokta (:) ile ayrılmış üç bölümlü bir formata sahiptir. 1,1,1:100:0 örneğinde ilk bölüm sorgu vektörüdür. İkinci bölüm HNSW sorgu etki parametresidir ve değer aralığı (0,∞) şeklindedir. Daha büyük bir değer daha yüksek sorgu doğruluğu ancak daha düşük sorgu performansı sağlar. Bu değeri gerçek verilerinizle hata ayıklama yaparak belirlemenizi ve başlangıç değeri olarak 40 kullanmanızı öneririz. Üçüncü bölüm sorgu için benzerlik hesaplama yöntemini belirtir; burada 0 Öklid mesafesini, 1 ise nokta çarpımını (iç çarpım) ifade eder. Nokta çarpımı (iç çarpım) yöntemini kullandığınızda vektör normalleştirmesi gereklidir. Bu durumda nokta çarpımı (iç çarpım) değerlerinin sırası, Öklid mesafesi değerlerinin sırasının tersidir.

Örnek

Bu örnek, IVFFlat dizini kullanarak verilerin nasıl sorgulanacağını göstermektedir.

  1. PASE eklentisini oluşturun. Aşağıdaki komutu çalıştırın:

    CREATE EXTENSION pase;
  2. Test tablosu oluşturun ve test verilerini ekleyin.

    Test tablosu oluşturun.

    CREATE TABLE vectors_table ( id SERIAL PRIMARY KEY, vector float4[] NOT NULL );

    Test verilerini ekleyin.

    INSERT INTO vectors_table (vector) VALUES ('{1.0, 0.0, 0.0}'), ('{0.0, 1.0, 0.0}'), ('{0.0, 0.0, 1.0}'), ('{0.0, 0.5, 0.0}'), ('{0.0, 0.5, 0.0}'), ('{0.0, 0.6, 0.0}'), ('{0.0, 0.7, 0.0}'), ('{0.0, 0.8, 0.0}'), ('{0.0, 0.0, 0.0}');
  3. IVFFlat algoritmasını kullanarak dizin oluşturun.

    CREATE INDEX ivfflat_idx ON vectors_table
    USING
      pase_ivfflat(vector)
    WITH
      (clustering_type = 1, distance_type = 0, dimension = 3, base64_encoded = 0, clustering_params = "10.100");
  4. IVFFlat dizinini kullanarak verileri sorgulayın.

    SELECT id, vector <#> '1,1,1'::pase as distance
    FROM vectors_table
    ORDER BY
    vector <#> '1,1,1:10:0'::pase
    ASC LIMIT 10;

Ek

  • Nokta çarpımı (iç çarpım) hesaplama örneği

    Bu örnek bir HNSW algoritma dizini kullanır. Aşağıdaki kod bir işlevin nasıl oluşturulacağını göstermektedir:

    CREATE OR REPLACE FUNCTION inner_product_search(query_vector text, ef integer, k integer, table_name text) RETURNS TABLE (id integer, uid text, distance float4) AS $$
    BEGIN
        RETURN QUERY EXECUTE format('
        select a.id, a.vector <?> pase(ARRAY[%s], %s, 1) AS distance from 
        (SELECT id, vector FROM %s ORDER BY vector <?> pase(ARRAY[%s], %s, 0) ASC LIMIT %s) a
        ORDER BY distance DESC;', query_vector, ef,  table_name,  query_vector, ef, k);
    END
    $$
    LANGUAGE plpgsql;
    Not

    Normalleştirilmiş vektörler için iç çarpım kosinüs benzerliğine eşittir. Bu nedenle kosinüs benzerliğini hesaplamak için aynı yöntemi kullanabilirsiniz.

  • IVFFlat dizini için özel merkez dosyası

    Bu gelişmiş bir özelliktir. Bu özelliği kullanmak için bir merkez dosyasını sunucuda belirtilen bir yola yükleyin ve dizini oluşturmak için bunu bir dizin parametresi olarak kullanın. Parametrelerle ilgili daha fazla bilgi için IVFFlat dizin parametrelerine bakın. Dosya biçimi aşağıdaki gibidir:

    vector_dimension|number_of_centroids|set_of_centroid_vectors

    Örnek

    3|2|1,1,1,2,2,2

İlgili belgeler