ここはssig33のmicroblog.pubのアーカイブです。
現在は @ssig33@hollo.ssig33.com に移行しています。そちらをフォローしてください。
Amazon Bedrock Runtime API で Claude 2 を使う
みなさんこんにちは。 OpenAI の API は使っていますか?使っている人が多いと思います。これにかんしては世間にも情報が多いので何も言うことはありません。
ところで、 OpenAI の API においては gpt-3.5-turbo-16k というモデルでは 16000 token まで入力することができます。これって日本語の文字数にしてどれくらいになるんでしょうか?このあたりブラックボックスなのでなんとも言えないのですが、入出力あわせて 15000 字程度は扱えると思っておけばだいたいよさそうです。
15000 字というのは多いようで少ない量で、ちょっと変なことをやっているとすぐ頭をぶつける量です。このなかで工夫して価値があるものを作るのもよいのですが、制限がない世界も見てみたい。
そういうときには Anthropic という会社が提供している Claude 2 というモデルを使うのがよいでしょう。これは 10 万トークンまで扱えるようです。これが日本語で何文字相当なのか僕は知りません。まだ頭をぶつけたことがないからです。「日本語で出版されている本をまるまる読ませる」とかだとさすがにまだキツい感じがしますが、しかし事実上無限に近い処理能力があります。
この Claude 2 を API 経由で使うというかプログラムに組込む場合は AWS が提供している Amazon Bedrock Runtime API というサービスを使うのがよさそうです。しかしマジでこの世の誰もこれを使っていないためわたくしは手探りで使い方を調べることになりました。生成AIって本当に流行ってんの?
Ruby から使う場合以下のようにするとよいしょう。
コードは以下のようなかんじ
prompt = <<~PROMPT
Human: ChatGPT の Prompt 相当のメッセージをここに書く。
Assistant:
PROMPT
# http_reqd_timeout の指定は必須です。デカい入力を渡した場合レスポンスは相応に遅くなります。
bedrock = Aws::BedrockRuntime::Client.new(region: 'us-east-1',
http_read_timeout: 360)
payload = {
prompt:,
max_tokens_to_sample: 2400,
temperature: 0.1,
top_p: 0.9
}
res = bedrock.invoke_model({
accept: 'application/json',
body: payload.to_json,
content_type: 'application/json',
model_id: 'anthropic.claude-v2'
})
result = res.body.read.to_s
puts result
プロンプトに HUMAN: ASSISTANT: などと謎の呪文とその前後の改行がありますがこれは必須です。コード中にもコメントしましたがレスポンスは非常に遅い(体感で 1 万トークンあたり 45 秒前後)ので http_reqd_timeout の指定は必須です(非同期に結果を取りにいくような仕組みはおそらくありません)。あとのアレコレは OpenAI の API に慣れてればまあ分かるんじゃないですかね?
利用料金は天文学的であり、 10 万トークンフルでぶちこむと 1 実行で 150 円ぐらいかかります。性能的には「多少気が効かなくなった gpt-3.5-turbo ぐらい」という感じ。コストパフォーマンスが見合うものであるかは、まあ人それぞれでしょう。ぼくの場合は「それでも使いたい」というユースケースが手元にあります(具体的にはテレビ番組の字幕ファイルを Claude 2 に突っ込んでテレビ番組の目次と要約を生成させています)。
何もかも Claude 2 でやると性能的にも金額的にもマズいことになるので「デカいデータを GPT-3.5 や GPT-4 で処理可能な領域にまで圧縮する」みたいな使い方は結構有効な気がしますね。