矢量搜索 Amazon DocumentDB - Amazon DocumentDB

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

矢量搜索 Amazon DocumentDB

向量搜尋是機器學習中使用的一種方法,透過使用距離或相似度量來比較其向量表示法,藉此找出與指定資料點相似的資料點。向量空間中的兩個向量越接近,基礎項目被認為就越相似。這種技術有助於捕獲數據的語義含義。此方法適用於各種應用程式,例如推薦系統、自然語言處理和影像辨識。

Amazon DocumentDB 的向量搜尋結合了JSON基於文件資料庫的彈性和豐富的查詢功能,以及向量搜尋的強大功能。如果您想要使用現有的 Amazon DocumentDB 資料或靈活的文件資料結構來建立機器學習和生成 AI 使用案例 (例如語義搜尋體驗、產品推薦、個人化、聊天機器人、詐騙偵測和異常偵測),Amazon DocumentDB 向量搜尋是您的理想選擇。向量搜尋可在 Amazon DocumentDB 5.0 執行個體型叢集上使用。

插入向量

若要將向量插入 Amazon DocumentDB 資料庫中,您可以使用現有的插入方法:

範例

在下面的例子中,一個測試數據庫中的五個文檔的集合被創建。每個文件都包含兩個欄位:產品名稱及其對應的向量嵌入。

db.collection.insertMany([ {"product_name": "Product A", "vectorEmbedding": [0.2, 0.5, 0.8]}, {"product_name": "Product B", "vectorEmbedding": [0.7, 0.3, 0.9]}, {"product_name": "Product C", "vectorEmbedding": [0.1, 0.2, 0.5]}, {"product_name": "Product D", "vectorEmbedding": [0.9, 0.6, 0.4]}, {"product_name": "Product E", "vectorEmbedding": [0.4, 0.7, 0.2]} ]);

建立向量索引

Amazon DocumentDB 同時支援階層式可導覽小型世界 (HNSW) 索引和具有平面壓縮 (IVFFlat) 索引方法的反轉檔案。索IVFFlat引將向量隔離為列表,然後搜索那些最接近查詢向量的那些列表的選定子集。另一方面,HNSW索引會將向量資料組織成多層圖形。雖然建置時HNSW間較慢IVFFlat,但它提供了更好的查詢效能和回收。與HNSW此不同的是IVFFlat,不涉及任何訓練步驟,允許在沒有任何初始資料載入的情況下產生索引。對於大多數使用案例,我們建議使用索HNSW引類型進行向量搜尋。

如果您不建立向量索引,Amazon DocumentDB 會執行完全最近的鄰近搜尋,以確保完美回收。但是,在生產場景中,速度至關重要。我們建議使用矢量索引,這可能會交易一些回收以提高速度。重要的是要注意,添加向量索引可能會導致不同的查詢結果。

範本

您可以使用以下createIndexrunCommand模板在矢量字段上構建矢量索引:

Using createIndex

在某些驅動程式 (例如 mongosh 和 Java) 中,使用中的vectorOptions參數createIndex可能會導致錯誤。在這種情況下,我們建議使用runCommand

db.collection.createIndex( { "<vectorField>": "vector" }, { "name": "<indexName>", "vectorOptions": { "type": " <hnsw> | <ivfflat> ", "dimensions": <number_of_dimensions>, "similarity": " <euclidean> | <cosine> | <dotProduct> ", "lists": <number_of_lists> [applicable for IVFFlat], "m": <max number of connections> [applicable for HNSW], "efConstruction": <size of the dynamic list for index build> [applicable for HNSW] } } );
Using runCommand

在某些驅動程式 (例如 mongosh 和 Java) 中,使用中的vectorOptions參數createIndex可能會導致錯誤。在這種情況下,我們建議使用runCommand

db.runCommand( { "createIndexes": "<collection>", "indexes": [{ key: { "<vectorField>": "vector" }, vectorOptions: { type: " <hnsw> | <ivfflat> ", dimensions: <number of dimensions>, similarity: " <euclidean> | <cosine> | <dotProduct> ", lists: <number_of_lists> [applicable for IVFFlat], m: <max number of connections> [applicable for HNSW], efConstruction: <size of the dynamic list for index build> [applicable for HNSW] }, name: "myIndex" }] } );
參數 需求 資料類型 描述 數值

name

選擇性

string

指定索引的名稱。

英數字元

type

選擇性

指定索引的類型。

支持:高壓或常見

預設值:HNSW(引擎修補程式 3.0.4574 之後)

dimensions

必要

integer

指定向量資料中的維度數。

最多可容納 2,000 個維度。

similarity

必要

string

指定用於相似度計算的距離公制。

  • euclidean

  • cosine

  • dotProduct

lists

所需 IVFFlat

integer

