

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

# 查詢向量
<a name="s3-vectors-query"></a>

您可以使用 [QueryVectors](https://docs.aws.amazon.com/AmazonS3/latest/API/API_S3VectorBuckets_QueryVectors.html) API 操作執行相似度查詢，其中可指定查詢向量、要傳回的相關結果數目 (top K 最近鄰的)，以及索引 ARN。此外，您可以在查詢中使用中繼資料篩選條件，以僅搜尋符合篩選條件的向量。如果您請求對不可篩選的中繼資料欄位進行篩選，請求將傳回 `400 Bad Request` 錯誤。如需有關中繼資料篩選的詳細資訊，請參閱 [中繼資料篩選](s3-vectors-metadata-filtering.md)。

在回應中，依預設會傳回向量索引鍵。您可以選擇在回應中包含距離和中繼資料。

產生查詢向量時，您應該使用可用來產生儲存在向量索引中初始向量的相同向量嵌入模型。例如，若您在 Amazon Bedrock 中使用 Amazon Titan 文本嵌入 V2 模型來產生文件的向量嵌入，請使用相同的嵌入模型將問題轉換為查詢向量。此外，Amazon Bedrock 知識庫提供全託管端對端 RAG 工作流程，其中 Amazon Bedrock 會自動從 S3 資料來源擷取資料、將內容轉換為文字區塊、產生嵌入，然後將其儲存在向量索引中。接著您可以查詢知識庫，並根據從來源資料擷取的區塊產生回應。如需有關如何在主控台從 Amazon Bedrock 知識庫查詢向量的詳細資訊，請參閱 [(選用) 整合 S3 Vectors 與 Amazon Bedrock 知識庫](s3-vectors-getting-started.md#s3-vectors-bedrock-kb-tutorial)。

此外，開放原始碼 Amazon S3 Vectors Embed CLI 工具會提供從命令列執行語義搜尋的簡化方法。此開放原始碼工具透過使用 Amazon Bedrock 基礎模型處理向量嵌入產生，並根據 S3 向量索引執行語義搜尋操作，簡化查詢程序。如需有關使用此工具查詢向量資料的詳細資訊，請參閱 [使用 `s3vectors-embed-cli` 建立向量嵌入和執行語義搜尋](s3-vectors-cli.md)。

S3 Vectors 為冷查詢提供一秒的回應時間，利用 Amazon S3 彈性輸送量來有效搜尋數百萬個向量。這讓具有不常查詢的工作負載具有高成本效益。對於暖查詢，S3 Vectors 可以提供低至 100 毫秒的回應時間，使具有重複或頻繁查詢模式的工作負載受益。

為了執行向量嵌入的相似度查詢，數個因素可能會影響平均取回效能，包括向量嵌入模型、向量資料集的大小 (向量和維度的數量)，以及查詢的分佈。S3 Vectors 可為大多數資料集提供 90% 以上的平均取回率。平均取回率會測量查詢結果的品質。90% 的平均取回率表示回應包含 90% 的實際最接近向量 (基本事實)，這些向量儲存在相對於查詢向量的向量索引中。不過，由於實際效能可能會因您的特定使用案例而有所不同，建議您使用具代表性資料和查詢進行自己的測試，以驗證 S3 Vectors 是否符合您的取回要求。

## 使用 AWS SDKs
<a name="querty-vectors-sdk"></a>

------
#### [ SDK for Python ]

```
# Query a vector index with an embedding from Amazon Titan Text Embeddings V2.
import boto3 
import json 

# Create Bedrock Runtime and S3 Vectors clients in the AWS Region of your choice. 
bedrock = boto3.client("bedrock-runtime", region_name="us-west-2")
s3vectors = boto3.client("s3vectors", region_name="us-west-2") 

# Query text to convert to an embedding. 
input_text = "adventures in space"

# Generate the vector embedding.
response = bedrock.invoke_model(
    modelId="amazon.titan-embed-text-v2:0",
    body=json.dumps({"inputText": input_text})
) 

# Extract embedding from response.
model_response = json.loads(response["body"].read())
embedding = model_response["embedding"]

# Query vector index.
response = s3vectors.query_vectors(
    vectorBucketName="media-embeddings",
    indexName="movies",
    queryVector={"float32": embedding}, 
    topK=3, 
    returnDistance=True,
    returnMetadata=True
)
print(json.dumps(response["vectors"], indent=2))

# Query vector index with a metadata filter.
response = s3vectors.query_vectors(
    vectorBucketName="media-embeddings",
    indexName="movies",
    queryVector={"float32": embedding}, 
    topK=3, 
    filter={"genre": "scifi"},
    returnDistance=True,
    returnMetadata=True
)
print(json.dumps(response["vectors"], indent=2))
```

------