やりたいこと
Cognitive Searchで検索した結果をテキストを分割してその結果を取得したい。
調べてたところ、標準スキルセットにテキスト分割コグニティブ スキルなるものがあったので、それを使ってみようとした備忘録
概念
細かいことを指摘すると全然違いますがひとまず気にせず・・・
テキスト分割スキルの設定
設定には3つの準備が必要です。
- スキルセットのJSONへテキスト分割スキルに関する定義を追加
- インデクサーのJSONにスキルセットで処理した出力をインデックスにマッピングするための設定
- スキルセットで処理した出力を格納する任意のインデックス
ここでややこしいのが、
スキルセットやインデクサーの設定がすべてJSONのテキストベースで行われることと、Cognitive Searchでの内部的なデータの構造がパッと見ではわかりにくいことがあります。
正直JSONでガリガリ設定することに耐性がないとこの時点で結構やる気をそがれそう・・・
一応公式のドキュメントをちゃんと読めば分からなくはないですがハードルが高いんですよね。
今回は以下のような内容で作成します。
- データ本文 /document/content をテキスト分割処理にかけて
- テキスト分割後のデータを /document/content/splitData に格納し
- インデクサー側で /document/content/splitData を /document/pages にマッピングする
スキルセットに設定する定義
スキルセットのJSONに下記を追加します。
{
"@odata.type": "#Microsoft.Skills.Text.SplitSkill",
"name": "#2",
"description": "",
"context": "/document/content",
"defaultLanguageCode": "ja",
"textSplitMode": "pages",
"maximumPageLength": 300,
"inputs": [
{
"name": "text",
"source": "/document/content"
}
],
"outputs": [
{
"name": "textItems",
"targetName": "splitData"
}
]
}
inputsのsourceにテキスト分割元になるデータを指定します。
outputs側のtargetNameにテキスト分割後にデータが格納されるカラムを記載します。
このとき、targetNameはパスでは記載しません。記載したカラム名がinputsのsourceに指定したパスの階層として作成されます。(今回で言うと、 /document/content/splitData に格納される)
インデクサーに追加する定義
このままではインデックスに配置できないので、
インデクサー側のJSONにフィールドのマッピングを設定する。
"outputFieldMappings": [
{
"sourceFieldName": "/document/content/splitData",
"targetFieldName": "pages"
}
]
今回の場合、
テキスト分割で生成された /document/content/splitData の内容を、pages フィールドにマッピングさせる。targetFieldNameはパスで記載する必要はありません。
参考:全体の繋がり
試す
まずインデクサーを実行する必要があります。
既にインデックスを作成している場合は一度リセットをしてから、再度インデクサーを実行してください。
インデクサーの実行が完了したら、エラーが無いかを確認します。
インデクサーの実行画面からエラーや警告を確認することができます。
その後、インデックスの画面で検索を行い、テキスト分割が行われていることを確認してください。
出力のマスキングがめんどくさいので、ここのキャプチャは省きますが、上記設定であればpagesフィールドにテキスト分割結果が入ってきます。
おわり
JSONで設定をやるのはちょっと大変ですね・・・
今後、Azure OpenAI ServiceのGPTモデルへのAdd User Dataがリリースされて、
あまり深いことを考えずにCognitive Searchを使えるようになりましたが、
最適なものを作成するためには、Cognitive Search本体の仕組みをしっかり理解しておくことが重要かもしれませんね。