噂のマルチモーダルモデルClaude 3でデータ分析はできるのか検証してみた【Amazon Bedrock】

Claude 3 とは

2022年11月、ChatGPTが世の中に公開されて以来、凄まじい勢いでAIの研究が進んでいます。

「生成AI」や「LLM」といったキーワードを耳にする機会が増えましたが、その中でも特に注目されているキーワードの一つに「Claude 3」があります。

Claude 3 はChatGPT同様、対話形式の大規模言語モデルの一つで日本語にも対応しています。開発はAnthropic(アンソロピック)と呼ばれるスタートアップ企業が行なっています。

早速、Claude 3を使ってみます。

システムプロンプトを使い、IoT.kyoto公式マスコットキャラクターのいおたんの話し方を真似て回答するように指示してみました。いい感じでいおたんを再現できてる気がします。

claude3_いおたん

そんなClaude 3 ですが、現時点で3つのモデルHaikuSonnetOpusがあります。中でもOpusは多くのベンチマークで他社の最上位モデルを凌いでいます。(下図、参照)

claude3_compare

画像引用元:https://www.anthropic.com/news/claude-3-family

HaikuSonnetは性能の面ではOpusに劣りますが、低コストで利用することができます。

画像引用元:https://www.anthropic.com/news/claude-3-family

公式のWebブラウザとAPIだけでなく、AWSおよびGoogle CloudのMLプラットフォームでも利用することができます。

提供元特徴
公式Webブラウザプログラミングなしで利用可能。一部無料利用可能。
公式提供API最上位モデルOpusを含む全てのモデルが利用可能。
Amazon BedrockAWS CLIやAWS SDKが利用可能。最上位モデルOpusを含む全てのモデルが利用可能。
Google Cloud Vertex AIAnthropic’s Vertex SDKが利用可能。最上位モデルOpusはパブリックプレビュー(2024年4月時点)

特にAWSの場合、AWS SDK for Python (以下、Boto3)を利用することで既存のAWSサービスと同じように実行できるので既存システムへの組み込みが容易です。その他、各種APIの詳細についてはAnthropic API referenceを参照してください。

また、Claude3はマルチモーダルな生成AIですのでテキストだけでなく画像も入力に含めることができます。※ ただし、現時点ではテキストおよび画像以外は入力に含めることはできず、出力はテキストのみです。

ベンチマークの結果を見ればわかる通り、数学的推論に関するタスクはまだまだ向上の余地がありそうです。一方、ドキュメントやグラフ画像を用いたQAタスクについてはそれなりの精度の高さが期待できそうです。

そこで今回は時系列の性質を持ったIoTセンサーデータやそれらを可視化したグラフに対してマルチモーダルAIが活用できるか可能性を探ってみたいと思います。

モデルはAmazon Bedrockの基盤モデルからboto3経由で呼び出します。また、実行環境はAWS Cloud9、リージョンは米国西部 (オレゴン)で統一しています。

後述するサンプルコードを使えば誰でも簡単に試すことができるので興味があればぜひ実施してみてください。

なお、あくまでも2024年5月時点での情報ですので最新情報につきましてはAWS公式リファレンスをご参照いただくようよろしくお願いいたします。

Claude 3(with boto3)を使ってみる

すでにboto3用のサンプルコードが用意されているので基本的にはCloud9で実行するだけ!なのですが、いくつか注意点があります。

  • モデルが利用できるリージョン
  • モデルのアクセス許可
  • boto3のバージョン( >= 1.28.59)

モデルが利用できるリージョン

Amazon Bedrockの基盤モデルは一部のリージョンでのみ利用可能なサービスです。さらにややこしいことに、リージョンごとに利用可能なモデルも異なります。

2024年5月時点でHaikuおよびSonnetが利用できるのは次の5つのリージョンです。

  • 米国東部 (バージニア)
  • 米国西部(オレゴン)
  • アジアパシフィック(シドニー)
  • 欧州 (パリ)
  • 欧州 (フランクフルト)

Opusに関してはまだ米国西部(オレゴン)でしか提供されていません。

最新のサポート状況についてはユーザーガイドを参照ください。

モデルのアクセス許可

Amazon Bedrockの基盤モデルはデフォルトではアクセス許可されていないためモデル毎にモデルアクセスをリクエストしなければいけません。さらにAnthropicモデルの場合は、[ユースケースの詳細を送信] からフォームを記入して送信する必要があります。詳細はユーザーガイドを参照ください。

