この記事では、Microsoft Foundry (classic) 環境において
C# SDK(AI.Agents.Persistent)を使って 特定のツール使用を強制する方法を紹介します
はじめに
Microsoft Foundry (旧 Azure AI Foundry) では LLM モデルに「ツール」と呼ばれる外部機能(検索、コード実行、API等)を紐づけることで AI エージェントを構築できます。
Foundry (new) ポータルでは、ツールを常に使用させるか、あるいはエージェントの判断に委ねるかを UI上で制御できますが、Foundry (classic) では ポータル上にそのような設定画面がありません。そのため、ツールを使用するかどうかは基本的にモデルの判断になり、例えば「RAGのチャットエージェントがナレッジ検索をせず、内部知識のみで回答してしまう」、なんてことが起きてしまいます。
では classic を使っている限りこのような不確実性から逃れることはできないのかというと、
実は一部SDKではこれを回避する方法があります。
ここでは C# の AI.Agents.Persistent (Version="1.1.0") という SDK での方法を紹介します。
(AI.Projects の AgentsClient では toolChoice を指定できないのでご注意ください)
Run メソッドに toolChoice を指定する
例えば、Azure AI Search を使用してほしい場合は以下のように書きます。
// ツール指定用のオブジェクト作成
PersistentAgentsNamedToolChoice toolChoice = new PersistentAgentsNamedToolChoice(PersistentAgentsNamedToolChoiceType.AzureAISearch);
// BinaryData に変換(SDK 独自の変換メソッドを用いる)
BinaryData toolChoiceBinary = ((IPersistableModel<PersistentAgentsNamedToolChoice>)toolChoice).Write(new ModelReaderWriterOptions("J"));
// 使用ツールを指定して実行
var run = (await _client.Runs.CreateRunAsync(threadId, agent.Id, toolChoice: toolChoiceBinary, cancellationToken: cancelToken)).Value;
CreateRun / CreateRunAsync メソッドに toolChoice パラメータを与えることで、
LLM に対して どのツールを使用すべきかを明示的に指定できます。
toolChoice は BinaryData 型として受け取る必要がありますが、
SDK が提供する PersistentAgentsNamedToolChoice クラスを使うことで簡単に作成可能です。
クラスの引数には使わせたいツールのタイプを指定します。
ソースコードを見る限り、対応しているのは以下のようです。
| Type | JSON 値 | 対応ツール |
|---|---|---|
| Function | "function" |
カスタム関数(いわゆる function calling) |
| CodeInterpreter | "code_interpreter" |
コードインタープリター |
| FileSearch | "file_search" |
File Search |
| BingGrounding | "bing_grounding" |
Bing 検索 |
| AzureAISearch | "azure_ai_search" |
Azure AI Search |
| ConnectedAgent | "connected_agent" |
接続されたエージェント |
BinaryData への変換では IPersistableModel.Write() メソッドを使う必要があります。
試しに FromObjectAsJson で変換してみたところ、
意図しない変換が行われていました。
// FromObjectAsJson で変換した場合
// ツール指定用のオブジェクト作成
PersistentAgentsNamedToolChoice toolChoice = new PersistentAgentsNamedToolChoice(PersistentAgentsNamedToolChoiceType.AzureAISearch);
// BinaryData に変換(CreateRunAsync は BinaryData を要求)
BinaryData toolChoiceBinary = BinaryData.FromObjectAsJson(toolChoice);
_logger.LogInformation("toolChoiceBinary={toolChoiceBinary}", toolChoiceBinary);
=====================================================
> toolChoiceBinary={"Type":{},"Function":null}
// Writeメソッド で変換した場合
// ツール指定用のオブジェクト作成
PersistentAgentsNamedToolChoice toolChoice = new PersistentAgentsNamedToolChoice(PersistentAgentsNamedToolChoiceType.AzureAISearch);
// BinaryData に変換(CreateRunAsync は BinaryData を要求)
BinaryData toolChoiceBinary = ((IPersistableModel<PersistentAgentsNamedToolChoice>)toolChoice).Write(new ModelReaderWriterOptions("J"));
=====================================================
> toolChoiceBinary={"type":"azure_ai_search"}
一応
BinaryData.FromObjectAsJson(new {type = "azure_ai_search"});
のような JSON を直書きでも動きましたが、SDKとの整合性を確実にとるなら
IPersistableModel.Write() を使用するのが良いでしょう。
まとめ
- Foundry (classic) ではポータル上でツール使用を強制できない
- C# SDK(AI.Agents.Persistent)では
toolChoiceを指定することでツール使用を強制できる -
toolChoiceに与える値は SDKが提供するクラスで作成するのがよい

