このバージョンはまだ開発中であり、まだ安定しているとは見なされていません。最新の安定バージョンについては、Spring AI 1.1.7 を使用してください!

ツール検索ツールによる動的ツール検出

AI エージェントが Slack、GitHub、Jira、MCP サーバーなど、より多くのサービスに接続するにつれて、ツールライブラリは急速に増加します。一般的なマルチサーバー構成では、会話が始まる前に 50 以上のツールが大量のトークンを消費する可能性があります。さらに悪いことに、モデルが 30 以上の類似した名前のツールに直面すると、ツール選択の精度が低下します。

Anthropic によって開拓された (英語) ツール検索ツールパターンは、この問題を解決します。モデルは、すべてのツール定義を事前に読み込むのではなく、必要に応じてツールを検出します。最初は検索ツールのみを受け取り、必要に応じて機能を照会し、関連するツール定義をコンテキストに合わせて展開します。

Spring AI の実装により、数百のツールへのフルアクセスを維持しながら、OpenAI、Anthropic、Gemini モデル全体で 34-64% トークン削減が実現されます。

導入

ツール検索ツールは、Spring AI の再帰アドバイザーを継承し、Spring AI がサポートするあらゆる LLM プロバイダーで動作する動的なツール検出機能を実現します。

主な利点:

  • トークン節約 - 検出されたツール定義のみが LLM に送信されます

  • 精度の向上 - モデルは、より小さく関連性の高いセットからより確実にツールを選択します。

  • スケーラビリティ - コンテキストの肥大化なく数百のツールを管理

  • ポータビリティ - OpenAI、Anthropic、Gemini、Ollama などに対応

ブログ投稿

ブログ投稿では、完全な実装の詳細、パフォーマンスベンチマーク、高度なユースケースについて説明します。

クイックスタート

依存関係

プロジェクトにツール検索ツールの依存関係を追加してください。

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-tool-search-advisor</artifactId>
</dependency>
dependencies {
    implementation 'org.springframework.ai:spring-ai-tool-search-advisor'
}

基本的な使い方

@SpringBootApplication
public class Application {

    @Bean
    CommandLineRunner demo(ChatClient.Builder builder, ToolIndex toolIndex) {
        return args -> {
            var advisor = ToolSearchToolCallingAdvisor.builder()
                .toolIndex(toolIndex)
                .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
    }
}

使い方

ToolSearchToolCallingAdvisor は、Spring AI の ToolCallingAdvisor を継承し、動的なツール検出機能を実現します。

Tool Search Tool Flow
  1. インデックス作成 : 会話開始時に、登録されているすべてのツールが ToolIndex にインデックス化されます。(しかし、LLM には送られなかった)

  2. 初回リクエスト : LLM にはツール検索ツール定義のみが送信されます

  3. ディスカバリコール : LLM が機能を必要とする場合、クエリを使用して検索ツールを呼び出します。

  4. 検索と展開 ToolIndex は一致するツールを見つけ、その定義を次のリクエストに追加します。

  5. ツール呼び出し : LLM は、検索ツールと発見されたツールの定義の両方を認識するようになりました。

  6. ツールの実行 : 発見されたツールが実行され、結果が返されます。

  7. レスポンス : LLM は最終的な答えを生成します

検索戦略

ToolIndex インターフェースは、複数の検索実装をサポートしています。

戦略 実装 最適な用途

セマンティック

VectorToolIndex

自然言語クエリ、あいまいマッチング

キーワード

LuceneToolIndex

正確な用語一致、既知のツール名

正規表現

RegexToolIndex

ツール名のパターン (get_*_data)

利用可能な実装および構成オプションについては、ツール検索ツールを参照してください。

パフォーマンス

28 種類のツールを用いた準備ベンチマークテストでは、トークンの大幅な節約が示されました。

モデル ツール検索を使用 それなし 保存

Gemini

2,165 トークン

5,375 トークン

60%

OpenAI

4,706 トークン

7,175 トークン

34%

Anthropic

6,273 トークン

17,342 トークン

64%

いつ使うか

ツール検索ツールアプローチ 伝統的なアプローチ

システムには 20 種類以上のツールが含まれています

小型ツールライブラリ (20 個未満のツール)

5,000 トークン以上を消費するツール定義

すべてのセッションで頻繁に使用されるツール

複数のサーバーを使用した MCP 搭載システムの構築

非常にコンパクトなツール定義

ツール選択の精度に関する問題が発生しています

参照