Generative AI アプリケーションから Azure Cosmos DB for NoSQL を使用してベクター検索を実行する
Azure Cosmos DB for NoSQL のベクター検索機能を Python ベースの Generative AI アプリケーションに統合すると、類似性検索を効率的に実行する Generative AI アプリケーションの能力が大幅に向上します。 ベクター検索を使用すると、ベクター埋め込みに基づいて意味的に類似した項目を取得できるため、Generative AI アプリケーションの自然言語処理タスクに最適です。 ベクター検索を使用することで、ジェネレーティブ AI アプリケーションは大規模なデータセットから関連情報をすばやく検索して取得し、正確でコンテキストに応じた関連データで応答を強化できます。 この機能は、より正確で意味のある支援を提供することで、ユーザー エクスペリエンスを向上させ、最終的には Generateive AI アプリケーションをよりインテリジェントかつ効果的なものにします。
ベクター検索とは
ベクター検索は、特定のプロパティまたはフィールドに完全に一致するのではなく、データ特性に基づいて項目を見つけ出す手法です。 ベクター検索では、完全一致を必要とするのではなく、ベクター表現に基づいて一致を識別できます。 この手法は、類似性検索を実行する場合に便利であり、大きなテキスト ブロック内の情報を検索する必要があるアプリケーションで有用です。
これは、独自のデータを大規模言語モデル (LLM) 応答に安全かつ効率的に統合できるようにすることで、Generative AI アプリケーションで頻繁に使用される取得拡張生成 (RAG) パターンの実装において重要な役割を果たします。これにより、Generative AI アプリケーションは機密情報の機密性と整合性を維持しながら、ドメイン固有の正確な回答を提供できます。
ベクトル検索に関する手順を理解する
Azure Cosmos DB for NoSQL でベクター検索を実行するには、次の手順を実行します。
- 類似性検索を実行するフィールドのベクター埋め込みを作成して格納します。
- コンテナーのベクター埋め込みポリシーでベクター埋め込みパスを指定します。
- 必要なベクトル インデックスをコンテナーのインデックス作成ポリシーに含めます。
- ベクター埋め込みを含むドキュメントをコンテナーに設定します。
- Azure OpenAI または別のサービスを使用して、検索クエリを表す埋め込みを生成します。
-
VectorDistance関数を使用してクエリを実行し、検索クエリの埋め込みの類似性と、Cosmos DB コンテナーに格納されているベクターの埋め込みの類似性を比較します。
VectorDistance 関数を使用してベクター検索を実行する
Azure Cosmos DB for NoSQL の VectorDistance 関数は、コサインの類似性、ドット積、ユークリッド距離などのメトリックを使用して距離を計算することで、2 つのベクトル間の類似性を測定します。 この関数は、自然言語処理やレコメンデーション システムなど、迅速かつ正確な類似性検索を必要とするアプリケーションに不可欠です。
VectorDistanceを利用することで、高次元ベクター クエリを効率的に処理し、AI 駆動型アプリケーションの関連性とパフォーマンスを大幅に向上させることができます。
たとえば、製品の説明を見て、自転車ペダルに関する製品を検索するとします。 まず、クエリ テキストの埋め込みを生成する必要があります。 この場合は、クエリ テキスト "clip-in pedals" の埋め込みを作成できます。ベクター検索クエリの VectorDistance 関数に検索クエリ テキストの埋め込みを指定すると、次のクエリのように、クエリと同様の製品を識別して取得できます。
SELECT TOP 5 c.name, c.description, VectorDistance(c.embedding, [1,2,3]) AS SimilarityScore
FROM c
ORDER BY VectorDistance(c.embedding, [1,2,3])
前の例は、類似性スコアをエイリアス SimilarityScore として投影し、最も類似度が低いものから最も類似していないものに並べ替える NoSQL クエリを示しています。
❗ ベクター検索を実行するときは、常に
TOP NクエリでSELECT句を使用する必要があります。 これを指定しないと、ベクター検索により多くの一致が返され、クエリのコストが増加し、必要以上に待ち時間が長くなります。
Python コードから Generative AI アプリケーションのベクター検索を実装すると、次のようになります。
# Create a Cosmos DB client
cosmos_client = CosmosClient(url=AZURE_COSMOSDB_ENDPOINT, credential=credential)
# Load the database
database = cosmos_client.get_database_client(DATABASE_NAME)
# Retrieve the container
container = database.get_container_client(CONTAINER_NAME)
# Function for generating embeddings using Azure OpenAI's text-embedding-3-small model
def generate_embeddings(text: str):
client = AzureOpenAI(
api_version = AZURE_OPENAI_API_VERSION,
azure_endpoint = AZURE_OPENAI_ENDPOINT,
azure_ad_token_provider = token_provider
)
response = client.embeddings.create(input = text, model = "text-embedding-3-small")
return response.data[0].embedding
def vector_search(query_embedding: list, num_results: int = 3, similarity_score: float = 0.25):
"""Search for similar product vectors in Azure Cosmos DB"""
results = container.query_items(
query = """
SELECT TOP @num_results p.name, p.description, p.sku, p.price, p.discount, p.sale_price, VectorDistance(p.embedding, @query_embedding) AS similarity_score
FROM Products p
WHERE VectorDistance(p.embedding, @query_embedding) > @similarity_score
ORDER BY VectorDistance(p.embedding, @query_embedding)
""",
parameters = [
{"name": "@query_embedding", "value": query_embedding},
{"name": "@num_results", "value": num_results},
{"name": "@similarity_score", "value": similarity_score}
],
enable_cross_partition_query = True
)
results = list(results)
formatted_results = [{'similarity_score': result.pop('similarity_score'), 'product': result} for result in results]
return formatted_results
# Get embeddings for search query text
query_embedding = generate_embeddings(query_text)
# Perform a vector search
results = vector_search(query_embedding, 3, 0.5)