Azure AI Searchで垂直統合されたベクトル検索を試す

こんにちは。

弊社でもAIの利用、導入に向けて研究や開発案件に取り組んでいる最中なのですが、今日はそこで試した小ネタを紹介します。

垂直統合されたベクトル検索とは

Azure AI Searchのインデックスにベクタライザを設定することにより、アプリケーション側でベクトル化をしなくてもAI Searchによってベクトル化が可能になります。

イメージ図

必要なもの

  • Azure OpenAI リソース *1

  • Azure OpenAIに組み込みモデルがデプロイされていること

    text-embedding-3-small を利用しました。

  • Azure AI Search リソース

  • ベクトルストアに投入する適当な(ライセンスフリーの)テキストコーパスデータ

    青空文庫から夏目漱石の坊っちゃんを利用させていただきました。

AI Search にインデックスを作る

文章のチャンクとそのベクトルを保存するため、以下のフィールドをインデックスに定義します。 ベクトル値そのものを取得できる必要はないため、今回は取得可能をOFFにしています。 チャンク文字列では検索できないようにしているところに注目してください。

このうち、垂直統合されたvectorフィールドの定義方法を次項以降に説明します。

フィールド名 種類 取得可能 フィルター可能 並べ替え可能 Facetable 検索可能
id String
chunk String
vector SingleCollection

ベクトルインデックスフィールドの定義

Azureポータルでのインデックス定義UIがわかりづらく、フィールドをベクトル列と定義するには、種類から Collection(Edm.Single) を選択する必要があります。(文字列や数値と同じ並びの中から)

これで次元数や検索アルゴリズムなど詳細な設定が可能になります。 ここはUIを改善してもらえるといいと思いますね。


text-embedding-3-small の次元数のとおりディメンションに1536と入力し、検索プロファイルの作成を押すとベクトルプロファイルの構成に遷移します。

アルゴリズムはHNSW (Hierarchical Navigable Small World) と網羅的 k-近傍 (ExhaustiveKNN) が選べますが、今回の記事ではどちらでもよいため、HNSWで設定しています。キャプチャは省略します。

ベクトル化の作成を押すと、右の設定項目が表示されます。

準備済みのOpen AIリソースと組み込みモデルを選択して、システム割り当てのManagedIDで認証を行います。

以上でベクトルインデックスの定義が完了します。

ManagedIDの有効化とロール割り当て

AI Searchリソースの システム割り当てID を有効にします。

Open AIリソースのIAMで、AI Searchで有効にしたManagedIDに対して Cognitive Services OpenAI User のロールを付与します。

ベクトル化したチャンクのアップロード

作品をspaCyで日本語モデルを使ってチャンクに分割し、text-embedding-3-small でベクトル化して、AI Searchのインデックスにアップロードしました。記事の本旨は検索であるため、このプログラムについては省略します。

未検証ですが、AI SearchのインデクサーにOpen AI Embeddingスキルが利用できるようなので、プログラムを組まなくてもアップロードできそうです。ただし、その場合はチャンク化のアルゴリズムについては選択肢が限定されるかもしれません。

Rest APIで検索をしてみる

api-versionを2024-07-01にして、テキスト指定のベクトルクエリをPOSTします。

赤シャツに関連するチャンクを3件検索してみます。

% curl --location 'https://**********.search.windows.net/indexes('\''techblog-index'\'')/docs/search.post.search?api-version=2024-07-01' \
-H 'api-key: **********' \
-H 'Content-Type: application/json; charset=utf-8' \
-d '{
         "count": true,
         "select": "id,chunk",
         "vectorQueries": [
             {
                 "kind": "text",
                 "text": "キザな赤シャツ",
                 "fields": "vector",
                 "k": 3,
                 "exhaustive": true
             }
         ]
     }' | jq .
{
  "@odata.context": "https://**********.search.windows.net/indexes('techblog-index')/$metadata#docs(*)",
  "@odata.count": 3,
  "value": [
    {
      "@search.score": 0.65513885,
      "id": "6d8d22df-7ffd-4b26-9764-d103cb5db9a6",
      "chunk": "山嵐のようにおれが居なくっちゃ日本が困るだろうと云うような面を肩の上へ載せてる奴もいる。そうかと思うと、赤シャツのようにコスメチックと色男の問屋をもって自ら任じているのもある。教育が生きてフロックコートを着ればおれになるんだと云わぬばかりの狸もいる。皆々それ相応に威張ってるんだが、このうらなり先生のように在れどもなきがごとく、人質に取られた人形のように大人しくしているのは見た事がない。顔はふくれているが、こんな結構な男を捨てて赤シャツに靡くなんて、マドンナもよっぼど気の知れないおきゃんだ。赤シャツが何ダース寄ったって、これほど立派な旦那様が出来るもんか。\n"
    },
    {
      "@search.score": 0.6481252,
      "id": "e9a3755c-cc7b-4b34-bf7c-44b55d8cbd4b",
      "chunk": "この男はこれが道楽である。赤シャツ相当のところだろう。ほかの連中は隣り同志で何だか私語き合ってい"
    },
    {
      "@search.score": 0.64614284,
      "id": "07552e58-abc4-4518-8193-247bebf48ce8",
      "chunk": "云うならフランクリンの自伝だとかプッシング、ツー、ゼ、フロントだとか、おれでも知ってる名を使うがいい。赤シャツは時々帝国文学とかいう真赤な雑誌を学校へ持って来て難有そうに読んでいる。山嵐に聞いてみたら、赤シャツの片仮名はみんなあの雑誌から出るんだそうだ。帝国文学も罪な雑誌だ。\nそれから赤シャツと野だは一生懸命に釣っていたが、約一時間ばかりのうちに二人で十五六上げた。可笑しい事に釣れるのも、釣れるのも、みんなゴルキばかりだ。鯛なんて薬にしたくってもありゃしない。今日は露西亜文学の大当りだと赤シャツが野だに話している。あなたの手腕でゴルキなんですから、私なんぞがゴルキなのは仕方がありません。"
    }
  ]
}

検索できました。Azureで構築されたシステムでOpenAIを利用するケースでは使い所が結構ありそうです。

*1:ベクタライザはOpenAI以外にも対応しているとのこと