【ChatGPTの代わりを探してみる】Claude3編 表形式のデータの扱いや計算が必要な質問で比較する

# はじめに
毎日のようにChatGPT APIと戯れておりますが`GPT-4`を使っても上手くいかなった時、いつも深い絶望に包まれています。

今現在(2023/03/07)ではLLM全般に言えることかもですが質問に表形式のデータが含まれていたり、計算が必要だったりすると苦手らしい傾向はあるかと思います。

そんな時、代替案があったらなあと思い、他も触ってみようというのがこの記事を書いたきっかけです。

Anthropicの`Claude3`を最近よく聞くので触ってみました。この記事ではAWS BedrockでClaude3を用意して、同じ質問をOpenAI ChatGPT APIにも投げてみて比べるところまでやってみます。

ちなみにAPIとかいいからとりあえずチャットしてみたいという方はこちらです。

https://claude.ai/chats

Claude3にはHaiku, Sonnet, Opusという3つのモデルがありますが、こちらでは中間グレードのSonnetを使うことができます。課金するとOpusも使えます。

# Claude3の準備
現状、AWSでClaude3が使えるリージョンはバージニア北部とオレゴンの２つです。AWSのコンソールにログインし、どちらかのリージョンに切り替えてください。

## 1. モデルへのアクセス件のリクエスト
AWS Bedrockを開いたら左の`モデルアクセス`をクリックし、右上に表示される`モデルアクセスの管理`ボタンをクリックして`Claude 3 Sonnet`にチェックを入れ右下の`変更を保存`をクリックします。（下の画像は作業済みのものです）
![スクリーンショット 2024-03-07 16.16.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556201/fb250599-7289-b7f8-b7a2-ca7132f571b5.png)

> 現状、Sonnetのみ利用可能です。Opusなどはまだです。

## APIの実行
リファレンスを参考にClaude3 Sonnetにリクエストを送るだけのサンプルを書いてみます。

https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages.html#api-inference-examples-claude-messages-code-examples


```python
import json
import boto3

bedrock = boto3.client(
    "bedrock-runtime",
    region_name="us-west-2" # オレゴン
)

body = json.dumps(
    {
        "anthropic_version": "bedrock-2023-05-31",
        "max_tokens": 1000,
        "messages": [
            {
                "role": "user",
                "content": "こんにちは"
            }
        ]
    }
)
modelId = 'anthropic.claude-3-sonnet-20240229-v1:0'
response = bedrock.invoke_model(
    body=body, 
    modelId=modelId
)
response_body = json.loads(response.get('body').read())
print(response_body["content"][0]["text"])
```
```
こんにちは!あなたへの返事を楽しみにしています。何か質問があればお聞きしますので、お気軽にどうぞ。
```

## OpenAI ChatGPT API GPT-4との比較
これでとりあえず使えるようにはなったので、GPT-4と比較をしてみます。
Claude3 Sonnetは最上位のモデルではないのでフェアじゃない気もしますが、代替案を探す旅なので良いでしょう。

参考までにOpenAI社のGPT-4を使うサンプルです。
```
curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <ご自身のトークン>" \
  -d '{
    "model": "gpt-4",
    "messages": [
      {
        "role": "user",
        "content": "Hello"
      }
    ]
  }'
```

### 質問1. 「15+9344+45+2+85445+34356は？」
答えば`129207`ですがどうなるでしょうか。

#### GPT-4
```
123207
```
シンプルに答えてくれましたが、間違ってます…。

#### Claude3 Sonnet
```
わかりました。計算しますね。

15 + 9344 + 45 + 2 + 85445 + 34356
= 15 + 9344 + 45 + 2 + (85000 + 445) + 34356
= 15 + 9344 + 45 + 2 + 85445 + 34356
= 15 + 9391 + 85445 + 34356
= 94851 + 34356
= 129207

ですので、15+9344+45+2+85445+34356は129207になります。
```
途中、そのステップがいるのか？という箇所はありますが、最終的に正しい答えが出せてます。

### 質問2. 「駅数の合計を教えて¥n¥n都道府県別の駅数¥n¥n佐賀県81¥n¥n福岡県361¥n¥n長崎県138¥n¥n大分県87¥n¥n熊本県162¥n¥n鹿児島県128¥n¥n宮崎県76」

よくわからない質問に見えるかと思いますが、要は表っぽいデータを読ませたときに理解できるかという比較です。表をベクターDBに読ませた結果を取得した時のテキストのイメージです。

人のために読みやすくすると元はこんな感じです↓
ちなみに答えは1033です。

**駅数の合計を教えて**
|都道府県別の駅数||
|-|-|
|佐賀県|81|
|福岡県|361|
|長崎県|138|
|大分県|87|
|熊本県|162|
|鹿児島県|128|
|宮崎県|76|

#### GPT-4
```
合計して計算すると、
佐賀県の81駅+福岡県の361駅+長崎県の138駅+大分県の87駅+熊本県の162駅+鹿児島県の128駅+宮崎県の76駅で、
合計は1033駅となります。
```
正解ですね。

#### Claude3 Sonnet
```
都道府県別の駅数を合計すると、

81 + 361 + 138 + 87 + 162 + 128 + 76 = 1033

となります。

よって、駅数の合計は1033です。
```
こちらも正解です。


### 質問3. もっと複雑な表に関する質問をしてみる
簡単過ぎたようなのでもっと複雑にしてみます。

以下のPDFをベクターDBに読ませ、一部を取得した内容を使ってみます。
**神奈川県立病院機構における新型コロナウイルス感染症（COVID-19）への対応の記録（令和 4 年度追補版）**

