PostmanでBedrockのCommand-R+を使ってみた

# 目的
Postman を利用して Amazon Bedrock の Cohere Command R/Command R+ を使う方法を紹介します。

# 前提条件

- AWSコンソールの AWS Bedrock モデルアクセス から該当リージョンの該当モデルのアクセス権が有効になっていること。
- Amazon Bedrock ランタイム API のエンドポイントは [Amazon Bedrock エンドポイントとクォータ](https://docs.aws.amazon.com/ja_jp/general/latest/gr/bedrock.html#bedrock_region) の Amazon Bedrock APIs からリージョンを選択し、エンドポイントを参照すること。
- パラメータとして指定するモデル ID は [Amazon Bedrock model IDs](https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html) を参照すること。
- aws_access_key_id と aws_secret_access_key を設定しており適切な権限が付与されていること。

# 手順

cURL を使う方法もあるようですが`{"message":"The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details."`というエラーで Bedrock の一部のモデルは利用できませんでした。ということで Postman での利用方法を紹介します。awscurl を使えばこの問題は発生しないようです。

## Cohere Command-r/Command-r-plus を使う方法

URL を設定します。次の例は、北米西部オレゴン (us-west-2) の Cohere Command R+ をしている例となります。モデル ID は前提条件に記載のページをご確認ください。

次の URL は Command R+ の例です。Command R を使う場合は、URL のモデル ID 部分を cohere.command-r-v1:0 に変更すれば利用できます。

```
https://bedrock-runtime.us-west-2.amazonaws.com/model/cohere.command-r-plus-v1:0/invoke
```

次に、Authorization タブの Type より 'AWS Signature' を選択します。その上で次の4点を設定します。

```
aws_access_key_id: <Your AWS access key>
aws_secret_access_key: <Your AWS secret access key>

# Advanced configuration
region: us-west-2
service: bedrock
```

### Chat API の使い方

Body タブに次のような形でメッセージを入力します。
次の利用方法は、Chat API での利用方法となります。詳しくは[ドキュメント](https://docs.cohere.com/docs/chat-api)をご確認ください。


```json
{
    "message":"以下の文章の改善点を指摘してください。¥n「明日は、朝早くから仕事だ。夜のうちに資料を仕上げ、しっかりと準備をしなければいけない。きっと睡眠不足になりそうだ。だが、家族のためなら頑張れるだろう。」"
    }
```

レスポンスは次のようになりました。

```json
{
    "response_id": "9963706d-c50c-42bd-9a94-1929b4741f83",
    "text": "以下のように改善できます。\n\n「明日は朝早くから仕事なので、今夜は早めに資料を仕上げて、準備を整えておこう。睡眠不足は避けたいが、家族のために頑張りたい。」\n\n改善点は以下の通りです。\n\n- 「夜のうちに」という表現を、「今夜は早めに」に変更することで、文章の流れをスムーズにしました。\n- 「しっかりと準備をしなければいけない」という表現を、「準備を整えておこう」に変更することで、やや堅苦しい印象を和らげました。\n- 「きっと睡眠不足になりそうだ」という表現を、「睡眠不足は避けたいが」に変更することで、前向きな印象を与えました。\n- 「だが」という表現を、「ため」に変更することで、「だが」よりも柔らかい表現になり、文章の流れも自然になりました。\n- 「だろう」という表現を削除することで、より断定的な表現になり、文章に力強さが増しました。\n\nこれらの改善により、文章がよりポジティブで前向きな印象を与えるようになりました。",
    "generation_id": "1001eaf2-56db-4243-8827-6cfbd655c81a",
    "chat_history": [
        {
            "role": "USER",
            "message": "以下の文章の改善点を指摘してください。¥n「明日は、朝早くから仕事だ。夜のうちに資料を仕上げ、しっかりと準備をしなければいけない。きっと睡眠不足になりそうだ。だが、家族のためなら頑張れるだろう。」"
        },
        {
            "role": "CHATBOT",
            "message": "以下のように改善できます。\n\n「明日は朝早くから仕事なので、今夜は早めに資料を仕上げて、準備を整えておこう。睡眠不足は避けたいが、家族のために頑張りたい。」\n\n改善点は以下の通りです。\n\n- 「夜のうちに」という表現を、「今夜は早めに」に変更することで、文章の流れをスムーズにしました。\n- 「しっかりと準備をしなければいけない」という表現を、「準備を整えておこう」に変更することで、やや堅苦しい印象を和らげました。\n- 「きっと睡眠不足になりそうだ」という表現を、「睡眠不足は避けたいが」に変更することで、前向きな印象を与えました。\n- 「だが」という表現を、「ため」に変更することで、「だが」よりも柔らかい表現になり、文章の流れも自然になりました。\n- 「だろう」という表現を削除することで、より断定的な表現になり、文章に力強さが増しました。\n\nこれらの改善により、文章がよりポジティブで前向きな印象を与えるようになりました。"
        }
    ],
    "finish_reason": "COMPLETE"
}
```

### RAG での使い方

RAG を利用する場合はメッセージフォーマットが違います。[RAG の Request](https://docs.cohere.com/docs/retrieval-augmented-generation-rag)をご確認の上、試してください。 次の例は、最も背の高いペンギンはどこに住んでいますか？という質問と、3つのチャンクデータを渡している例です。

```json
{
    "message":"Where do the tallest penguins live?",
    "documents": [
        {"title": "Tall penguins", "snippet": "Emperor penguins are the tallest."},
        {"title": "Penguin habitats", "snippet": "Emperor penguins only live in Antarctica."},
        {"title": "What are animals?", "snippet": "Animals are different from plants."}]
    }
```

レスポンスは次のようになりました。

```json
{
    "response_id": "5414a694-7a5f-4f19-a7ff-37e8ed2ec42a",
    "text": "The tallest penguins are emperor penguins, which only live in Antarctica.",
    "generation_id": "6ab235af-20e2-44c5-9600-677f3508f3b4",
    "chat_history": [
        {
            "role": "USER",
            "message": "Where do the tallest penguins live?"
        },
        {
            "role": "CHATBOT",
            "message": "The tallest penguins are emperor penguins, which only live in Antarctica."
        }
    ],
    "finish_reason": "COMPLETE",
    "citations": [
        {
            "start": 25,
            "end": 41,
            "text": "emperor penguins",
            "document_ids": [
                "doc_0"
            ]
        },
        {
            "start": 49,
            "end": 73,
            "text": "only live in Antarctica.",
            "document_ids": [
                "doc_1"
            ]
        }
    ],
    "documents": [
        {
            "id": "doc_0",
            "snippet": "Emperor penguins are the tallest.",
            "title": "Tall penguins"
        },
        {
            "id": "doc_1",
            "snippet": "Emperor penguins only live in Antarctica.",
            "title": "Penguin habitats"
        }
    ]
}
```

# 費用について

[Amazon Bedrock の料金のページ](https://aws.amazon.com/jp/bedrock/pricing/)には次のように記載されています。Command R が OpenAI GPT-3.5-Turbo と同額、Command R+ が OpenAI GPT-4o より少しだけ安価という価格設定となっています。

![Bedrock_Pricing_Cohere.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1557529/378d9e0a-1898-f5a0-6ee5-284fad57f60f.png)


# モデルのパラメータサイズについて

Command R が 35B (350 億)パラメータ、Command R+ が 104B (1040 億) パラメータと Hugging Face のモデルサマリーページに記載がありました。