Bedrock Converse API
Amazon Bedrock コンバース API は、関数 / ツールの呼び出し、マルチモーダル入力、ストリーミングレスポンスなどの強化された機能を備えた会話型 AI モデル用の統合インターフェースを提供します。
Bedrock Converse API には、次のような高レベルの機能があります。
ツール / 関数の呼び出し: 会話中の機能定義とツールの使用をサポート
マルチモーダル入力: 会話中のテキストとイメージ入力の両方を処理する機能
ストリーミングサポート: モデルレスポンスのリアルタイムストリーミング
システムメッセージ: システムレベルの命令とコンテキスト設定のサポート
Bedrock Converse API は、AWS 固有の認証とインフラストラクチャの問題を処理しながら、複数のモデルプロバイダー間で統一されたインターフェースを提供します。現在、Converse API 対応モデル [Amazon] には Amazon Titan 、Amazon Nova 、AI21 Labs 、Anthropic Claude 、Cohere Command 、Meta Llama 、Mistral AI が含まれます。 |
Bedrock の推奨事項に従い、Spring AI は、Spring AI のすべてのチャット会話実装に Amazon Bedrock の Converse API を使用するように移行しています。既存の InvokeModel API は会話アプリケーションをサポートしていますが、すべての Char 会話モデルに Converse API を採用することを強くお勧めします。 Converse API は埋め込み操作をサポートしていないため、これらは現在の API に残り、既存の |
前提条件
API アクセスの設定については Amazon Bedrock 入門 を参照してください
AWS 認証情報を取得する: AWS アカウントと AWS CLI がまだ設定されていない場合は、このビデオガイドが設定に役立ちます: Less での AWS CLI と SDK のセットアップは 4 分以内です ! (英語) 。アクセスキーとセキュリティキーを取得できるはずです。
使用するモデルを有効にする: Amazon Bedrock に移動し、左側のモデルアクセス [Amazon] メニューから、使用するモデルへのアクセスを構成します。
自動構成
プロジェクトの Maven pom.xml
または Gradle build.gradle
ビルドファイルに spring-ai-bedrock-converse-spring-boot-starter
依存関係を追加します。
Maven
Gradle
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bedrock-converse-spring-boot-starter</artifactId>
</dependency>
dependencies {
implementation 'org.springframework.ai:spring-ai-bedrock-converse-spring-boot-starter'
}
Spring AI BOM をビルドファイルに追加するには、"依存関係管理" セクションを参照してください。 |
チャットのプロパティ
プレフィックス spring.ai.bedrock.aws
は、AWS Bedrock への接続を設定するためのプロパティプレフィックスです。
プロパティ | 説明 | デフォルト |
---|---|---|
spring.ai.bedrock.aws.region | 使用する AWS リージョン。 | 米国東部 -1 |
spring.ai.bedrock.aws.timeout | 使用する AWS タイムアウト。 | 5 分 |
spring.ai.bedrock.aws.access-key | AWS アクセスキー。 | - |
spring.ai.bedrock.aws.secret-key | AWS の秘密鍵。 | - |
spring.ai.bedrock.aws.session-token | 一時的な認証情報用の AWS セッショントークン。 | - |
プレフィックス spring.ai.bedrock.converse.chat
は、Converse API のチャットモデル実装を構成するプロパティプレフィックスです。
プロパティ | 説明 | デフォルト |
---|---|---|
spring.ai.bedrock.converse.chat.enabled | Bedrock Converse チャットモデルを有効にします。 | true |
spring.ai.bedrock.converse.chat.options.model | 使用するモデル ID。サポートされているモデルとモデル機能 [Amazon] を使用できます | なし。AWS Bedrock コンソールから modelId [Amazon] を選択します。 |
spring.ai.bedrock.converse.chat.options.temperature | 出力のランダム性を制御します。値の範囲は [0.0,1.0] です | 0.8 |
spring.ai.bedrock.converse.chat.options.top-p | サンプリング時に考慮するトークンの最大累積確率。 | AWS Bedrock のデフォルト |
spring.ai.bedrock.converse.chat.options.top-k | 次のトークンを生成するためのトークン選択の数。 | AWS Bedrock のデフォルト |
spring.ai.bedrock.converse.chat.options.max-tokens | 生成されたレスポンス内のトークンの最大数。 | 500 |
ランタイムオプション
ポータブル ChatOptions
または ToolCallingChatOptions
ポータブルビルダーを使用して、温度、maxToken、topP などのモデル構成を作成します。
起動時に、BedrockConverseProxyChatModel(api, options)
コンストラクターまたは spring.ai.bedrock.converse.chat.options.*
プロパティを使用してデフォルトのオプションを構成できます。
実行時に、Prompt
呼び出しに新しいリクエスト固有のオプションを追加することで、デフォルトのオプションをオーバーライドできます。
var options = ToolCallingChatOptions.builder()
.model("anthropic.claude-3-5-sonnet-20240620-v1:0")
.temperature(0.6)
.maxTokens(300)
.toolCallbacks(List.of(FunctionToolCallback.builder("getCurrentWeather", new WeatherService())
.description("Get the weather in location. Return temperature in 36°F or 36°C format. Use multi-turn if needed.")
.inputType(WeatherService.Request.class)
.build()))
.build();
String response = ChatClient.create(this.chatModel)
.prompt("What is current weather in Amsterdam?")
.options(options)
.call()
.content();
ツール呼び出し
Bedrock Converse API はツール呼び出し機能をサポートしており、モデルが会話中にツールを使用できるようにします。@Tool ベースのツールを定義して使用する方法の例を次に示します。
public class WeatherService {
@Tool(description = "Get the weather in location")
public String weatherByLocation(@ToolParam(description= "City or state name") String location) {
...
}
}
String response = ChatClient.create(this.chatModel)
.prompt("What's the weather like in Boston?")
.tools(new WeatherService())
.call()
.content();
java.util.function Bean をツールとしても使用できます。
@Bean
@Description("Get the weather in location. Return temperature in 36°F or 36°C format.")
public Function<Request, Response> weatherFunction() {
return new MockWeatherService();
}
String response = ChatClient.create(this.chatModel)
.prompt("What's the weather like in Boston?")
.tools("weatherFunction")
.inputType(Request.class)
.call()
.content();
詳細については、ツールのドキュメントを参照してください。
マルチモーダル
マルチモーダル性とは、テキスト、イメージ、ビデオ、PDF、DOC、HTML、MD などのデータ形式を含むさまざまなソースからの情報を同時に理解して処理するモデルの機能を指します。
Bedrock Converse API は、テキスト入力やイメージ入力などのマルチモーダル入力をサポートし、組み合わせた入力に基づいてテキストレスポンスを生成できます。
Anthropic、Claude、Amazon Nova モデルなど、マルチモーダル入力をサポートするモデルが必要です。
イメージ
Amazon Nova、Anthropic Claude、Llama 3.2 などのビジョンマルチモダリティをサポートするモデル [Amazon] の場合、Bedrock Converse API Amazon を使用すると、ペイロードに複数のイメージを含めることができます。これらのモデルは、渡されたイメージを分析して質問に答えたり、イメージを分類したり、提供された指示に基づいてイメージを要約したりできます。
現在、Bedrock Converse は、image/jpeg
、image/png
、image/gif
、image/webp
MIME 型の base64
エンコードされたイメージをサポートしています。
Spring AI の Message
インターフェースは、Media
型を導入することで、マルチモーダル AI モデルをサポートします。これには、Spring の org.springframework.util.MimeType
と、生のメディアデータ用の java.lang.Object
を使用して、メッセージ内のメディア添付ファイルに関するデータと情報が含まれます。
以下は、ユーザーテキストとイメージの組み合わせを示す簡単なコード例です。
String response = ChatClient.create(chatModel)
.prompt()
.user(u -> u.text("Explain what do you see on this picture?")
.media(Media.Format.IMAGE_PNG, new ClassPathResource("/test.png")))
.call()
.content();
logger.info(response);
入力イメージ test.png
:
「この写真に何が写っているか説明してください」というテキストメッセージとともに、次のようなレスポンスが生成されます。
The image shows a close-up view of a wire fruit basket containing several pieces of fruit. ...
ビデオ
Amazon Nova モデル を使用すると、ペイロードに 1 つのビデオを含めることができます。このビデオは、base64 形式または Amazon S3 URI を通じて提供できます。
現在、Bedrock Nova は video/x-matros
、video/quicktime
、video/mp4
、video/video/webm
、video/x-flv
、video/mpeg
、video/x-ms-wmv
、image/3gpp
MIME 型のイメージをサポートしています。
Spring AI の Message
インターフェースは、Media`
型を導入することで、マルチモーダル AI モデルをサポートします。これには、Spring の org.springframework.util.MimeType
と、生のメディアデータ用の java.lang.Object
を使用して、メッセージ内のメディア添付ファイルに関するデータと情報が含まれます。
以下は、ユーザーテキストとビデオの組み合わせを示す簡単なコード例です。
String response = ChatClient.create(chatModel)
.prompt()
.user(u -> u.text("Explain what do you see in this video?")
.media(Media.Format.VIDEO_MP4, new ClassPathResource("/test.video.mp4")))
.call()
.content();
logger.info(response);
入力イメージ test.video.mp4
:
「このビデオで何が見えますか?」というテキストメッセージとともに、次のようなレスポンスが生成されます。
The video shows a group of baby chickens, also known as chicks, huddled together on a surface ...
文書
一部のモデルでは、Bedrock では、Converse API ドキュメントサポートを通じてペイロードにドキュメントを含めることができます。ドキュメントはバイト単位で提供できます。ドキュメントサポートには、以下で説明する 2 つの異なるバリエーションがあります。
テキストドキュメントの種類 (txt、csv、html、md など) では、テキストの理解に重点が置かれます。これらのユースケースには、ドキュメントのテキスト要素に基づいて回答することが含まれます。
メディアドキュメントの種類 (pdf、docx、xlsx) では、質問に答えるための視覚ベースの理解に重点が置かれています。これらのユースケースには、チャートやグラフなどに基づいて質問に答えることが含まれます。
現在、Anthropic PDF サポート (ベータ) (英語) および Amazon Bedrock Nova モデルはドキュメントのマルチモーダル性をサポートしています。
以下は、ユーザーテキストとメディアドキュメントの組み合わせを示す簡単なコード例です。
String response = ChatClient.create(chatModel)
.prompt()
.user(u -> u.text(
"You are a very professional document summarization specialist. Please summarize the given document.")
.media(Media.Format.DOC_PDF, new ClassPathResource("/spring-ai-reference-overview.pdf")))
.call()
.content();
logger.info(response);
入力として spring-ai-reference-overview.pdf
ドキュメントを受け取ります:
「非常にプロフェッショナルなドキュメント要約の専門家です。指定されたドキュメントを要約してください。」というテキストメッセージとともに、次のようなレスポンスが生成されます。
**Introduction:** - Spring AI is designed to simplify the development of applications with artificial intelligence (AI) capabilities, aiming to avoid unnecessary complexity. ...
サンプルコントローラー
新しい Spring Boot プロジェクトを作成し、依存関係に spring-ai-bedrock-converse-spring-boot-starter
を追加します。
src/main/resources
に application.properties
ファイルを追加します。
spring.ai.bedrock.aws.region=eu-central-1
spring.ai.bedrock.aws.timeout=10m
spring.ai.bedrock.aws.access-key=${AWS_ACCESS_KEY_ID}
spring.ai.bedrock.aws.secret-key=${AWS_SECRET_ACCESS_KEY}
# session token is only required for temporary credentials
spring.ai.bedrock.aws.session-token=${AWS_SESSION_TOKEN}
spring.ai.bedrock.converse.chat.options.temperature=0.8
spring.ai.bedrock.converse.chat.options.top-k=15
以下はチャットモデルを使用するコントローラーの例です。
@RestController
public class ChatController {
private final ChatClient chatClient;
@Autowired
public ChatController(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
@GetMapping("/ai/generate")
public Map generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
return Map.of("generation", this.chatClient.prompt(message).call().content());
}
@GetMapping("/ai/generateStream")
public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
return this.chatClient.prompt(message).stream().content();
}
}