🖖

Azure AI Searchのインデックスをノーコードでデータ更新

2024/12/21に公開

やりたいこと

Azure AI SearchというベクトルDBリソースにはインデックスとインデックスの作成、データ更新がノーコードでできるインデクサーという機能があります。

https://learn.microsoft.com/ja-jp/azure/search/search-indexer-overview

インデックス作成のステージ

インデックスにドキュメントからデータを取り込むためにはこのようなステップを踏む必要があり、通常はAzure Document Intelligenceやロジック、GPT-4oなどに解釈させるなど様々な選択肢からドキュメントを解析し、チャンキング戦略に沿った処理をした後、インデックスにデータを取り込みます。

その一連の処理をノーコードでかつ、オプションやスキルによる精度向上の工夫もある程度できるような機能がインデクサーになります。

今回は主にチャンキング戦略として重要になるテキスト分割スキルで、想定通りのドキュメント分割ができるのかを調べてもらったので共有します。

ドキュメント分割されたインデックスの作成方法

  1. データのインポートとベクター化でインデックスとインデクサーを作成
  2. 作成されたスキルセットを更新する
  3. インデクサーを再実行する

この流れで想定通りのインデックスのデータができるかみてみます。

デフォルトでデータソースを指定して進むとこのようなインデックスができます。

一点注意点は、Azure AI FoundryのプレイグラウンドでAI Searchと紐づける際に、ディメンションが3072だとエラーが出て実行できないということが起きました。

※プライグラウンド側で使うAOAI側にembeddingモデルにデプロイしておく必要があるようです。

実は、この時点でもデフォルトで下記のようなテキスト分割とオーバーラップの設定が入っています。

      "textSplitMode": "pages",
      "maximumPageLength": 2000,
      "pageOverlapLength": 500,

スキルセットから、このmaximumPageLengthとpageOverlapLengthを変更します。

      "textSplitMode": "pages",
      "maximumPageLength": 500,
      "pageOverlapLength": 100,

次に作成されたインデクサーのJSONをコピーします。

作成されたインデクサーのみ削除します。

再実行だと、ドキュメントを増やした際に追加されない事象があるとのことです。

インデクサーの実行が完了すると、想定通り、500文字程度ずつにドキュメント分割されたデータが登録されます。

エンリッチメントの粒度に関するテキスト分割

今回記載しませんでしたが、初期のインデックス作成とインデクサー作成には「データのインポート」と「データのインポートとベクター化」の選択肢があり、「データのインポート」にはエンリッチメントの粒度の設定でテキスト分割スキルがあります。他にもキーフレーズ抽出スキルなどもあるので、こちらでテキスト分割スキルをまずは調査していました。

ただ、こちらで設定したテキスト分割は、ドキュメント自体を分割するものではなく、対象フィールドを配列にして分割するようでした。

まさにエンリッチメントの粒度に関する細分化なのですが、AOAIに入れるコンテキストを絞りたいという意味だとあまり意味がない機能でした。(キーフレーズ抽出などと併用するとキーフレーズ抽出が詳細化されたりするようです)

"textItems": [
        "1 \n\n育児・介護休業規程 \n\n \n\n 従業員の育児休業および介護休業の制度、勤務時間の短縮等の措置ならびに育児および\n\n家族の介護を行う従業員の深夜業を制限する制度に関しては、この規程の定めによる。\n\nこの規程に定めのない事項に関しては、「育児休業、介護休業等育児又は家族介護を行う\n\n労働者の福祉に関する法律」その他の法令の定めによる。  \n\n \n\n第 1 章  育 児 休 業 \n\n \n\n(対 象 者) \n\n第 1 条 生後1年未満の子(実子または養子。以下同じ。)を養育する従業員(期間\n\n雇用者を含む)であって、休業後も引き続き勤務する意思のある者は、育児のための休",
        "業をすることができる。 \n\n  ただし、日々雇用者、および労使協定で適用除外とされた以下に掲げる者を除く。  \n\n⑴ 継続雇用1年未満の者 \n\n⑵ その子の親である配偶者などが常態としてその子を養育できる者  \n\n⑶ 休業申出の日から1年以内に雇用関係が終了することが明らかな者  \n\n⑷ 1週間の所定労働日数が2日以下の者  \n\n(育児休業の申出) \n\n第 2 条 育児休業を希望する従業員は、原則として希望する休業開始予定日の1か月\n\n前(出産予定日前の子の出生など特別の事情がある場合は1週間前)までに、会社所定",
        "の用紙に必要事項を記載し、人事部に提出することにより申し出なければならない。  \n\n(育児休業期間) \n\n第 3 条 育児休業期間は、原則として子が1歳に達するまでの間において従業員が申\n\nし出た期間とする。ただし、子の死亡その他特別の事情を生じた場合は、休業期間は当\n\n初の終了予定日前であっても原則としてその事情の生じた日をもって終了するものと\n\nする。 \n\n2 前項の規定にかかわらず、子が保育所へ入所できない等特段の事情がある場合は、1\n\n歳6か月に達するまでとする。  \n\n(育児休業回数)",

まとめ

ページ番号の抽出や表の読み取りなど、できないことや、UI的にわかりにくいこともある機能ですが、ノーコードで精度向上をすることはできそうです。

AI Foundryのプレイグラウンドやプロンプトフローと組み合わせるとRAGデバッグ環境が容易にできるのでインデクサーを使いこなせると、検証のサイクルが回しやすいと思いました。

ヘッドウォータース

Discussion