Amazon Bedrockのトークン数の確認方法

Amazon Bedrockの料金は以下に記載されています。

https://aws.amazon.com/jp/bedrock/pricing/

Claude2を見てみると、入力トークン1000、出力トークン1000と言われても…、という事でトークン数を確認します。
以前のこちらと同じ手順になります。

https://qiita.com/cyberBOSE/items/a42dfdd3f3103cf76245

# ログ出力の設定
Bedrockのログに入力トークンのカウントと出力トークンのカウントが出力されるので、CloudWatch Logsにログを書き出す設定をします。

まずロググループを作成します。保持期間は適当です。
長い期間のログを保持して分析等したい場合はS3に書き出す事も出来ます。
<img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573242/ae9c9d7d-6942-2084-d2d6-c265128f5acc.gif">

マネジメントコンソールのBedrockの左下のSettingsからこんな感じで設定します。
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573242/6137a364-3222-b023-dbc3-c48e77ed764b.gif">

これでCloudWatch Logsに出力されるようになります。
playgroundからの入力もAPIからの入力も出力されます。

:::note warn
2023/10/14現在 Model invocation loggingはpreview中であり、今後仕様が変わる可能性があります。
:::

# ログを確認する

playgroundから実行し、Claude2でログの出力内容を見てみます。
`inputTokenCount`と`outputTokenCount`が出力されています。

```json
{
    "schemaType": "ModelInvocationLog",
    "schemaVersion": "1.0",
    "timestamp": "2023-10-14T00:08:32Z",
    "accountId": "999999999999",
    "region": "us-east-1",
    "requestId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "operation": "InvokeModelWithResponseStream",
    "modelId": "anthropic.claude-v2",
    "input": {
        "inputContentType": "application/json",
        "inputBodyJson": {
            "prompt": "\n\nHuman: Hello\n\nAssistant:",
            "max_tokens_to_sample": 300,
            "temperature": 1,
            "top_k": 250,
            "top_p": 0.999,
            "stop_sequences": [
                "\n\nHuman:"
            ],
            "anthropic_version": "bedrock-2023-05-31"
        },
        "inputTokenCount": 10
    },
    "output": {
        "outputContentType": "application/json",
        "outputBodyJson": [
            {
                "completion": " Hello"
            },
            {
                "completion": "!",
                "stop_reason": "stop_sequence"
            }
        ],
        "outputTokenCount": 6
    }
}
```

# 入力トークン数の例
`Hello`の場合 → `10`
```json
"prompt": "\n\nHuman: Hello\n\nAssistant:",
"inputTokenCount": 10
```

`Hello World`の場合 → `11`
```json
"prompt": "\n\nHuman: Hello World\n\nAssistant:",
"inputTokenCount": 11
```
`Hello!!`の場合 → `11`
```json
"prompt": "\n\nHuman: Hello!!\n\nAssistant:",
"inputTokenCount": 11
```
`Hello\n(改行)`の場合 → `10`
```json
"prompt": "\n\nHuman: Hello\n\n\nAssistant:",
"inputTokenCount": 10
```
`Hello\n(改行)World`の場合 → `12`
```json
"prompt": "\n\nHuman: Hello\nWorld\n\nAssistant:",
"inputTokenCount": 12
```
`nice to meet you`の場合 → `13`
```json
"prompt": "\n\nHuman: nice to meet you\n\nAssistant:",
"inputTokenCount": 13
```
`こんにちは`の場合 → `15`
```json
"prompt": "\n\nHuman: こんにちは\n\nAssistant:",
"inputTokenCount": 15
```
`今日は`の場合 → `13`
```json
"prompt": "\n\nHuman: 今日は\n\nAssistant:",
"inputTokenCount": 13
```
`初めまして`の場合 → `14`
```json
"prompt": "\n\nHuman: 初めまして\n\nAssistant:",
"inputTokenCount": 14
```
`初めまして。私は山田です。`の場合 → `23`
```json
"prompt": "\n\nHuman: 初めまして。私は山田です。\n\nAssistant:",
"inputTokenCount": 23
```
`東京特許許可局`の場合 → `20`
```json
"prompt": "\n\nHuman: 東京特許許可局\n\nAssistant:",
"inputTokenCount": 20
```
との事。

# 出力トークン数の例
`Hello!`の場合 → `6`

```json
    "output": {
        "outputContentType": "application/json",
        "outputBodyJson": [
            {
                "completion": " Hello"
            },
            {
                "completion": "!",
                "stop_reason": "stop_sequence"
            }
        ],
        "outputTokenCount": 6
```
との事。