Azure AI 検索での構造対応のチャンキングとベクトル化
Note
現在、この機能はパブリック プレビュー段階にあります。 このプレビュー版はサービス レベル アグリーメントなしで提供されています。運用環境のワークロードに使用することはお勧めできません。 特定の機能はサポート対象ではなく、機能が制限されることがあります。 詳しくは、Microsoft Azure プレビューの追加使用条件に関するページをご覧ください。
テキスト データのチャンキング戦略は、RAG 応答とパフォーマンスを最適化する上で重要な役割を果たします。 現在プレビュー段階にある新しいドキュメント レイアウト スキルを使うと、段落または文章表現の意味的にまとまりのあるフラグメントに基づいて、コンテンツをチャンク化できます。 これらのフラグメントは独立して処理され、情報、解釈、または意味的関連性を失うことなく、セマンティック表現として再結合できます。 テキストの固有の意味は、チャンキング プロセスのガイドとして使用されます。
ドキュメント レイアウト スキルは、Markdown 構文 (見出しとコンテンツ) を使って、検索ドキュメント内のドキュメント構造を明確にします。 ソース ドキュメントから取得される検索可能なコンテンツはプレーンテキストですが、垂直統合を追加して、任意のフィールドの埋め込みを生成できます。
この記事では、次のことについて説明します:
- ドキュメント レイアウト スキルを使用してセクションを検出し、Markdown コンテンツを出力する
- テキスト分割スキルを使用して、各 Markdown セクションにチャンク サイズを制限する
- 各チャンクの埋め込みを生成する
- インデックス プロジェクションを使用して、埋め込みを検索インデックス内のフィールドにマップする
前提条件
- 出力を受け入れるインデックスを含むインデクサーベースのインデックス作成パイプライン。
- チャンク化するテキスト コンテンツがある、サポートされているデータ ソース。
- 段落の境界に基づいてドキュメントを分割するドキュメント レイアウト スキルを含むスキルセット。
- ベクトル埋め込みを生成する Azure OpenAI 埋め込みスキル。
- 一対多のインデックス作成用のインデックス プロジェクション。
データ ファイルを準備する
生の入力はサポートされているデータ ソース内にある必要があり、ファイルはドキュメント レイアウト スキルがサポートする形式である必要があります。
サポートされているファイル形式は、PDF、JPEG、JPG、PNG、BMP、TIFF、DOCX、XLSX、PPTX、HTML です。
サポートされるインデクサーは、サポートされているファイル形式を処理できる任意のインデクサーです。 これには、BLOB インデクサー、OneLake インデクサー、ファイル インデクサーが含まれます。
この機能でサポートされているリージョンは、米国東部、米国西部 2、西ヨーロッパ、米国中北部です。 こちらの一覧を調べて、利用可能なリージョンの更新を確認してください。
Azure portal、REST API、または Azure SDK パッケージを使って、データ ソースを作成できます。
ヒント
正常性プラン PDF サンプル ファイルをサポートされているデータ ソースにアップロードして、独自の検索サービスでドキュメント レイアウト スキルと構造対応のチャンキングを試します。 データのインポートとベクトル化ウィザードは、このスキルを試すことができるコーディング不要の簡単なアプローチです。 構造体対応のチャンキングを使うには、既定の解析モードを必ず選んでください。 そうしないと、Markdown 解析モードが代わりに使われます。
一対多のインデックス作成用のインデックスを作成する
チャンクを中心に設計された 1 つの検索ドキュメントのペイロードの例を次に示します。 この例では、親フィールドは text_parent_id です。 子フィールドは、Markdown セクションのベクトルおよび非ベクトル チャンクです。
Azure portal、REST API、または Azure SDK を使用してインデックスを作成できます。
スキル セットを作成したり、インデクサーを実行したり前に、検索サービスにインデックスが存在している必要があります。
{
"name": "my_consolidated_index",
"fields": [
{
"name": "chunk_id",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": true,
"facetable": false,
"key": true,
"analyzer": "keyword"
},
{
"name": "text_parent_id",
"type": "Edm.String",
"searchable": false,
"filterable": true,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "chunk",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "title",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "header_1",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "header_2",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "header_3",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false
},
{
"name": "text_vector",
"type": "Collection(Edm.Single)",
"searchable": true,
"filterable": false,
"retrievable": true,
"stored": true,
"sortable": false,
"facetable": false,
"key": false,
"dimensions": 1536,
"stored": false,
"vectorSearchProfile": "profile"
}
],
"vectorSearch": {
"profiles": [
{
"name": "profile",
"algorithm": "algorithm"
}
],
"algorithms": [
{
"name": "algorithm",
"kind": "hnsw"
}
]
}
}
構造対応のチャンキングとベクトル化のためのスキル セットを定義する
ドキュメント レイアウト スキルはプレビュー段階であるため、このステップでは Create Skillset 2024-11-01-preview REST API を使う必要があります。
ドキュメント レイアウト スキルと Azure OpenAI 埋め込みスキルを使って、個々の Markdown セクションのチャンクとそのベクトル出力を検索インデックスにドキュメントとして投影するスキル セット定義ペイロードの例を次に示します
POST {endpoint}/skillsets?api-version=2024-11-01-preview
{
"name": "my_skillset",
"description": "A skillset for structure-aware chunking and vectorization with a index projection around markdown section",
"skills": [
{
"@odata.type": "#Microsoft.Skills.Util.DocumentIntelligenceLayoutSkill",
"name": "my_document_intelligence_layout_skill",
"context": "/document",
"outputMode": "oneToMany",
"inputs": [
{
"name": "file_data",
"source": "/document/file_data"
}
],
"outputs": [
{
"name": "markdown_document",
"targetName": "markdownDocument"
}
],
"markdownHeaderDepth": "h3"
},
{
"@odata.type": "#Microsoft.Skills.Text.SplitSkill",
"name": "my_markdown_section_split_skill",
"description": "A skill that splits text into chunks",
"context": "/document/markdownDocument/*",
"inputs": [
{
"name": "text",
"source": "/document/markdownDocument/*/content",
"inputs": []
}
],
"outputs": [
{
"name": "textItems",
"targetName": "pages"
}
],
"defaultLanguageCode": "en",
"textSplitMode": "pages",
"maximumPageLength": 2000,
"pageOverlapLength": 500,
"unit": "characters"
},
{
"@odata.type": "#Microsoft.Skills.Text.AzureOpenAIEmbeddingSkill",
"name": "my_azure_openai_embedding_skill",
"context": "/document/markdownDocument/*/pages/*",
"inputs": [
{
"name": "text",
"source": "/document/markdownDocument/*/pages/*",
"inputs": []
}
],
"outputs": [
{
"name": "embedding",
"targetName": "text_vector"
}
],
"resourceUri": "https://<subdomain>.openai.azure.com",
"deploymentId": "text-embedding-3-small",
"apiKey": "<Azure OpenAI api key>",
"modelName": "text-embedding-3-small"
}
],
"cognitiveServices": {
"@odata.type": "#Microsoft.Azure.Search.CognitiveServicesByKey",
"key": "<Cognitive Services api key>"
},
"indexProjections": {
"selectors": [
{
"targetIndexName": "my_consolidated_index",
"parentKeyFieldName": "text_parent_id",
"sourceContext": "/document/markdownDocument/*/pages/*",
"mappings": [
{
"name": "text_vector",
"source": "/document/markdownDocument/*/pages/*/text_vector"
},
{
"name": "chunk",
"source": "/document/markdownDocument/*/pages/*"
},
{
"name": "title",
"source": "/document/title"
},
{
"name": "header_1",
"source": "/document/markdownDocument/*/sections/h1"
},
{
"name": "header_2",
"source": "/document/markdownDocument/*/sections/h2"
},
{
"name": "header_3",
"source": "/document/markdownDocument/*/sections/h3"
}
]
}
],
"parameters": {
"projectionMode": "skipIndexingParentDocuments"
}
}
}
インデクサーを実行する
データ ソース、インデックス、スキルセットを作成したら、インデクサーを作成して実行する準備ができました。 この手順では、パイプラインを実行します。
ドキュメント レイアウト スキルを使う場合は、インデクサーの定義で次のパラメーターを設定してください。
allowSkillsetToReadFileData
パラメーターはtrue
に設定する必要があります。parsingMode
パラメーターはdefault
に設定する必要があります。
次に示すのはペイロードの例です
{
"name": "my_indexer",
"dataSourceName": "my_blob_datasource",
"targetIndexName": "my_consolidated_index",
"skillsetName": "my_skillset",
"parameters": {
"batchSize": 1,
"configuration": {
"dataToExtract": "contentAndMetadata",
"parsingMode": "default",
"allowSkillsetToReadFileData": true
}
},
"fieldMappings": [
{
"sourceFieldName": "metadata_storage_path",
"targetFieldName": "title"
}
],
"outputFieldMappings": []
}
検証結果
処理の完了後に検索インデックスに対してクエリを実行して、ソリューションをテストできます。
結果を確認するには、インデックスに対してクエリを実行します。 検索クライアントとしての Search エクスプローラーまたは HTTP 要求を送信する任意のツールを使用します。 次のクエリは、Markdown セクションの非ベクトル コンテンツとそのベクトルの出力を含むフィールドを選択します。
Search エクスプローラーでは、JSON のみをコピーし、クエリを実行するために JSON ビューに貼り付けることができます。
POST /indexes/[index name]/docs/search?api-version=[api-version]
{
"search": "*",
"select": "metadata_storage_path, markdown_section, vector"
}