全部產品
Search
文件中心

AnalyticDB:向量檢索

更新時間:Nov 06, 2024

AnalyticDB for MySQL的向量檢索功能可以協助您實現非結構化資料的近似檢索。本文主要介紹向量檢索功能以及如何建立並使用向量索引。

前提條件

叢集的核心版本需為3.1.4.0及以上版本。

說明
  • 核心版本為3.1.5.16、3.1.6.8、3.1.8.6及以上版本的叢集向量索引功能相對穩定。

  • 若您的叢集不是上述列舉的穩定版本,建議您先將參數CSTORE_PROJECT_PUSH_DOWNCSTORE_PPD_TOP_N_ENABLE設定為false,再使用向量索引功能。

  • 如何查看叢集核心版本,請參見如何查看執行個體版本資訊。如需升級核心版本,請聯絡支援人員。

背景資訊

功能介紹

您可以通過AI演算法提取非結構化資料的特徵進行資料編碼,形成一個特徵向量,將特徵向量儲存在AnalyticDB for MySQL中。使用特徵向量標識非結構化資料,向量間的距離用于衡量非結構化資料之間的相似性。AnalyticDB for MySQL叢集提供高效的向量檢索功能,可應用於圖片檢索、聲紋匹配、Face Service、文本檢索等情境中。

產品架構

image.png

產品優勢

  • 向量資料的高維度、高效能和高召回率。

    以人臉512維向量為例,AnalyticDB for MySQL向量檢索提供百億向量100 QPS、50毫秒回應時間約束下99%的資料召回率和兩億向量1000 QPS、1秒回應時間約束下99%的資料召回率。

  • 結構化和非結構資料的融合查詢

    支援KNN和RNN融合查詢,例如:比較一批向量與另外一批向量的相似性。

  • 即時更新

    支援高並發的即時寫入和即時更新,資料寫入後即可查詢。

  • 即時檢索

    MPP查詢架構提供毫秒級即時檢索效能,提升檢索效率。

  • 開箱即用

    支援標準的SQL語句,簡化開發流程,不需要額外安裝其他複雜的配置。

基本概念

特徵向量

向量是一種將實體和應用代數化的表示。向量將實體間的關係抽象成向量空間中的距離,距離的遠近代表相似程度。例如:身高、年齡、性別、地區等。在AnalyticDB for MySQL中,特徵向量的資料類型為數組,僅支援固定長度數組。

向量檢索

在特徵向量資料集合中進行快速搜尋和匹配的方法。

向量索引

特定類型的索引。

距離計算

特定類型的自訂函數,每個距離計算公式對應一個自訂函數。例如:L2_DISTANCE

KNN

KNN(K-Nearest Neighbor)演算法用於尋找特徵向量資料集合中離查詢點最近的 K 個點。

RNN

RNN(Radius Nearest Neighbor)演算法用於尋找特徵向量資料集合中查詢點在某半徑範圍內的所有點。

建立向量索引

文法

您可以在建立表時同步建立向量索引。定義為:

ANN INDEX [index_name] (column_name)] [algorithm=HNSW_PQ ] [distancemeasure=SquaredL2]

參數說明

  • ANN INDEX:向量索引關鍵字。

  • index_name:索引名。索引的命名規則,請參見命名約束

  • column_name:向量列的名稱。列名的命名規則,請參見命名約束。 僅支援array <float>array <byte>array <smallint>三種資料類型。

  • algorithm:向量距離計算公式使用的演算法,取值僅支援:HNSW_PQ

  • distancemeasure:向量距離計算公式,取值僅支援:SquaredL2SquaredL2計算公式為:(x1-y1)2+(x2-y2)2+…...(xn-yn)2

樣本

本樣本建立表vector,表定義了兩個向量列float_featureshort_feature,其中,float_feature的類型為arrary<float>,維度為4short_feature類型為arrary<smallint>,維度也為4,對這兩個列分別建立向量索引。

CREATE TABLE vector (
  xid BIGINT NOT NULL,
  cid BIGINT NOT NULL,
  uid VARCHAR NOT NULL,
  vid VARCHAR NOT NULL,
  wid VARCHAR NOT NULL,
  float_feature ARRAY < FLOAT >(4),
  short_feature ARRAY < SMALLINT >(4),
  ANN INDEX idx_short_feature(short_feature),
  ANN INDEX idx_float_feature(float_feature),
  PRIMARY KEY (xid, cid, vid)
) DISTRIBUTED BY HASH(xid);

增加向量索引

