Spring AIとAmazon Bedrockの連携(Tool Useの実装方法)

引き続きSpring AIとAmazon Bedrockの実装を進めます。

Bedrockの機能の一つにTool Useという機能があります。

docs.aws.amazon.com

Function callingとも呼ばれている機能なのですが、平たくいうと事前に定義している関数を生成AIが任意に呼び出すことができる機能です。これができることで、(生成AIが)苦手な現在時刻の取得や複雑な数値計算などが必要なタイミングを生成AIが会話の文脈を読み取って実行することができます。

Spring AIにもそれを実装する仕組みが整えられています。ドキュメントは以下のもの。

docs.spring.io

今回は、指定した都市の天気を取得することをやってみました。

まず、Tool Useを使わない場合。生成AIに東京の天気を聞いています。が、「そんなの知らない」と答えます(モデルはAmazon Nova Lite)。

それではTool Useを使ってみます。

まずはTool自身を実装します。@Toolアノテーションをつけるのがポイントです。今回はあくまでテストなので常に晴れ(sunny)を返すようにします。

package com.github.miyohide.demo;

import org.springframework.ai.tool.annotation.Tool;

public class WeatherTools {
    @Tool(description = "Get the current weather in city")
    public String getWeather(String city) {
        return "The weather in " + city + " is sunny";
    }
}

あとはリクエストを飛ばす時にtoolsメソッドに先ほど作成したクラスのインスタンスを渡してあげれば良いだけです。

  @GetMapping("/weather")
  public String getWheather(
      @RequestParam(value = "city", defaultValue = "Tokyo") String city) {
    return this.chatClient
        .prompt("What is the wheather in " + city + "?")
        .tools(new WeatherTools())
        .call()
        .content();
  }

これだけです。

実際に実行してみると、以下のようにgetWeatherメソッドで返す天気を返していることがわかります。

Bedrockのログを見てみます。よくみるとtoolConfigの部分に使用したgetWeatherメソッドが記されていることがわかります。

"toolConfig":{"tools":[{"toolSpec":{"name":"getWeather","description":"Get the current weather in city",

Bedrockにおいては、リクエストパラメータにおいて利用候補のツールの情報を含める必要があります。Spring AIがtoolsメソッドで指定したツールの情報を埋め込み、上記のようにJSONとして送信しています。この動きについては以下の公式ドキュメントを参照してください。

docs.aws.amazon.com

この公式ドキュメントを読むと、AWS SDKを直接使った場合は最終的な結果を得るためには幾らかのステップを踏む必要がありますが、Spring AIは特に意識することなく最終的な結果を得ることができました。Bedrockのログを見ると、stopReasontool_useであるものは出力されておらず、end_turnのものしか出力されていませんでした。

参考までに、AWS SDKの実装例が以下の公式ドキュメントに記されているので合わせて紹介しておきます。

docs.aws.amazon.com

簡単にですが、Spring AIとBedrockを使ったTool Useの実装例を見てみました。AWS SDKの実装例を見るとかなり大変そうなのですが、Spring AIを使うと特に意識することなく実装ができるのが大きなメリットであることが実感できます。