Amazon Bedrockで使用できるClaudeモデルのトークン数をAnthropic SDKでカウントしてみた

2023.10.03

こんちには。

データアナリティクス事業本部 インテグレーション部 機械学習チームの中村です。

今回はAmazon Bedrockで使用できるモデルの一つであるAnthropic社のClaudeモデルについて、トークン数のカウント方法について調べてみたのでご紹介します。

始めに結論を申し上げますと、AnthropicのSDKでトークン数がカウントできるものの、厳密に一致するかどうかは不明という結果となっておりますのでご了承くださいm(_ _)m

ClaudeにはSDKがある

そもそもClaudeにもOpenAI社と同様、SDKがありました。

こちらにあるように、PythonとTypeScriptのSDKが準備されています。

Python側のGitHubレポジトリは以下です。

このREADMEにもあるようにTokenのカウントができるようですので、こちらで確認していきたいと思います。

Python環境

Python環境はローカルマシン内にRyeで構築しました。

Pythonのバージョンは3.10.13です。

ライブラリのバージョンは以下の通りです。

boto3==1.28.57
anthropic==0.0.305
polars==

必要なライブラリはpipなどお使いのPython環境に合わせてインストールされてください。

やってみた

トークン数のカウント

前述のGitHubレポジトリのREADMEにある通り、以下のようなコードでカウントができます。

from anthropic import Anthropic

client = Anthropic()
token_count = client.count_tokens('Hi there!')
print(token_count)

# 3

これだけではREADMEに書いてあることと変わらないので、まとまった文章で統計を取ってみました。

まとまった文章でのカウント

tiktokenの時と同様に以下の動画を書き起こしたデータを使用してみます。

前回書き起こしたWhisperのデータは以下のようなものでした。

はい、みなさんこんばんは。 クラスメソッドがですね、ラスベガスからリインベントの様子をお届けします。 Developers IEO in Las Vegas 2022ということで始めさせていただきます。 どうぞよろしくお願いします。 日本は今ですね、12月1日のお昼12時の時間帯だと思いますけれども、 こちらはですね、まだ11月30日の夜7時ということで、 ちょっと夜でですね、お疲れもあってちょっと変な感じになるんですけれども、 暖かく聞いていただければと思います。 はい、ちなみに今何人くらい入ってらっしゃるんですか?視聴者の方は。 104名です。 素晴らしいですね。 ありがとうございます。 この配信ではですね、 AWS Re-Invent 2022でですね、たくさんのアップデートだったりとかですね、 セッション、キーノート等ありましたので、ここまでで出ている情報をもとにですね、 クラスメソッドのエンジニアが注目した内容とか、 そういったものをですね、エンジニアメンバーから聞いていきたいと思います。 今回ですね、人数の都合上ですね、二部制となっておりまして、 今回今出ているのが前半のメンバーということで、 大体30分くらい目途でですね、後半のメンバーにチェンジしてお送りしていきたいと思います。 じゃあまずですね、今出ている前半メンバーの自己紹介をしたいと思いますので、 順によろしくお願いします。 はい、ARXジオン本部のコンサルティング部で働いてます。(...以下略)

これをPythonのtextという変数に入れておき、以下のようにトークン数をカウントします。

from anthropic import Anthropic

client = Anthropic()

token_count = client.count_tokens(text)
print(token_count)

# 20650

元のテキスト長と比較してみます。

token_count / len(text)

# 0.9500805152979066

元のテキスト長よりトークン数が少し少なくなるということが分かりました。

実際に合っているのか?

これが実際にあっているのか確かめようとしたのですが、Claudeモデルのレスポンスには入力のトークン数がどのようになっているかが得られないため、確認ができませんでした。

from anthropic import HUMAN_PROMPT, AI_PROMPT
from boto3.session import Session
import json

session = Session(profile_name="{プロファイル名}")

bedrock_runtime = session.client("bedrock-runtime", region_name="us-east-1")

sentence = "Hi there!"
resp = bedrock_runtime.invoke_model(modelId="anthropic.claude-v1",
    body=json.dumps({"prompt": f"{HUMAN_PROMPT} {sentence}{AI_PROMPT}", "temperature": 0.0, "max_tokens_to_sample": 300}))

body = resp["body"].read()
print(json.loads(body))

# {'completion': ' Hello! My name is Claude.', 'stop_reason': 'stop_sequence'}

実際はClaudeモデルはチャットモデルであるため、Human:Assistant:などのがユーザのクエリに対して付加されてリクエストされるため、上記で求めたトークン数とは厳密に一致しないことが予想されます。

また、クエリが短い場合はHuman:Assistant:が支配的になるため、元の文章より長くなることも考えられます。

ですので今回のトークン数カウント結果はあくまでご参考としてお考え下さい。

まとめ

いかがでしたでしょうか。結局厳密なトークン数は分からないという結果となってしまいましたが、本記事がご参考になれば幸いです。

ご参考

なお、OpenAI社についてはtiktokenを使うように案内があります。以下でご紹介していますのでご参考までに。