文法

您可以在建立表後增加向量索引。定義為:

ALTER TABLE table_name ADD ANN INDEX [index_name] (column_name) [algorithm=HNSW_PQ ] [distancemeasure=SquaredL2]

樣本

假設已有表vector,建表語句如下。

CREATE TABLE vector (
  xid BIGINT not null,
  cid BIGINT not null,
  uid VARCHAR not null,
  vid VARCHAR not null,
  wid VARCHAR not null,
  float_feature array < FLOAT >(4),
  short_feature array < SMALLINT >(4),
  PRIMARY KEY (xid, cid, vid)
) DISTRIBUTED BY HASH(xid);

float_featureshort_feature建立向量索引,樣本如下。

ALTER TABLE vector ADD ANN INDEX idx_float_feature(float_feature);
ALTER TABLE vector ADD ANN INDEX idx_short_feature(short_feature);

查詢向量資料

您可以在查詢語句中加入距離計算函數,將實體關聯抽象成向量空間的距離。例如L2_DISTANCE

樣本

插入資料

已建好表vector後,在表中插入資料。

INSERT INTO vector (xid,cid,uid,vid,wid,short_feature,float_feature) VALUES (1,2,'A','B','C','[1,1,1,1]','[1.2,1.5,2,3.0]');
INSERT INTO vector (xid,cid,uid,vid,wid,short_feature,float_feature) VALUES (2,1,'e','v','f','[2,2,2,2]','[1.5,1.15,2.2,2.7]');
INSERT INTO vector (xid,cid,uid,vid,wid,short_feature,float_feature) VALUES (0,6,'d','f','g','[3,3,3,3]','[0.2,1.6,5,3.7]');
INSERT INTO vector (xid,cid,uid,vid,wid,short_feature,float_feature) VALUES (5,4,'j','b','h','[4,4,4,4]','[1.0,4.15,6,2.9]');
INSERT INTO vector (xid,cid,uid,vid,wid,short_feature,float_feature) VALUES (8,5,'Sj','Hb','Dh','[5,5,5,5]','[1.3,4.5,6.9,5.2]');
INSERT INTO vector (xid,cid,uid,vid,wid,short_feature,float_feature) VALUES (5,4,'x','g','h','[3,4,4,4]','[1.0,4.15,6,2.9]');
INSERT INTO vector (xid,cid,uid,vid,wid,short_feature,float_feature) VALUES (5,4,'j','r','k','[6,6,4,4]','[1.0,4.15,6,2.9]');
INSERT INTO vector (xid,cid,uid,vid,wid,short_feature,float_feature) VALUES (5,4,'s','i','q','[2,2,4,4]','[1.0,4.15,6,2.9]');

查詢資料

  • 查詢short_feature與向量'[1,1,1,1]'距離最近的3條記錄,按距離排序:

    SELECT xid, l2_distance(short_feature, '[1,1,1,1]') AS dis FROM vector ORDER BY 2 LIMIT 3;

    返回結果:

    +-------+--------------+
    | xid   |   dis        |
    +-------+--------------+
    | 1     |   0.0        |
    +-------+--------------+
    | 2     |   4.0        |
    +-------+--------------+
    | 0     |   16.0       |
    +-------+--------------+
  • 查詢xid為5且cid為4,short_feature與向量'[1,1,1,1]'距離最近的4條記錄,按距離排序:

    SELECT uid, l2_distance(short_feature, '[1,1,1,1]') AS dis FROM vector WHERE xid = 5 AND cid = 4 ORDER BY 2 LIMIT 4;

    返回結果:

    +-------+--------------+
    | uid   |   dis        |
    +-------+--------------+
    | s     |   20.0       |
    +-------+--------------+
    | x     |   31.0       |
    +-------+--------------+
    | j     |   36.0       |
    +-------+--------------+
    | j     |   68.0       |
    +-------+--------------+
  • 查詢short_feature與向量'[1,1,1,1]'距離最近的3條記錄,按距離排序,且距離不能超過50:

    SELECT uid, l2_distance(short_feature, '[1,1,1,1]') AS dis FROM vector WHERE l2_distance(short_feature, '[1,1,1,1]') < 50.0 AND xid = 5 ORDER BY 2 LIMIT 3;

    返回結果:

    +-------+---------------+
    | uid   |   dis         |
    +-------+---------------+
    | s     |   20.0        |
    +-------+---------------+
    | x     |   31.0        |
    +-------+---------------+
    | j     |   36.0        |
    +-------+---------------+