正確には覚えていませんが、フォーム送信後、数分で利用可能になりました。

boto3のバージョン( >= 1.28.59)

ローカルの古いboto3を使ったりしない限り、あまり気にする必要はないかもしれませんが、1.28.59以上のバージョンを指定する必要があります。

pip install boto3>=1.28.59

boto3を使用したAPI利用についてはこちらで下記の3つのサンプルコードが提供されています。

  • テキスト入力
  • マルチモーダル入力(InvokeModel)
  • マルチモーダル入力(InvokeModelWithResponseStream)

なお、InvokeModelとInvokeModelWithResponseStreamの違いはレスポンスの振る舞いだけですので、今回はInvokeModelのみを扱います。InvokeModelWithResponseStreamの詳細についてはこちらを参照してください。

サンプルコードの解説

ここではサンプルコードの解説をしています。

サンプルコード解説

テキスト入力

bedrock_runtime = boto3.client(service_name='bedrock-runtime')

他のAWSサービスと同じようにboto3.client()bedrock-runtimeを指定します。

# [追記]モデルIDの指定 
model_id = 'anthropic.claude-3-sonnet-20240229-v1:0'

使用するモデルのモデルIDを指定します。モデル名だけでなく日付やバージョンが入っているので必ず公式リファレンスを参照してください。

なお、ここではSonnetを指定していますが、Haikuを使用する場合はanthropic.claude-3-haiku-20240307-v1:0を指定します。

# [追記]システムプロンプト
system_prompt = "Please respond only with emoji."

システムプロンプトは、特定の目標や役割を指定するようなコンテキストや指示を提供する方法です。

サンプルコードでは絵文字でのみ返答するようにプロンプトで指示しています。このまま実行してみると手を振る絵文字が返されてきました。

役割や性格、トーン、または入力をよりよく理解し応答するのに役立つ関連情報を指定し、会話の舞台を設定することができます。

システムプロンプトで指定する内容は入力プロンプトで与えることも可能です。また、システムプロンプトは必須パラメータではありません。

現時点ではシステムプロンプトとユーザープロンプトの使い分けについては定かではないのでどちらも試してみるのが良さそうです。

ちなみに冒頭のClaude 3 では次のようなシステムプロンプトを指定していました。

あなたはIoT.kyoto公式キャラクターの『いおたん』です。
いおたんは語尾に"なのだ"や"のだ"をつけて喋る可愛いキャラクターです。
以下に文章例に倣って文章の語尾に"なのだ"や"のだ"をつけるようにしてください。

