日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

PGVector是一個高效的向量數據庫插件,支持多種向量計算算法和數據類型,同時還能夠高效存儲與查詢以向量表示的AI Embedding。本文檔將為您介紹PGVector的背景、原理、使用方法及其他相關信息。

背景信息

隨著數據科學和機器學習等技術的迅速發展,向量計算已經成為了大數據領域中最常見的計算任務之一。PolarDB PostgreSQL版(兼容Oracle)作為一種廣泛使用的關系型數據庫,結合PGVector插件后通過自定義的數據類型和存儲方法,使得高維向量計算變得更加高效快速。

說明

數據庫內部使用高維度(包括主流文本嵌入模型)存儲表示輸入輸出的場景,PGVector插件最高支持16000維度

前提條件

PGVector代碼支持的版本:開源版本

注意事項

  • PX支持通過sort遍歷高維向量。

  • PX不支持索引查詢。

原理介紹

PGVector的索引算法是IVFFLAT(同pase插件的向量算法)。IVFFLAT是一種基于倒排索引的近似最近鄰搜索算法,可以用于高效地查詢向量之間的相似度。它將向量空間分為若干個劃分區域,每個區域都包含一些向量,并創建倒排索引,用于快速地查找與給定向量相似的向量。

IVFFLAT是IVFADC算法的簡化版本,適合于召回精度要求高,但對查詢耗時要求不嚴格(100ms級別)的場景。相比其他算法,IVFFlat算法具有高召回率高精度、算法和參數簡單、空間占用小的優勢。

PGVector插件的實現基于PolarDB PostgreSQL版(兼容Oracle)的擴展機制,利用C語言編寫實現了多種向量計算算法和數據類型。其中插件算法的具體流程如下:

  1. 高維空間中的點基于隱形的聚類屬性,按照kmeans等聚類算法對向量進行聚類處理,使得每個類簇有一個中心點。

  2. 檢索向量時首先遍歷計算所有類簇的中心點,找到與目標向量最近的n個類簇中心。

  3. 遍歷計算n個類簇中心所在聚類中的所有元素,經過全局排序得到距離最近的k個向量。

使用指南

  • PGVector插件可以順序及索引檢索高維向量,示例列出了簡單使用方法。

  • 召回率和性能介紹。

    PGVector插件在0.5.0版本前使用的IVFFlat索引構建速度快,相比于無任何索引能夠提升一定的查詢性能,但召回率表現一般,也會消耗一定的內存。新增的HNSW索引在召回率和性能上都有更加優秀的表現,但索引構建速度更慢,內存使用量更高。在使用向量索引來查詢向量數據時,往往需要在性能與召回率兩個維度上權衡利弊,這里介紹兩種提升召回率的索引參數配置方法。

    • HNSW

      m:表示在每個索引元素之間存在多少雙向鏈接(或路徑)。默認值為16,取值范圍為2~100。將該值設置為一個較高的數量,可以增加召回量。但也會顯著增加索引生成時間,并可能影響查詢性能。

      ef_construction:表示在索引中添加元素時,需要檢查的近鄰數。默認值為64,取值范圍為4~100。增加該值可以增加召回量,但是會增加索引構建時間。該值必須至少是m的兩倍。

      CREATE TABLE vecs (id int PRIMARY KEY, embedding vector(1536));
      CREATE INDEX ON vecs USING hnsw(embedding vector_l2_ops) WITH (m=16, ef_construction=64);

      必須指定使用HNSW索引的操作符類。例如,使用HNSW索引的余弦,可以使用如下命令:

      CREATE INDEX ON vecs USING hnsw(embedding vector_cosine_ops);

      可以先選擇默認的索引構建配置項來優化構建時間。如果沒有得到數據集的預期召回量,先增加ef_construction值,再調整m值。可以通過設置較大的hnsw.ef_search值來增加查詢召回,例如,設置為100,值越大往往召回越高。

    • IVFFlat

      listsPGVector采樣表中所有向量的聚類中心數量。

      CREATE INDEX ON vecs USING ivfflat(embedding) WITH (lists=100);

關于索引和更多的參數方法介紹可以參考開源代碼的README模塊。

示例

  1. 創建插件。

    CREATE EXTENSION vector;
  2. 創建表。

    CREATE TABLE t (val vector(3));
  3. 插入數據。

    INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL);
  4. 創建向量索引。

    CREATE INDEX ON t USING ivfflat (val vector_ip_ops) WITH (lists = 1);
  5. 計算近似向量。

    SELECT * FROM t ORDER BY val <#> '[3,3,3]';

    返回結果如下:

       val
    ---------
     [1,2,3]
     [1,1,1]
     [0,0,0]
    (3 rows)
    說明
    • val vector_ip_ops表示需要創建索引的列名為val,并且使用PolarDB PostgreSQL版(兼容Oracle)中提供的向量操作符vector_ip_ops來計算向量之間的相似度。該操作符支持向量之間的點積、余弦相似度、歐幾里得距離等計算方式。

    • WITH (lists = 1)表示使用的劃分區域數量為1,這意味著所有向量都將被分配到同一個區域中。在實際應用中,劃分區域數量需要根據數據規模和查詢性能進行調整。

相關參考

向量的embedding過程請參考中國內地和國際文本embedding模型輸出