Generative AI アプリケーションから Azure Cosmos DB for NoSQL を使用してベクター検索を実行する

完了

Azure Cosmos DB for NoSQL のベクター検索機能を Python ベースの Generative AI アプリケーションに統合すると、類似性検索を効率的に実行する Generative AI アプリケーションの能力が大幅に向上します。 ベクター検索を使用すると、ベクター埋め込みに基づいて意味的に類似した項目を取得できるため、Generative AI アプリケーションの自然言語処理タスクに最適です。 ベクター検索を使用することで、ジェネレーティブ AI アプリケーションは大規模なデータセットから関連情報をすばやく検索して取得し、正確でコンテキストに応じた関連データで応答を強化できます。 この機能は、より正確で意味のある支援を提供することで、ユーザー エクスペリエンスを向上させ、最終的には Generateive AI アプリケーションをよりインテリジェントかつ効果的なものにします。

ベクター検索は、特定のプロパティまたはフィールドに完全に一致するのではなく、データ特性に基づいて項目を見つけ出す手法です。 ベクター検索では、完全一致を必要とするのではなく、ベクター表現に基づいて一致を識別できます。 この手法は、類似性検索を実行する場合に便利であり、大きなテキスト ブロック内の情報を検索する必要があるアプリケーションで有用です。

ベクトル検索を実行するフロー図。受信メッセージがベクター化され、ベクター ストアと比較された後、完了応答の生成のために LLM プロンプトに追加されることを示します。

これは、独自のデータを大規模言語モデル (LLM) 応答に安全かつ効率的に統合できるようにすることで、Generative AI アプリケーションで頻繁に使用される取得拡張生成 (RAG) パターンの実装において重要な役割を果たします。これにより、Generative AI アプリケーションは機密情報の機密性と整合性を維持しながら、ドメイン固有の正確な回答を提供できます。

Azure Cosmos DB for NoSQL でベクター検索を実行するには、次の手順を実行します。

  1. 類似性検索を実行するフィールドのベクター埋め込みを作成して格納します。
  2. コンテナーのベクター埋め込みポリシーでベクター埋め込みパスを指定します。
  3. 必要なベクトル インデックスをコンテナーのインデックス作成ポリシーに含めます。
  4. ベクター埋め込みを含むドキュメントをコンテナーに設定します。
  5. Azure OpenAI または別のサービスを使用して、検索クエリを表す埋め込みを生成します。
  6. 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)