

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

# 在 DynamoDB 中使用向量索引
<a name="VectorSearch"></a>

向量索引是 Amazon DynamoDB 中的一種索引類型，可在資料表項目中存放的向量內嵌上啟用相似性搜尋。與使用 和 `Query``Scan`操作支援完全相符和範圍查詢的全域次要索引和本機次要索引不同，向量索引使用近似接近的鄰 (ANN) 搜尋來尋找其向量最類似於您提供的查詢向量的項目。您可以透過呼叫 [SearchVectors](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_SearchVectors.html) API 來執行這些相似性搜尋，該 API 會傳回依相似性分數排名的最相似項目。

使用向量索引，您可以將向量內嵌與操作資料一起存放在 DynamoDB 中，並執行相似性搜尋，而不需要單獨的向量資料庫。這樣就不需要在 DynamoDB 和外部向量存放區之間進行複雜的資料複寫管道。

向量索引會透過您已使用的相同 `CreateTable`和 `UpdateTable` API 進行管理，並使用 `VectorIndexes` 參數 （適用於 `CreateTable`) 和 `VectorIndexUpdates` 參數 （適用於 `UpdateTable`)。 APIs 

**Topics**
+ [向量索引的使用案例](#VectorSearch.UseCases)
+ [比較向量索引與次要索引](#VectorSearch.WhatAre)
+ [距離函數](#VectorSearch.DistanceFunctions)
+ [距離函數如何排名結果](#VectorSearchWorkingWith.Ranking)
+ [SearchSchema](#VectorSearch.SearchSchema)
+ [投影](#VectorSearch.Projections)
+ [搭配其他 DynamoDB 功能使用向量索引](#VectorSearch.FeatureInteractions)
+ [建立和搜尋向量索引](VectorSearchWorkingWith.md)
+ [要求與限制](VectorSearch.Requirements.md)
+ [安全性和存取控制](VectorSearch.Security.md)
+ [教學課程：您的第一個向量搜尋](VectorSearchTutorial.md)
+ [資料表和向量索引之間的資料同步](VectorSearchDataSync.md)
+ [向量索引的最佳實務](VectorSearchBestPractices.md)
+ [向量索引的儲存考量](VectorSearchStorage.md)
+ [監控向量索引容量](VectorSearchMonitoring.md)
+ [向量索引疑難排解](VectorSearchTroubleshooting.md)
+ [搭配全域資料表使用向量索引](VectorSearchGlobalTables.md)

## 向量索引的使用案例
<a name="VectorSearch.UseCases"></a>

向量索引支援各種使用案例，這些案例涉及根據向量表示法尋找類似的項目：
+ **語意搜尋** – 建置搜尋引擎，了解查詢的意義，而非相符的關鍵字。儲存機器學習模型產生的文字內嵌，並尋找語意相似的內容。
+ **擷取增強生成 (RAG)** – 將大型語言模型 (LLMs) 與相關知識庫連線。將文件內嵌儲存在 DynamoDB 中，並擷取 LLM 提示最相關的內容。
+ **建議系統** – 根據其功能或行為的向量表示來尋找類似的產品、內容或使用者。
+ **AI 代理程式記憶體** – 儲存對話內嵌，以維護工作階段之間的內容並改善 AI 代理程式效能。
+ **異常和詐騙偵測** – 將新事件與已知正常行為的內嵌進行比較，以標記極端值，例如異常交易或詐騙活動。

## 比較向量索引與次要索引
<a name="VectorSearch.WhatAre"></a>

下表比較向量索引與全域次要索引和本機次要索引。


| 功能 | 向量索引 | 全域次要索引 | 本機次要索引 | 
| --- | --- | --- | --- | 
| 查詢類型 | 相似性搜尋 | 完全相符和範圍 | 完全相符和範圍 | 
| 讀取 API | SearchVectors | Query, Scan | Query, Scan | 
| 結構描述 | 向量屬性，加上選用的 SearchSchema （分割區索引鍵、內嵌篩選條件） | 分割區索引鍵 (s) 和選用排序索引鍵 (s) | 相同的分割區索引鍵、不同的排序索引鍵 | 
| 每個資料表的上限 | 5 | 20 | 5 | 
| 容量模式 | 僅限隨需 | 隨需或佈建 | 隨需或佈建 | 

## 距離函數
<a name="VectorSearch.DistanceFunctions"></a>

建立向量索引時，您可以選擇距離函數。距離函數決定 DynamoDB 如何測量向量之間的相似性。您的選擇會影響排名品質和搜尋準確性。Amazon DynamoDB 支援三個距離函數。


| 距離函數 | 分數解釋 | 最佳相符項目 | 
| --- | --- | --- | 
| COSINE | 分數越低表示相似度越高。測量兩個向量之間的餘弦距離 (1 減去餘弦相似性）。值範圍從 0 （相同方向） 到 2 （反方向）。 | 最小分數 | 
| DOT\_PRODUCT | 分數越高表示相似性越高。測量兩個向量之間的點積。 | 最高分數 | 
| EUCLIDEAN | 分數越低表示相似度越高。測量兩個向量之間的直線距離。 | 最小分數 | 

若要比較距離函數如何排名相同的查詢向量，請參閱 [距離函數如何排名結果](#VectorSearchWorkingWith.Ranking)。

下列指引可協助您為工作負載選擇正確的距離函數。

`COSINE`  
比較方向並忽略大小。`COSINE` 使用 與文字內嵌模型的語意相似性。這些模型編碼方向的意義，向量長度可能會有所不同。範例包括 Amazon Titan Text Embeddings 和 Cohere Embed。  
`COSINE` 非常適合下列使用案例：  
+ 對產品描述或文件進行語意搜尋
+ 檢索增強生成 (RAG)
+ 常見問答集比對
`COSINE` 當您不確定要使用哪個 函數時， 是安全的預設值。

`DOT_PRODUCT`  
`DOT_PRODUCT` 對方向和大小 （向量的長度） 都很敏感。選擇何時`DOT_PRODUCT`內嵌模型的文件建議點產品作為相似度量，或何時您希望向量長度影響排名。  
`DOT_PRODUCT` 非常適合下列使用案例：  
+ 使用熱門度或可信度分數來擴展內嵌和影響排名的建議系統
+ 文件特別建議點產品做為相似度測量的模型
+ 向量長度帶有有意義的訊號的幅度敏感排名
我們建議您將內嵌標準化為單位長度。標準化時， `DOT_PRODUCT` 會將結果排名與 相同`COSINE`。只有在您希望程度影響排名時，才略過標準化。  
範例使用案例：產品建議系統，您可以在其中依其熱門度分數擴展每個產品內嵌。更熱門的產品會取得較長的向量，並在搜尋結果中排名更高。

`EUCLIDEAN`  
測量兩個向量之間的直線距離。 對大小`EUCLIDEAN`很敏感。當內嵌空間中的絕對位置很重要時，請使用它。  
`EUCLIDEAN` 非常適合下列使用案例：  
+ 空間距離很重要的影像或音訊內嵌
+ 近乎重複的偵測
+ 叢集和異常偵測
範例使用案例：從映像內嵌尋找近乎重複的映像。

**選擇符合您內嵌模型的距離函數**  
如果您不確定要使用哪個函數，請檢查內嵌模型的文件。根據代表性資料集驗證您的選擇。您無法在建立索引後變更距離函數。如需詳細資訊，請參閱[將距離函數與您的內嵌相符](VectorSearchBestPractices.md#VectorSearchBestPractices.DistanceFunction)。

## 距離函數如何排名結果
<a name="VectorSearchWorkingWith.Ranking"></a>

您在建立索引時選擇的距離函數會同時決定結果`Score`的值和排序順序。相同的查詢可以在不同的距離函數下以不同的方式排序相同的項目。下列範例針對`[1, 0, 0, 0]`四個預存向量使用查詢向量。


| 存放的向量 | `COSINE` （較低更相似） | `EUCLIDEAN` （較低更相似） | `DOT_PRODUCT` （越高越類似） | 
| --- | --- | --- | --- | 
| [1, 0, 0, 0] | 0.0 | 0.0 | 1.0 | 
| [10, 0, 0, 0] | 0.0 | 9.0 | 10.0 | 
| [0.7071, 0.7071, 0, 0] | 0.29 | 0.77 | 0.71 | 
| [-1, 0, 0, 0] | 2.0 | 2.0 | -1.0 | 

有兩個值得注意的行為：
+ `COSINE` 會忽略大小。它分數`[1, 0, 0, 0]`和`[10, 0, 0, 0]`相同 （兩者 `0.0`)，因為它們指向相同的方向。 `EUCLIDEAN` 會針對相同的查詢排名`[10, 0, 0, 0]`最後一個，因為它測量絕對距離，隨著向量的幅度而增加。
+ `DOT_PRODUCT` 分數可以是負數。指向相反方向 (`[-1, 0, 0, 0]`) 分數 的向量`-1.0`。當您排序或套用閾值至結果時，請勿假設分數一律非負數。

## SearchSchema
<a name="VectorSearch.SearchSchema"></a>

建立向量索引時，您可以選擇定義 SearchSchema，以指定向量索引分割區索引鍵和內嵌篩選條件屬性。

`HASH` （向量索引分割區索引鍵）  
向量索引分割區索引鍵會分割索引資料以進行獨立擴展。當您指定向量索引分割區索引鍵時，具有相同分割區索引鍵值的項目會一起存放，這可讓系統僅搜尋相關資料。在大規模的情況下，這可降低搜尋延遲，因為搜尋只會檢查向量空間的子集，而不是整個索引。使用具有low-to-medium基數的屬性，例如 `Category`或 `Country`。您最多可以指定一個向量索引分割區索引鍵。  
如果您在 SearchSchema 中定義向量索引分割區索引鍵，您必須在呼叫 `SearchConditionExpression`時在 中提供其值`SearchVectors`。  
**使用分割區索引鍵來擴展搜尋輸送量**  
當您預期有大型索引或高搜尋量時，請定義向量索引分割區索引鍵。由於每個`SearchVectors`呼叫的範圍都是單一分割區索引鍵值，因此將資料分散到多個分割區索引鍵值，可讓您每秒執行更多搜尋操作，並減少每次搜尋檢查的資料量。請參閱 [選擇符合您查詢模式的分割區索引鍵](VectorSearchBestPractices.md#VectorSearchBestPractices.PartitionKey)。

`INLINE_FILTER`  
內嵌篩選條件屬性投影到向量索引中，以便 DynamoDB 在儲存層搜尋期間進行篩選。  
內嵌篩選條件支援 中的等式運算子 (`=`)`SearchConditionExpression`。尚未提供比較、範圍和設定成員運算子 (`<>`、`<`、`<=``>`、`>=`、`IN`)。與向量索引分割區索引鍵不同，內嵌篩選條件在搜尋期間是選用的。

您可以在 SearchSchema 中建立向量索引而不定義分割區索引鍵。在此情況下，每次`SearchVectors`呼叫都會搜尋整個索引。這比較簡單，因為您不需要 `SearchConditionExpression`，但不需要水平擴展。隨著索引的增長，每個搜尋都會檢查更多資料，增加延遲和成本。如果您的工作負載需要高輸送量，或您的索引包含大量向量，請定義分割區索引鍵以跨分割區分配資料並獨立擴展。請參閱 [選擇符合您查詢模式的分割區索引鍵](VectorSearchBestPractices.md#VectorSearchBestPractices.PartitionKey)。

## 投影
<a name="VectorSearch.Projections"></a>

與全域次要索引一樣，向量索引支援投影，控制從基礎資料表複製到索引的屬性。您可以在建立向量索引時指定投影。
+ `KEYS_ONLY` — 只有基本資料表主索引鍵屬性、向量屬性和 SearchSchema 中定義的任何內嵌篩選條件屬性會投影到索引中。
+ `INCLUDE` — 除了`KEYS_ONLY`屬性之外，您還可以指定要投影的其他非金鑰屬性。向量索引建立後，您無法變更包含的屬性集。若要投影不同的屬性集，請刪除索引，然後使用您想要的投影重新建立索引。
+ `ALL` — 基礎資料表中的所有屬性都會投影到索引中。

**投影會限制 SearchVectors 可以傳回的內容**  
未在向量索引中投影的屬性無法在`SearchVectors`回應中傳回。如果您需要搜尋結果中的特定屬性，請在投影中包含它們或使用 `ALL`。

## 搭配其他 DynamoDB 功能使用向量索引
<a name="VectorSearch.FeatureInteractions"></a>

DynamoDB Streams  
您可以在具有向量索引的資料表上啟用 DynamoDB Streams，在建立資料表時或透過 使用 `StreamSpecification` 參數`UpdateTable`。串流會擷取基底資料表的項目層級變更，並獨立於向量索引運作。

全域資料表  
您可以將向量索引新增至全域資料表，也可以使用 新增複本，將具有向量索引的資料表轉換為全域資料表`UpdateTable`。向量索引定義，包括其維度、距離函數、SearchSchema 和投影，會自動複寫到每個新的複本區域。您不會在複本區域中單獨建立向量索引。  
您在任何複本區域中撰寫的項目都會複寫到其他區域，並在該區域編製索引。複寫完成後，`SearchVectors`每個區域中都會搜尋相同的一組向量。由於向量搜尋使用近似最接近的鄰 (ANN)，因此不同區域中的個別搜尋可能會傳回略有不同的結果或相同查詢的排序，即使超過相同的資料也一樣。其他區域中向量的複寫和索引是非同步的，即使是多區域強式一致性 (MRSC) 全域資料表也是如此。在變更傳播之前，您剛在一個區域中撰寫的向量可能尚未出現在另一個區域中`SearchVectors`的結果中。  
**需要隨需容量**  
向量索引需要隨需容量模式，而全域資料表也支援這些模式。在已使用隨需容量的資料表上建立向量索引和複本。

Point-in-time(PITR) 和備份  
當您從point-in-time復原或隨需備份還原資料表時，DynamoDB 會還原基礎資料表資料和向量索引定義。如同全域次要索引，DynamoDB 會從還原的基礎資料表資料重建向量索引，而不是將其複製byte-for-byte，因此索引會在準備好進行搜尋之前進行回填。等到 `Backfilling` `IndexStatus`處於還原的索引`false`上`ACTIVE`， 才會執行 `SearchVectors`。

存留時間 (TTL)  
您可以在具有向量索引的資料表上使用 DynamoDB TTL。當 TTL 從基礎資料表刪除過期項目時，DynamoDB 會從向量索引移除對應的項目，就像手動刪除一樣。因此，過期項目會在刪除傳播到索引之後停止顯示`SearchVectors`結果。

匯入和匯出資料表資料  
您可以將具有向量索引的資料表匯出至 Amazon S3；匯出包含基礎資料表項目，包括存放在其中的向量屬性。當您將資料從 Amazon S3 匯入新資料表時，請在匯入請求中定義向量索引，就像使用 一樣`CreateTable`。DynamoDB 會在匯入項目寫入時編製索引，並在匯入完成後提供向量索引。

DAX  
DynamoDB Accelerator (DAX) 不支援 `SearchVectors`操作。將`SearchVectors`請求直接傳送至 DynamoDB，即使您的應用程式使用 DAX 進行其他讀取操作。基底資料表讀取的 DAX 快取不受向量索引的存在影響。