AWS BedRock(Java) を見よう見まねで実装してみる

AWSのBedRockが手軽に大規模言語モデルを実装できて面白そうなので試しに使ってみる。

公式ドキュメントのコードライブラリを参考に作成(事前にモデルアクセスの許可を設定しておいてください)
※東京リージョンで [Anthropic Claude 2.1] モデルが使用できるようになっているのでそちらを使用。
https://docs.aws.amazon.com/ja_jp/code-library/latest/ug/java_2_bedrock-runtime_code_examples.html
Spring Boot でWebアプリを作成していたので同じ環境に追加した。
```
@PostMapping("/getPrompt")
public String getPrompt(Model model, RedirectAttributes redirectAttributes) {


    // Anthropic ClaudeのモデルID
    String claudeModelId = "anthropic.claude-v2:1";

    // プロンプトをAnthropic Claudeの要求形式に合わせて記述します
    String enclosedPrompt = "Human: " + "Anthropicの最新モデルClaude 2.1について説明して " + "\n\nAssistant:";

    // BedrockRuntimeClientを構築します
    BedrockRuntimeClient client = BedrockRuntimeClient.builder()
                    .region(Region.AP_NORTHEAST_1) // リージョンを指定します
                    .credentialsProvider(ProfileCredentialsProvider.create()) // 資格情報プロバイダーを指定します
                    .build();

    // ペイロードを作成します
    String payload = new JSONObject()
                    .put("prompt", enclosedPrompt) // プロンプトをセットします
                    .put("max_tokens_to_sample", 200) // 生成テキストの最大トークン数を設定します
                    .put("temperature", 0.5) // テキスト生成時の温度を設定します
                    .put("stop_sequences", List.of("\n\nHuman:")) // 生成テキストの終了条件を設定します
                    .toString();

    // モデルの呼び出しを行います
    InvokeModelRequest request = InvokeModelRequest.builder()
                    .body(SdkBytes.fromUtf8String(payload)) // ペイロードをセットします
                    .modelId(claudeModelId) // モデルIDを指定します
                    .contentType("application/json") // コンテンツタイプを指定します
                    .accept("application/json") // Acceptヘッダーを指定します
                    .build();

    // モデルを呼び出し、レスポンスを受け取ります
    InvokeModelResponse response = client.invokeModel(request);

    // レスポンスボディをJSON形式に変換します
    JSONObject responseBody = new JSONObject(response.body().asUtf8String());

    // 生成されたテキストを取得します
    String generatedText = responseBody.getString("completion");
    System.out.println("Generated text: " + generatedText);
}
```
[claudeModelId], [enclosePrompt], [.region], [max_tokens_to_sample] を設定しておく。


```
出力結果
Generated text:  Claude 2.1はAnthropic社が開発した大規模言語モデルです。

主な特徴は以下の通りです:

- 170億のパラメータを持つ巨大モデル
- 高度な安全性と制御性を実現するConstitutional AIフレームワークを採用
- 自然言語処理と論理推論の両方に強い
- 人間レベルのコモンセンスを備え、複雑な質問にも適切に答えられる

Constitutional AIフレームワークはモデルの振る舞いを制御し、安全性を高める
```

もう少し情報量が欲しいので[max_tokens_to_sample]を200→300に変更。

```
// ペイロードを作成します
    String payload = new JSONObject()
                    .put("prompt", enclosedPrompt) // プロンプトをセットします
                    .put("max_tokens_to_sample", 300) // 生成テキストの最大トークン数を設定します
                    .put("temperature", 0.5) // テキスト生成時の温度を設定します
                    .put("stop_sequences", List.of("\n\nHuman:")) // 生成テキストの終了条件を設定します
                    .toString();
```
```
出力結果
Generated text:  Claude 2.1はAnthropic社が開発した大規模言語モデルです。

主な特徴は以下の通りです:

- 175 billionのパラメータを持つ巨大モデル
- 自己監視機能を搭載し、有害発言を検出・阻止できる
- 論理的かつ明快な会話が可能
- 人間の価値観に合わせてカスタマイズ可能

Claude 2.1は非常に大きなモデルである一方、安全性と制御可能性にも重点が置かれています。自己監視機能により有害発言を検出し、人間の介入なしで会話を 適切な方向に導くことができます。

また、人間の価値観や好みに合わせてモデルをカスタマイズすることも可能です。これにより、ユーザーごとに個性的で望ましい会話スタイルを実現できます。
```
使用したトークン量で請求金額がきまるので結構大事な設定な気がする・・・。