最新の安定バージョンについては、Spring AI 2.0.0 を使用してください! |
ツール検索ツールによる動的ツール検出
AI エージェントが Slack、GitHub、Jira、MCP サーバーなど、より多くのサービスに接続するにつれて、ツールライブラリは急速に増加します。一般的なマルチサーバー構成では、会話が始まる前に 50 以上のツールが大量のトークンを消費する可能性があります。さらに悪いことに、モデルが 30 以上の類似した名前のツールに直面すると、ツール選択の精度が低下します。
Anthropic によって開拓された (英語) ツール検索ツールパターンは、この問題を解決します。モデルは、すべてのツール定義を事前に読み込むのではなく、必要に応じてツールを検出します。最初は検索ツールのみを受け取り、必要に応じて機能を照会し、関連するツール定義をコンテキストに合わせて展開します。
Spring AI の実装により、数百のツールへのフルアクセスを維持しながら、OpenAI、Anthropic、Gemini モデル全体で 34-64% トークン削減が実現されます。
導入
ツール検索ツール [GitHub] (英語) プロジェクトは、Spring AI の再帰アドバイザーを継承して、Spring AI がサポートするあらゆる LLM プロバイダーで機能する動的ツール検出を実装します。
主な利点:
トークン節約 - 検出されたツール定義のみが LLM に送信されます
精度の向上 - モデルは、より小さく関連性の高いセットからより確実にツールを選択します。
スケーラビリティ - コンテキストの肥大化なく数百のツールを管理
ポータビリティ - OpenAI、Anthropic、Gemini、Ollama、Azure、OpenAI などに対応
クイックスタート
依存関係
プロジェクトにツール検索ツールの依存関係を追加してください。
<dependency>
<groupId>org.springaicommunity</groupId>
<artifactId>tool-search-tool</artifactId>
<version>2.0.0</version>
</dependency>
<!-- Choose a search strategy -->
<dependency>
<groupId>org.springaicommunity</groupId>
<artifactId>tool-searcher-lucene</artifactId>
<version>2.0.0</version>
</dependency>dependencies {
implementation 'org.springaicommunity:tool-search-tool:2.0.0'
// Choose a search strategy
implementation 'org.springaicommunity:tool-searcher-lucene:2.0.0'
}| バージョン v1.0.x [GitHub] (英語) は、Spring AI 1.1.x/Spring Boot 3 と互換性があります。バージョン v2.0.x [GitHub] (英語) は、Spring AI 2.x/Spring Boot 4 と互換性があります。 |
基本的な使い方
@SpringBootApplication
public class Application {
@Bean
CommandLineRunner demo(ChatClient.Builder builder, ToolSearcher toolSearcher) {
return args -> {
var advisor = ToolSearchToolCallAdvisor.builder()
.toolSearcher(toolSearcher)
.build();
ChatClient chatClient = builder
.defaultTools(new MyTools()) // 100s of tools registered but NOT sent to LLM initially
.defaultAdvisors(advisor) // Activate Tool Search Tool
.build();
var answer = chatClient.prompt("""
Help me plan what to wear today in Amsterdam.
Please suggest clothing shops that are open right now.
""").call().content();
System.out.println(answer);
};
}
static class MyTools {
@Tool(description = "Get the weather for a given location at a given time")
public String weather(String location,
@ToolParam(description = "YYYY-MM-DDTHH:mm") String atTime) {
// implementation
}
@Tool(description = "Get clothing shop names for a given location at a given time")
public List<String> clothing(String location,
@ToolParam(description = "YYYY-MM-DDTHH:mm") String openAtTime) {
// implementation
}
@Tool(description = "Current date and time for a given location")
public String currentTime(String location) {
// implementation
}
// ... potentially hundreds more tools
}
}使い方
ToolSearchToolCallAdvisor は、Spring AI の ToolCallAdvisor を継承し、動的なツール検出機能を実現します。

インデックス作成 : 会話開始時に、登録されているすべてのツールが
ToolSearcherにインデックス化されます。(しかし、LLM には送られなかった)初回リクエスト : LLM にはツール検索ツール定義のみが送信されます
ディスカバリコール : LLM が機能を必要とする場合、クエリを使用して検索ツールを呼び出します。
検索と展開 :
ToolSearcherは一致するツールを見つけ、その定義を次のリクエストに追加します。ツール呼び出し : LLM は、検索ツールと発見されたツールの定義の両方を認識するようになりました。
ツールの実行 : 発見されたツールが実行され、結果が返されます。
レスポンス : LLM は最終的な答えを生成します
検索戦略
ToolSearcher インターフェースは、複数の検索実装をサポートしています。
| 戦略 | 実装 | 最適な用途 |
|---|---|---|
セマンティック |
| 自然言語クエリ、あいまいマッチング |
キーワード |
| 正確な用語一致、既知のツール名 |
正規表現 |
| ツール名のパターン ( |
利用可能な実装については、ツール検索ツール [GitHub] (英語) を参照してください。
パフォーマンス
28 種類のツールを用いた準備ベンチマークテストでは、トークンの大幅な節約が示されました。
| モデル | ツール検索を使用 | それなし | 保存 |
|---|---|---|---|
Gemini | 2,165 トークン | 5,375 トークン | 60% |
OpenAI | 4,706 トークン | 7,175 トークン | 34% |
Anthropic | 6,273 トークン | 17,342 トークン | 64% |
いつ使うか
| ツール検索ツールアプローチ | 伝統的なアプローチ |
|---|---|
システムには 20 種類以上のツールが含まれています | 小型ツールライブラリ (20 個未満のツール) |
5,000 トークン以上を消費するツール定義 | すべてのセッションで頻繁に使用されるツール |
複数のサーバーを使用した MCP 搭載システムの構築 | 非常にコンパクトなツール定義 |
ツール選択の精度に関する問題が発生しています |
サンプルプロジェクト
ツール検索ツールデモ [GitHub] (英語) - 完全な動作例
事前選択ツールのデモ [GitHub] (英語) - LLM の関与なしに決定論的なツール選択を行う
コミュニティリソース
素晴らしい Spring AI [GitHub] (英語) - コミュニティの例とリソース
参照
Anthropic 高度なツール使用 (英語) - オリジナルパターンの説明
Spring AI 再帰アドバイザーブログ (英語) - ツール検索実装用 Foundation