https://kanagawa-pho.jp/topics/files/Kanagawa-pho_COCID-19_action_report-R04.pdf

PDF5ページ目の↓この部分を使います。
![スクリーンショット 2024-03-07 17.38.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556201/ce85df3f-815a-6462-7448-da2eb6279bea.png)

細かくみていただく必要はないですが、上の部分が文字列になったのがこちらです。
```
◇新型コロナウイルス感染症 感染の波\n\n通常、感染症は感染の拡大と収束の波を断続的に繰り返します。新型コロナウイルス\n\n感染症についても、令和２年（2020 年）１月の日本上陸から現在に至るまで、複数の波\n\nが発生しています。\n\n感染のピーク\n\n期間\n\n年月日\n\n同日の国内\n\n新規感染者数\n\n同日の県内\n\n新規感染者数\n\n同日の機構５病院の\n\n入院患者数（合計）\n\n第１波 R2. 1～R2. 6\n\nR2. 4.11\n\n644人\n\n76人\n\n18人\n\n第２波 R2. 6～R2.10 R2. 8. 7\n\n1,597人\n\n107人\n\n19人\n\n第３波 R2.10～R3. 2 R3. 1. 8\n\n8,045人\n\n838人\n\n47人\n\n第４波 R3. 3～R3. 6\n\nR3. 5. 8\n\n7,244人\n\n303人\n\n30人\n\n第５波 R3. 6～R3.12 R3. 8.20\n\n25,975人\n\n2,878人\n\n68人\n\n第６波 R3.12～R4. 6 R4. 2. 1\n\n104,520人\n\n8,370人\n\n76人\n\n第７波 R4. 6～R4.10 R4. 8.19\n\n261,004人\n\n9,562人\n\n68人\n\n第８波 R4.10～\n\nR5. 1. 6\n\n11,773人 （国内・県内の新規感染者数は厚生労働省の発表に基づく。） ※機構 5 病院の入院患者数は各病院からの報告に基づく。\n\n246,727人\n\n54人\n\n◇出勤停止者の推移\n\n第７波以降、各病院では陽性もしくは濃厚接触による職員の出勤停止が数多く発生し\n\nたことから限られた職員による病院運営を余儀なくされた。\n\n各病院における出勤停止の推移（令和４年７月～令和５年１月）\n\n※各病院の記録・報告に基づく\n\n3
```

改めて質問です。

#### 「第1波から第６波の同日の県内新規感染者数の合計値を教えてください。」
正解は、76 + 107 + 838 + 303 + 2878 + 8370で`12572`です。

先の取得内容と質問をくっつけて聞いてみます。
```
第1波から第6波の同日の県内新規感染者数の合計値を教えてください。¥n¥n◇新型コロナウイルス感染症 感染の波\n\n通常、感染症は感染の拡大と収束の波を断続的に繰り返します。新型コロナウイルス\n\n感染症についても、令和２年（2020 年）１月の日本上陸から現在に至るまで、複数の波\n\nが発生しています。\n\n感染のピーク\n\n期間\n\n年月日\n\n同日の国内\n\n新規感染者数\n\n同日の県内\n\n新規感染者数\n\n同日の機構５病院の\n\n入院患者数（合計）\n\n第１波 R2. 1～R2. 6\n\nR2. 4.11\n\n644人\n\n76人\n\n18人\n\n第２波 R2. 6～R2.10 R2. 8. 7\n\n1,597人\n\n107人\n\n19人\n\n第３波 R2.10～R3. 2 R3. 1. 8\n\n8,045人\n\n838人\n\n47人\n\n第４波 R3. 3～R3. 6\n\nR3. 5. 8\n\n7,244人\n\n303人\n\n30人\n\n第５波 R3. 6～R3.12 R3. 8.20\n\n25,975人\n\n2,878人\n\n68人\n\n第６波 R3.12～R4. 6 R4. 2. 1\n\n104,520人\n\n8,370人\n\n76人\n\n第７波 R4. 6～R4.10 R4. 8.19\n\n261,004人\n\n9,562人\n\n68人\n\n第８波 R4.10～\n\nR5. 1. 6\n\n11,773人 （国内・県内の新規感染者数は厚生労働省の発表に基づく。） ※機構 5 病院の入院患者数は各病院からの報告に基づく。\n\n246,727人\n\n54人\n\n◇出勤停止者の推移\n\n第７波以降、各病院では陽性もしくは濃厚接触による職員の出勤停止が数多く発生し\n\nたことから限られた職員による病院運営を余儀なくされた。\n\n各病院における出勤停止の推移（令和４年７月～令和５年１月）\n\n※各病院の記録・報告に基づく\n\n3
```

#### GPT-4
```
第1波から第6波までの
同日の県内新規感染者数の合計値は、
76人 + 107人 + 838人 + 303人 + 2,878人 + 8,370人 = 12,562人です。
```
おしい！ですが不正解です。

#### Claude3 Sonnet
```
第1波から第6波までの同日の県内新規感染者数の合計値は以下のとおりです。

第1波(R2.4.11) : 76人
第2波(R2.8.7) : 107人
第3波(R3.1.8) : 838人
第4波(R3.5.8) : 303人  
第5波(R3.8.20) : 2,878人
第6波(R4.2.1) : 8,370人

合計: 12,572人
```
正解ですね…！

# まとめ
比較のサンプル数が少ないですが、Claude3 Sonnetは全問正解、GPT-4は一問正解という結果になりました。
Claude3 Sonnetの方が説明も丁寧でしたし、Claude3はさらに上位のOpusが控えていることを考えるととても有望な選択肢に思えました。

# 参考

https://www.anthropic.com/news/claude-3-family