Microsoft Build 2025 で Azure AI Search が Agentic retrieval 機能を実装し、エージェントが独自の検索戦略を計画・実行することで回答の精度を向上させます。従来のシングルショット検索(RAG)と比較して、エージェント検索は複雑な質問に対する回答の関連性を最大 40% 向上させる効果も出ています。Agentic retrieval 機能は自動でクエリを変換し、並列検索を実行し、エージェント向けに調整された結果、参照情報、クエリアクティビティログを提供します。
また、ADLS Gen2 においてドキュメントレベルのアクセス権限管理に対応しました!
Build 2025 Updates🎉
-
Agentic retrieval (プレビュー)
複雑なユーザークエリをサブクエリに分解し、それらを並列実行することで、Azure AI Search でインデックス付けされたドキュメントからグラウンディングデータを抽出します。 -
ドキュメントレベルのアクセス制御(プレビュー)
Azure Data Lake Storage (ADLS) Gen2 の BLOB からインデックス内の検索可能なドキュメントにドキュメントレベルの権限をフローできるように。クエリでは、選択したデータソースのユーザー ID に基づいて結果をフィルターできるように。 -
マルチベクターサポート(プレビュー)
単一のドキュメントフィールド内で複数の子ベクトルをインデックス化します。複雑なコレクションのネストされたフィールドでベクトル型を使用できるように。 -
セマンティックランキングによるプロファイルのスコアリング(プレビュー)
セマンティック ランカーでは、新しいフィールド@search.rerankerBoostedScore
が追加され、スコアリングプロファイルが使用できるように。 -
Azure Logic Apps 統合(プレビュー)
Azure Logic Apps ワークフローを使用してコンテンツを取得する自動インデックス作成パイプラインを作成できるように。 -
マルチモーダル検索(プレビュー)
テキストと画像を含むドキュメントを取り込み、理解し、取得することで、テキストクエリで複雑な画像に埋め込まれた関連情報を検索するなど、様々なモダリティを組み合わせた検索が可能に。データのインポートとベクトル化ウィザードの機能も強化。 -
GenAI プロンプトスキル(プレビュー)
ユーザーが指定したプロンプトを使用して、LLM に接続し、情報を取得する新しいスキルが追加 -
ドキュメントレイアウトスキル(プレビュー)
画像検索エクスペリエンスを向上させる画像オフセットメタデータをサポート -
インデックスの「説明」のサポート(プレビュー)
「説明」は、エージェントが説明を読み取ってクエリを実行するか、別のインデックスに移動するかどうかを判断するエージェントソリューションで役立ちます。
Agentic retrieval (プレビュー)
すでに Azure OpenAI Developers セミナー 2025 で紹介した通り、Azure AI Search には Advanced RAG 機能がマネージドで実装されていました。
今回の Build 2025 でさらに Agentic RAG に相当する機能が実装され、AI エージェントがチャット履歴を含む複雑なクエリーを分解し、クエリー計画を策定、必要に応じて並列でクエリを実行し、結果を統合します。
利用条件
- セマンティック ランカーを提供するリージョンの Azure AI Search (Basic レベル以上)
- エージェント検索のインデックス基準を満たす検索インデックス。インデックスには
defaultConfiguration
が必要。 - 対応モデル:
gpt-4o
,gpt-4o-mini
,gpt-4.1
,gpt-4.1-nano
,gpt-4.1-mini
- Python SDK:
pip install azure-search-documents==11.6.0b12
KnowledgeAgent の作成
検索インデックスに対して Azure OpenAI に展開した LLM をラップする検索エージェントを作成します。LLM は、エージェント型検索パイプラインにクエリを送信するために使用されます。
from azure.search.documents.indexes.models import KnowledgeAgent, KnowledgeAgentAzureOpenAIModel, KnowledgeAgentTargetIndex, KnowledgeAgentRequestLimits, AzureOpenAIVectorizerParameters
agent = KnowledgeAgent(
name=agent_name,
models=[
KnowledgeAgentAzureOpenAIModel(
azure_open_ai_parameters=AzureOpenAIVectorizerParameters(
resource_url=azure_openai_endpoint,
deployment_name=azure_openai_gpt_deployment,
model_name=azure_openai_gpt_model
)
)
],
target_indexes=[
KnowledgeAgentTargetIndex(
index_name=index_name,
default_reranker_threshold=2.5
)
],
)
index_client.create_or_update_agent(agent)
print(f"Knowledge agent '{agent_name}' created or updated successfully")
KnowledgeAgent の取得
agent = index_client.get_agent(agent_name)
print(f"Knowledge agent '{agent_name}' retrieved successfully")
KnowledgeAgent の一覧
agent = index_client.list_agents()
for agent in agent:
print(f"Knowledge agent '{agent.name}' ")
会話履歴を含むメッセージの作成
AI アプリ側の情報。
instructions = """
日本の戦国時代の歴史の質問に回答できる中学校歴史教師エージェント。中学生にもわかるように説明してください。
ソースはJSON形式で、回答内に引用する必要があるref_idを含んでいます。
回答が分からない場合は「分かりません」と回答してください。
"""
messages = [
{
"role": "system",
"content": instructions
}
]
Agentic retrieval を使用して結果を取得
検索インデックスから関連する情報を抽出するために検索パイプラインを実行します。検索リクエストに含まれるメッセージとパラメーターに基づいて、LLM は次のように処理します:
-
会話履歴全体を分析し、根本的な情報ニーズを特定
-
複合ユーザークエリを焦点を絞ったサブクエリに分解
-
結果を単一の文字列に統合
from azure.search.documents.agent import KnowledgeAgentRetrievalClient
from azure.search.documents.agent.models import KnowledgeAgentRetrievalRequest, KnowledgeAgentMessage, KnowledgeAgentMessageTextContent, KnowledgeAgentIndexParams
agent_client = KnowledgeAgentRetrievalClient(endpoint=endpoint, agent_name=agent_name, credential=credential)
messages.append({
"role": "user",
"content": """
なぜ源頼朝は鎌倉幕府を開いたのか、とか、北条氏は鎌倉幕府でどんな役割を果たした?
あと源さねともはどんな人物で実朝の政策で特に重要なのは何か
"""
})
retrieval_result = agent_client.knowledge_retrieval.retrieve(
retrieval_request=KnowledgeAgentRetrievalRequest(
messages=[KnowledgeAgentMessage(role=msg["role"], content=[KnowledgeAgentMessageTextContent(text=msg["content"])]) for msg in messages if msg["role"] != "system"],
target_index_params=[KnowledgeAgentIndexParams(index_name=index_name, reranker_threshold=2.5)]
)
)
messages.append({
"role": "assistant",
"content": retrieval_result.response[0].content[0].text
})
レスポンスの取得
import textwrap
print("Response")
print(textwrap.fill(retrieval_result.response[0].content[0].text, width=120))
Response
[{"ref_id":0,"title":"源頼朝-
29.txt","content":"頼朝の開いた武家政権は制度化され、次第に朝廷から政治の実権を奪い、後に幕府と名付けられ、王政復古(1868年)まで足掛け約680年間にわたって続くこととなる、..."},
{"ref_id":1,"title":"大江広元-
1.txt","content":"建久10年(1199年)正月に頼朝が死去し、源頼家が2代将軍になると義盛は宿老として十三人の合議制に列した...
検索アクティビティの取得
アクティビティログを返します。LLMの入力トークン数と出力トークン数、サブクエリテキスト、クエリごとのヒット数、適用されたフィルター、実行タイミングなどが含まれます
import json
print("Activity")
print(json.dumps([a.as_dict() for a in retrieval_result.activity], indent=2, ensure_ascii=False))
[
{
"id": 0,
"type": "ModelQueryPlanning",
"input_tokens": 1277,
"output_tokens": 622
},
{
"id": 1,
"type": "AzureSearchQuery",
"target_index": "busho-ada-embedding-v3",
"query": {
"search": "なぜ源頼朝は鎌倉幕府を開いたのか"
},
"query_time": "2025-05-19T21:51:07.934Z",
"count": 8,
"elapsed_ms": 162
},
{
"id": 2,
"type": "AzureSearchQuery",
"target_index": "busho-ada-embedding-v3",
"query": {
"search": "北条氏は鎌倉幕府でどんな役割を果たしたか"
},
"query_time": "2025-05-19T21:51:08.064Z",
"count": 14,
"elapsed_ms": 111
},
{
"id": 3,
"type": "AzureSearchQuery",
"target_index": "busho-ada-embedding-v3",
"query": {
"search": "源実朝はどんな人物で実朝の政策で特に重要なのは何か"
},
"query_time": "2025-05-19T21:51:08.169Z",
"count": 0,
"elapsed_ms": 105
},
{
"id": 4,
"type": "AzureSearchSemanticRanker",
"input_tokens": 94255
}
]
Query Planner によってユーザーからの複雑なクエリーが分割され、スペルも修正されていることがわかる。
検索結果の取得
print("Results")
print(json.dumps([r.as_dict() for r in retrieval_result.references], indent=2, ensure_ascii=False))
[
{
"type": "AzureSearchDoc",
"id": "6",
"activity_source": 1,
"doc_key": "5rqQ6aC85pydLTMwLnR4dA=="
},
{
"type": "AzureSearchDoc",
"id": "4",
"activity_source": 1,
"doc_key": "5rqQ6aC85pydLTIxLnR4dA=="
},
...
結果をLLMで要約
あとは自分で得られた結果を最終回答として LLM に送信します。
response = client.responses.create(
model=answer_model,
input=messages
)
wrapped = textwrap.fill(response.output_text, width=100)
print(wrapped)
エージェント検索用のインデックスを定義
エージェントは以下の要素も使用してクエリを作成するため、Agentic retrieval のためのインデックス設計が今後必要となります。特にインデックスの description
はこれまで空白にされることが多かったですが、エージェントにとっては必要な情報になってきます。
-
description
: インデックスの説明 -
scoringProfile
defaultScoringProfile
: 関連性を高めるため -
synonymMaps
: 専門用語や業界用語 -
analyzers
: 言語のルールやパターン(空白の保持や特殊文字など)
公式サンプルコード
ドキュメントレベルのアクセス制御(プレビュー)
これまで、Azure AI Search はフィルターによるセキュリティトリミングによってドキュメントをユーザーごとに出し分けるというアプローチを提供してきました。そのため、Microsoft Entra ID との連携部分は独自に開発する必要がありました。今回のアップデートで POSIX ライクな ACL 権限をネイティブ サポートしたことにより、Microsoft Entra ID を通じて ADLS Gen2 アクセス制御モデルは Azure ロールベース アクセス制御 (Azure RBAC) と POSIX ライクなアクセス制御リスト (ACL) の両方がサポートされます。最新のプレビュー API を使用する Azure AI Search では、これらの権限を検索インデックスとクエリに反映できます。
インデックス作成
ドキュメントアップロード
クエリー
ACL サンプルコード
Microsoft Purview 情報保護の秘密度ラベル Private Preview 開始
Microsoft Purview Sensitivity Labels Preview Request
マルチベクターサポート(プレビュー)
Azure AI Search のマルチベクトルフィールドサポート機能により、単一のドキュメントフィールド内で複数の子ベクトルをインデックス化できます。これまで、Collection(Edm.Single)
ベクトル型は最上位フィールドでのみ使用できました。マルチベクターフィールドのサポート導入により、複雑なコレクションのネストされたフィールドでもベクター型を使用できるようになり、複数のベクターを単一のドキュメントに関連付けることが可能になります。
1つのドキュメントには、すべての複合コレクションフィールドを合わせて最大100個のベクターを含めることができます。ベクターフィールドは1レベルまでしかネストできません。
{
"name": "descriptionEmbedding",
"type": "Collection(Edm.Single)",
"dimensions": 3,
"searchable": true,
"retrievable": true,
"vectorSearchProfile": "hnsw"
},
{
"name": "scenes",
"type": "Collection(Edm.ComplexType)",
"fields": [
{
"name": "embedding",
"type": "Collection(Edm.Single)",
"dimensions": 3,
"searchable": true,
"retrievable": true,
"vectorSearchProfile": "hnsw"
},
セマンティックランキングによるプロファイルのスコアリング(プレビュー)
Azure AI Search で、スコアリング プロファイルとセマンティック ランカーの統合が可能になりました。セマンティック ランカーに新しいフィールド @search.rerankerBoostedScore
が追加され、スコアリングプロファイルを再ランキング レベルで直接適用できるようになり、ブーストが考慮されるようになります。
{
"value": [
{
"@search.score": 0.63,
"@search.rerankerScore": 2.98,
"@search.rerankerBoostedScore": 7.68,
"content": "boosted content 2"
},
Azure Logic Apps 統合(プレビュー)
Azure AI Search でデータのインポートとベクター化ウィザードを使用してワークフローを作成し、Azure Logic Apps で他のワークフローと並行して管理できます。ウィザードは、AI Search でインデックスを作成するためにソースからコンテンツを取得(取り込み)するワークフロー テンプレートに従って動作します。
マルチモーダル検索(プレビュー)
Azure AI Search は、Azure ポータルのガイド付きエクスペリエンスを通じて、マルチモーダル パイプラインの構築を簡素化します。
また、マルチモーダル RAG 機能に特化した Chat with Your Data サンプルを公開しました。
ちなみに、例のサンプルコードも Agentic retrieval に対応しました!
GenAI プロンプトスキル(プレビュー)
GenAI (Generative AI)プロンプトスキルは、Azure AI Foundry または Azure OpenAI Service にデプロイされた LLM に対してチャット完了リクエストを実行します。テキストのみ、画像、またはテキストと画像を組み合わせた入力から、画像の言語化、要約、変換、エンリッチメント、または構造化データの抽出を行います。
{
"@odata.type": "#Microsoft.Skills.Custom.ChatCompletionSkill",
"name": "Image Describer",
"context": "/document/normalized_images/*",
"inputs": [
{ "name": "image", "source": "/document/normalized_images/*/data" },
{ "name": "imageDetail", "source": "=high" },
{ "name": "systemMessage", "source": "='You are a useful AI assistant.'" },
{ "name": "userMessage", "source": "='Describe this image:'" }
],
"outputs": [ { "name": "response" } ],
"uri": "https://demo.openai.azure.com/openai/deployments/gpt-4o/chat/completions",
"authIdentity": "11111111-2222-3333-4444-555555555555",
"responseFormat": { "type": "text" }
}
ドキュメントレイアウトスキル(プレビュー)
ドキュメントレイアウトスキルは、ドキュメントを分析し、関心領域とその相互関係を抽出して、ドキュメントの構文表現を Markdown 形式またはテキスト形式で生成します。このスキルは、Azure AI Document Intelligenceで提供されるドキュメントインテリジェンスレイアウトモデルを使用します。
Azure AI Foundry Agent Service Updates
参考