🚀
LambdaからAWS SDK for JavaScript v3を使ってBedrock (Claude 3.5 Sonnet)を呼び出す
この記事に書いてあること
- BedrockのAPIを叩く最低限のコード
- 学んだこと
- ドキュメントについて
- リクエストBodyについて
- トークンについて
- 料金
この記事に書いてないこと
- Bedrockのモデルを有効化する手順
- LambdaからBedrockのAPIを叩くために必要なアクセス権限ポリシーの設定方法
Amazon Bedrockとは?
- 複数のサードパーティー製AIモデルを提供するフルマネージドサービス
- VPC内で通信できる
- 入出力がモデルプロバイダーに提供されない
- サポートされているモデル
コード
import { BedrockRuntimeClient, InvokeModelCommand } from "@aws-sdk/client-bedrock-runtime";
const client = new BedrockRuntimeClient({ region: "ap-northeast-1" });
export async function handler() {
const res = await client.send(new InvokeModelCommand({
modelId: "anthropic.claude-3-5-sonnet-20240620-v1:0",
body: JSON.stringify({
anthropic_version: "bedrock-2023-05-31",
max_tokens: 2000,
messages: [
{
role: "user",
content: "こんにちは",
},
],
temperature: 0.5,
top_k: 250,
}),
}));
console.log(JSON.parse(Buffer.from(res.body).toString("utf-8")));
}
学び
-
AWS SDK for JavaScriptのドキュメントにリクエストパラメータが記載されていない
- 呼び出すモデルによってリクエストパラメータが異なるため、Bedrockのドキュメントに記載されている
- 主なリクエストBody
- temperature
- 0.0 ~ 1.0 で指定する
- 小さい値を指定すると同じプロンプトに対して同じ答えが出力されやすくなる
- 大きい値を指定すると同じプロンプトに対して異なる答えが出力されやすくなる
- top_p
- 0.0 ~ 1.0 で指定する
- 小さい値を指定するとより確実な答えを優先
- 大きい値を指定するとより自由度の高い(創造性のある)答えが出力される
- temperature とロジックがほぼ同じ
- 指定する場合は temperature or top_p のどちらかを指定する(同時に指定しない)
- top_k
- 0 ~ 500 で指定する
- テキスト生成モデルが次のトークンを選択する際に、確率の高い「上位k個の候補」からランダムに選択
- 例)
- top_k = 1: もっとも確率の高いトークンを選択
- top_k = 10: 確率の高い上位10個のトークンの中から選択
- top_k = 500: 確率の高い上位500個のトークンの中から選択
-
トークンとは?
- 英語の場合は 1トークン≒1単語
- スペースで区切られた単語ごと
- 単語の長さや複雑さによって1単語が1トークン以上になることもある
- 日本語の場合は 1トークン≒1文字
- 単語ごとに区切ることが難しいため、単語や漢字の組み合わせ毎にトークン化される
- 1文字=1トークンになるケースが多いが、単語によっては1トークン以上になることもある
- 英語の場合は 1トークン≒1単語
- messages[].role
-
user
かassistant
のどちらかを指定する - リクエスト時に会話履歴の構造を配列で渡すことが可能
- user: ユーザーからのプロンプト
- assistant: モデルからの返答。前回の回答を記録するために使用
- 例)
- 会話履歴あり
// 1回目のリクエスト messages: [ { role: "user", content: "こんにちは", }, ] // 2回目のリクエスト messages: [ { role: "user", content: "こんにちは", }, { role: "assistant", content: "{AIの返答}", }, { role: "user", content: "以前の回答を小学三年生のように返答してください", }, ] // 小学三年生のような口調で返答してくれる
- 会話履歴なし
// 1回目のリクエスト messages: [ { role: "user", content: "こんにちは", }, ] // 2回目のリクエスト messages: [ { role: "user", content: "以前の回答を小学三年生のように返答してください", }, ] // 会話履歴なしのため、プロンプト単体に対する回答が返ってくる
- 会話履歴あり
-
- temperature
- 英語/日本語プロンプトによるトークン数を比較してみた
- APIのレスポンスでトークン数が返されるため、英語/日本語で同じような質問をするとトークン数がどのようになるか確認する
- 英語
- 入力: Please explain differential and integral calculus.
- 単語数: 6
- トークン数: 15
- 出力: (省略)
- 単語数: 391
- トークン数: 562
- 入力: Please explain differential and integral calculus.
- 日本語
- 入力: 微分積分を説明して
- 文字数: 9
- トークン数: 16
- 出力: (省略)
- 文字数: 314
- トークン数: 355
- 入力: 微分積分を説明して
- 意外に日本語のほうがトークン数が少なかった。入力内容によってこの辺は変わりそう。
-
利用料金
- 入力トークン
- 1,000トークン: 0.003 USD ≒ 0.48円
- 出力トークン
- 1,000トークン: 0.015 USD ≒ 2.42円
- 入力トークン
Discussion