Azure AI SearchとAzure OpenAIを利用したベクトル検索の実施

Azure AI Searchではベクトル検索の機能が利用できますが、プログラム経由で検索を行うためにテキストをそのまま渡してもベクトル検索が行えませんでした。

本記事では、プログラム経由でベクトル検索を行う手順を紹介します。

前提条件

以下の環境で実施いたしました。

  • Azure OpenAIリソースを作成し、「text-embedding-ada-002」をデプロイ
  • Azure AI Searchリソースを作成し、ベクトル検索を有効化したインデックスの作成(ベクター化は上記モデルで実施)
  • C# .Net 8

ベクトル検索実施手順

作業概要

作業は以下の手順で実施します。

  1. コンソールアプリプロジェクトの作成
  2. 必要なパッケージのインストール
  3. 検索文字列のベクター化
  4. ベクトル検索

コンソールアプリプロジェクトの作成

コンソールアプリプロジェクトの作成を行います。

作成の際は.Net 8.0のバージョンを指定してください。

必要なパッケージのインストール

Visual Studioを使用している方はNuGetパッケージマネージャを使用し以下のパッケージのインストールしてください。

Visual Studioを使用していない方はコマンド経由で以下のパッケージをインストールしてください。

  • Azure.AI.OpenAI 1.0.0-beta.14
  • Azure.Search.Documents 11.5.1

検索文字列のEmbbeding

まずは検索したい文字列をAzure Open AIに渡し、文字列のEmbeddingを実施します。

using Azure;
using Azure.AI.OpenAI;

// Azure OpenAIの接続情報
var openAiEndpoint = @"https://XXXXXXXXXXXXXXXX.openai.azure.com/";
var openAiApiKey = @"XXXXXXXXXXXXXX";
var openAiModel = @"XXXXXXXXXXX";

// 検索文字列
var text = "体育会の日時は?";

// Azure OpenAIの接続
var openAiClient = new OpenAIClient(new Uri(openAiEndpoint), new AzureKeyCredential(openAiApiKey));

// Embeddingの設定
EmbeddingsOptions embeddingOptions = new()
{
    DeploymentName = openAiModel,
    Input = { text },
};
// Embeddingの実施
var result = await openAiClient.GetEmbeddingsAsync(embeddingOptions);


var embeddings = result.Value.Data[0].Embedding.ToArray();

実行するとEmbeddingの結果が返ってきます。

Embedding結果

ベクトル検索

文字列をEmbeddingできたため、この情報を使って実際に検索を行います。

なお、Embeddingの結果はembeddings変数に格納されています。

// Azure AI Searchの接続情報
var cognitiveSearchEndpoint = @"https://XXXXXXXXXXXXX.search.windows.net";
var cognitiveSearchApiKey = @"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
var cognitiveSearchIndexName = @"XXXXXXXXXXXXXXXXXXXXXXXX";

// Azure AI Searchの接続
var cognitiveSearchClient = new SearchClient(new Uri(cognitiveSearchEndpoint), cognitiveSearchIndexName, new AzureKeyCredential(cognitiveSearchApiKey));

// 検索オプション
var searchOptions = new SearchOptions
{
    VectorSearch = new()
    {
        // クエリの設定
        // Fieldsには、実際にIndexのベクトル情報が格納されたフィールド名を指定する。
        Queries = { new VectorizedQuery(embeddings.ToArray()) { KNearestNeighborsCount = 3, Fields = { "vector" } } }
    },
    // 取得件数を指定
    Size = 2,
};

// 検索実施
SearchResults<SearchDocument> response = await cognitiveSearchClient.SearchAsync<SearchDocument>(null, searchOptions);

// 検索結果を表示する。
await foreach (SearchResult<SearchDocument> searchresult in response.GetResultsAsync())
{
    Console.WriteLine($"Title: {searchresult.Document["title"]}");
    Console.WriteLine($"Score: {searchresult.Score}\n");
    Console.WriteLine($"Content: {searchresult.Document["chunk"]}");
}

実行すると検索結果が表示されます。

体育会と検索しているのに運動会の情報がちゃんと取得できているため、ベクトル検索の便利さがわかりますね。

検索結果

おわりに

Azure AI Searchのベクトル検索をC#で実施する方法を紹介しました。

参考にさせていただきましたプログラムは以下の公式サンプルになります。

github.com

こちらのサンプルでは他にもドキュメントのベクトル化手法が記載されていますので、もし興味がある方は見てみてください。

執筆担当者プロフィール
酒巻 芳輝

酒巻 芳輝(日本ビジネスシステムズ株式会社)

Data&AIプラットフォーム部 主にAzure OpenAIやAzure AI Search、Graph APIを利用した開発を行っています。

担当記事一覧