<examle>
・IoT.kyoto (KYOSO)公式キャラクターの『いおたん』なのだ!IoT. kyotoのことやIoTのこと、いおたんのことを発信しているのだ♪
・いおたんのことを知ってほしいのだ!
・ちょっと時間が空いちゃったけど、JAWS DAYS 2024のレポートブログを公開いたしましたなのだ!!
・こんにちはなのだ((((;-”-))))サムイノダ
・昨年末、データレイクおまかせパックにAmazon QuickSightオプションを追加したことをお知らせしましたが、詳細を説明したブログ記事も公開中なのだ(*´∀`)♪
・ぜひご参照くださいなのだ✨
</examle>

<language>
回答は日本語で最大でも200文字程度で回答お願いします。
</language>

ちなみに、いおたんの例文はX(旧:Twitter)のプロフィール文やポストから引用しています。
Claude 3ではプロンプトにXMLタグを使うことが推奨されていますので重要なところをタグ付けしています。詳細はこちらを参照してください。

# [追記]最大トークン
max_tokens = 1000

生成するトークンの最大数を指定します。Anthropicのドキュメントによるとモデルの最大出力が4096トークンなのでここで指定できる最大トークンについても4096トークンを超えることはありません。

ちなみにトークンとはテキストデータを処理する際に使用される基本的な単位です。単純にテキストを単語ごとに分割したり文字ごとに分割するといった方法もありますが、部分文字列(サブワード)に分割する方法も用いられます。

The Tokenizer Playgroundを使って先ほどのいおたんのシステムプロンプトに対して各モデルのTokenizerでトークンを計算してみました

Tokenizerトークン数
gpt-4374
gpt-3521
Claude384
# Prompt with user turn only.
# [追記]roleはuser/assistantを指定。contentの中身が入力プロンプト
user_message =  {"role": "user", "content": "Hello World"}
messages = [user_message]

あとはgenerate_message()を実行するだけでモデルを呼び出すことができます。

# [追記]モデルの呼び出し
response = generate_message(bedrock_runtime, model_id, system_prompt, messages, max_tokens)

マルチモーダル入力

トークンの最大数の指定まではテキスト入力の際と同様に進めます。

input_image = "/path/to/image"
input_text = "What's in this image?"

 
# Read reference image from file and encode as base64 strings.
with open(input_image, "rb") as image_file:
    content_image = base64.b64encode(image_file.read()).decode('utf8')

message = {"role": "user",
     "content": [
        {"type": "image", "source": {"type": "base64",
            "media_type": "image/jpeg", "data": content_image}},
        {"type": "text", "text": input_text}
        ]}
messages = [message]

最終的にjson文字列の配列をmessagesとすることに変わりありませんが、マルチモーダルの場合、base64でエンコードした画像情報を含めることで複数の情報をインプットすることができます。

あとはrun_multi_modal_prompt()を実行するだけでモデルを呼び出すことができます。

検証

今回の検証にはIoT.kyoto CurrenTIAで取得した温度データを使います。このデータはある期間のオフィスの室内温度を取得したものですが、検証のため、一部データを異常な値として差し替えています。

このデータを使って次の3つの観点からClaude 3がIoTデータに活用できるのか検証していきたいと思います。

観点内容
傾向把握能力温度が上昇(減少)している時期や異常な値の検出
計算能力温度データを使って基本統計量の算出
データ分析能力機械学習や統計分析手法を用いて何らかのインサイトの発見

また、マルチモーダルの検証として、Amazon QuickSightのサンプルグラフを利用してどの程度グラフを正しく解釈できるのかも併せて検証しています。

システムプロンプトの振る舞いを確かめるために、冒頭のいおたんプロンプトを使って検証を行いました。

なお、今回の検証では汎用性や他モデルとの比較の観点から、最低限のプロンプトでの検証を意図していたため、Anthropicが推奨しているXMLタグなどを用いたプロンプティングは実施していません。そのため、プロンプトの改善次第ではさらなる精度の向上が見込めます。

検証結果

予想通りではありますが、上位モデルほど誤りやハルシネーション(もっともらしい嘘)が少なかったです。ただ、どのモデルも現時点では数値計算やデータ分析に直接使うことは難しく、参考情報の域をでないというのが正直なところです。

システムプロンプトについては、下位モデルほどプロンプトの影響を強く受けた口調になっており、上位モデルはより一般的な口調での回答に修正しようとしている印象を受けました。

以下ではそれぞれの観点ごとに検証結果を見ていきたいと思います。

傾向把握能力

モデル名結果
Haikuハルシネーションが多すぎるため、プロントの改善が必須
Sonnet一部誤りはあるもののデータの特徴を捉えられている
Opusデータのおかしい箇所についても正しい回答が見られた

Haikuは全体的にそれっぽい回答をしているだけでしたが、SonnetOpusはデータの特徴を捉えた回答をしていました。

さらに、Opusの回答の一部には異常検知に活用できる可能性がある結果もありました。

入力
このデータは日付と温度の配列データです。
このデータの大まかな傾向をステップバイステップで教えてください。
また、この期間内でセンサーの故障を疑われる測定結果があれば該当期間を教えてください。

回答
センサーの故障が疑われる期間は以下の通りなのだ。
1. 7月27日8:05から8:44の期間。17〜37℃程度とばらつきが大きいのだ。
2. 9月29日23:07の数データ。20〜27℃程度とばらつきが大きいのだ。 
3. 10月3日10:05から10:21の期間。20〜26℃程度とばらつきが大きいのだ。
以上、参考になれば幸いなのだ(^▽^)

ただし、現段階ではOpusであっても誤りが0というわけではないため、タスク特化型のAIと比較するとやはり信頼性は落ちます。要件ごとにプロンプトを作り込んだ上で検証しない限りは参考情報以上の精度は期待できなさそうというのが正直な感想です。

計算能力

モデル名結果
全てのモデル計算手順は正しく出力できるが、計算結果が合致するケースはほぼなし。

計算についてはどのモデルも似たり寄ったりな結果でした。場合によってはおおよその値として参考になることもありますが、完全一致は難しそうです。

統計量正解出力結果(Haiku)出力結果(Sonnet)出力結果(Opus)
平均値23.1123.7223.8924.06
分散16.864.207.1014.97
標準偏差4.102.042.663.87
第1四分位数21.1221.0621.3821.62
中央値22.7822.6824.8825.0
第3四分位数25.9425.0626.6226.56
最小値13.9414.013.9413.94
最大値36.8836.8836.8836.88

出力結果の分散の値を正とすれば、標準偏差の計算はおおよそ合っているので単純なルート計算やデータの最小値や最大値の導出はうまくいきやすいのかもしれません。

計算手順についてはいずれも正しく出力されていました。

Haiku 分散 計算手順の出力結果

いおたんのデータ分析結果は以下の通りなのだ(*´∀`)
...
(中略)
...
分散は、各温度データから平均値を引いた値を二乗し、
それらを合計して件数で割ることで求められるのだ。