指定IVFFlat索引用來群組向量資料的叢集數目。建議的設定是最多 1M 文件和sqrt(# of documents)超過 1M 文件的文件數量 /1000。

下限:1

最大值:請參閱下功能和限制方每個執行個體類型表格的清單。

m

選擇性

integer

指定HNSW索引的最大連接數

預設:16

範圍

efConstruction

選擇性

integer

指定用於構造HNSW索引圖形的動態候選列表的大小。

efConstruction必須大於或等於 (2* m)

預設:64

範圍

lists請務必HNSW適當地設定子參數的值,例如 to IVFFlat m 和 to,因為這會影響搜efConstruction尋的準確度/回收、建置時間和效能。較高的清單值會增加查詢的速度,因為它會減少每個清單中的向量數目,從而產生較小的區域。但是,較小的區域大小可能會導致更多的召回錯誤,從而導致較低的精度。對於HNSW,增加的值mefConstruction增加準確度,但也會增加索引建立時間和大小。請參閱以下範例:

範例

HNSW
db.collection.createIndex( { "vectorEmbedding": "vector" }, { "name": "myIndex", "vectorOptions": { "type": "hnsw", "dimensions": 3, "similarity": "euclidean", "m": 16, "efConstruction": 64 } } );
IVFFlat
db.collection.createIndex( { "vectorEmbedding": "vector" }, { "name": "myIndex", "vectorOptions": { "type": "ivfflat", "dimensions": 3, "similarity": "euclidean", "lists":1 } } )

取得索引定義

您可以使用以下getIndexes命令檢視索引的詳細資訊,包括向量索引:

範例

db.collection.getIndexes()

範例輸出

[ { "v" : 4, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.collection" }, { "v" : 4, "key" : { "vectorEmbedding" : "vector" }, "name" : "myIndex", "vectorOptions" : { "type" : "ivfflat", "dimensions" : 3, "similarity" : "euclidean", "lists" : 1 }, "ns" : "test.collection" } ]

查詢向量

向量查詢範本

使用下列範本查詢向量:

db.collection.aggregate([ { $search: { "vectorSearch": { "vector": <query vector>, "path": "<vectorField>", "similarity": "<distance metric>", "k": <number of results>, "probes":<number of probes> [applicable for IVFFlat], "efSearch":<size of the dynamic list during search> [applicable for HNSW] } } } ]);
參數 需求 Type 描述 數值

vectorSearch

必要

operator

裡面使用 $ 搜索命令來查詢向量。

vector

必要

陣列

指出將用來尋找類似向量的查詢向量。

path

必要

string

定義向量欄位的名稱。

k

必要

integer

指定搜尋傳回的結果數目。

similarity

必要

string

指定用於相似度計算的距離公制。

  • euclidean

  • cosine

  • dotProduct

probes

選擇性

integer

要向量搜尋檢查的叢集數目。較高的值以速度代價提供更好的召回效果。它可以設置為列表的數量,以進行確切的最近鄰搜索(此時計劃器將不會使用索引)。開始微調的建議設定為。sqrt(# of lists)

預設:1

efSearch

選擇性

integer

指定索HNSW引在搜尋期間使用的動態候選清單的大小。較高的值會以速度代價efSearch提供更好的回收效果。

預設:40

範圍

微調 efSearch (HNSW) 或 probes (IVFlat) 的值以達到所需的效能和準確度非常重要。請參閱下列範例作業:

HNSW
db.collection.aggregate([ { $search: { "vectorSearch": { "vector": [0.2, 0.5, 0.8], "path": "vectorEmbedding", "similarity": "euclidean", "k": 2, "efSearch": 40 } } } ]);
IVFFlat
db.collection.aggregate([ { $search: { "vectorSearch": { "vector": [0.2, 0.5, 0.8], "path": "vectorEmbedding", "similarity": "euclidean", "k": 2, "probes": 1 } } } ]);

範例輸出

此操作的輸出如下所示:

{ "_id" : ObjectId("653d835ff96bee02cad7323c"), "product_name" : "Product A", "vectorEmbedding" : [ 0.2, 0.5, 0.8 ] } { "_id" : ObjectId("653d835ff96bee02cad7323e"), "product_name" : "Product C", "vectorEmbedding" : [ 0.1, 0.2, 0.5 ] }

功能和限制

版本相容性

  • Amazon DocumentDB 的向量搜索僅適用於基於 Amazon DocumentDB 5.0 執行個體的集群。

向量

  • Amazon DocumentDB 可以索引多達 2,000 個維度的向量。但是,最多可以在沒有索引的情況下存儲 16,000 個維度。

索引

  • 對於建立IVFFlat索引,清單參數的建議設定為最多 1M 文件和sqrt(# of documents)超過 1M 文件的文件數 /1000。由於工作記憶體限制,Amazon DocumentDB 支援清單參數的特定最大值,具體取決於維度的數目。下表提供了 500、1000 和 2,000 維向量的列表參數的最大值,供您參考:

    執行個體類型 具有 500 個維度的清單 具有 1000 個維度的清單 具有 2000 個維度的清單

    t3.

    372

    257

    150

    R5.l

    915

    741

    511

    R5.xl

    1,393

    1,196

    901

    r5.2xl

    5,460

    5,230

    4,788

    r5.4xl

    7,842

    7,599

    7,138

    r5.8xl

    11,220

    10,974

    10,498

    r5.12xl

    13,774

    13,526

    13,044

    r5.16xl

    15,943

    15,694

    15,208

    r5.24xl

    19,585

    19,335

    18,845

  • 向量索引不支援其他索引選項compound,例如sparsepartial

  • 索引不支援並行索HNSW引建置。它僅支持索IVFFlat引。

向量查詢

  • 對於向量搜尋查詢,請務必微調參數,例如probes或以efSearch取得最佳結果。probesefSearch參數的值越高,回收越高,速度也越低。開始微調探棒參數的建議設定為sqrt(# of lists)

最佳實務

了解在 Amazon DocumentDB 中使用向量搜尋的最佳實務。在新最佳實務確定時,會不斷更新此小節。

  • 具有扁平壓縮的反向文件(IVFFlat)索引創建涉及聚類和組織基於相似之處的數據點。因此,為了使索引更有效,我們建議您在創建索引之前至少加載一些數據。

  • 對於向量搜尋查詢,請務必微調參數,例如probes或以efSearch取得最佳結果。probesefSearch參數的值越高,回收越高,速度越低。開始微調probes參數的建議設置為sqrt(lists)

資源