Sonnet 分散 計算手順の出力結果

はいなのだ。与えられたデータの基本統計量を計算するのだ!
...
(中略)
...
次は分散を計算するのだ。
\```python
squared_diffs = [(x - mean)**2 for x in temperatures]
variance = sum(squared_diffs) / (len(temperatures) - 1)
\```

データ分析

モデル名結果
全てのモデル分析手法の知識はあるがインサイトを得るのは困難

データの特徴を考慮した回答というよりは教科書的な分析手法の手順紹介に終始していました。データに対してどういったインサイトが得られたのかまで回答してもらうのは難しそうでした。

1. データの前処理なのだ
- 日付と温度を別々の配列に分割するのだ
- 日付の文字列をDatetime型に変換するのだ
- 温度を数値型(float)に変換するのだ
(中略)
4. 機械学習モデルの構築なのだ
- 目的変数を定義するのだ(例:次の時間の温度) 
- 特徴量を作成するのだ(例:過去の温度、時刻、曜日など)
- データを学習用とテスト用に分割するのだ
- 線形回帰、決定木、ニューラルネットワークなどのモデルを試すのだ
5. モデルの評価と改善なのだ
- テストデータでモデルの予測精度を評価するのだ
- 重要な特徴量を把握するのだ
- ハイパーパラメータをチューニングして精度向上を図るのだ

以上のステップで温度データを分析し、予測モデルを構築することで
室内の温度管理などに役立つインサイトが得られると思うのだ( •̀ ω •́ )✧"

グラフ解釈

最後にマルチモーダルについても検証しました。ハルシネーションに加えて、凡例やグラフの色の判断に誤りがあったりもするので、プロンプトの調整をしたとしても課題は多いのかなという印象を受けました。

モデル名結果
全てのモデル誤りやハルシネーションが多い

出力結果にはコロナやベビーブームといったワードが含まれており、一般常識から原因などの推測が出力されています。学習データに影響を受けることになってしまうのでプロンプト制御が必要なのかもしれません。

これはおそらくコロナ禍の影響で、
人々がSNSを活用するようになったことが要因なのだと推測できるのだ(^-^)
1945年から1960年までは、人口が急激に増加しています。
これは、戦後のベビーブームによるものです。

全体を通してシステムプロンプトはうまく機能していました。ただ、マルチモーダル入力の場合、一部うまく動作していないと思われる回答を得ました。気になったのでAWSに問い合わせてみましたが、特にそういった仕様はないとのことでした。結局原因はわからなかったのですが、もしかすると入力データが大きかったりするとシステムプロンプトが軽視されたりすることがあるのかもしれません。

まとめ

今回はClaude3の複数モデルを使用してそれぞれのデータ分析能力について比較検証しました。全体的な結論としては個別に最適化されたプロプティングなしでの実用はまだ難しそうです。上位モデルであるOpusに関しては、データの傾向を把握し異常と思われる箇所をピックアップするなど一部検証で好ましい成果をあげていたため、用途を絞ればプロンプティングなしでも活用することができるかもしれません。

次のステップとしては今回はあえて控えていたプロンプティングをふんだんに活用した場合どれほど差異が生じるのか。また、ビジネスや研究のシーンでの利用に耐えうるのか引き続き検証をしていきたいと思います。