🚀

LambdaからAWS SDK for JavaScript v3を使ってBedrock (Claude 3.5 Sonnet)を呼び出す

2025/02/14に公開

この記事に書いてあること

  • BedrockのAPIを叩く最低限のコード
  • 学んだこと
    • ドキュメントについて
    • リクエストBodyについて
    • トークンについて
    • 料金

この記事に書いてないこと

Amazon Bedrockとは?

コード

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のドキュメントにリクエストパラメータが記載されていない
  • 主なリクエスト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トークン以上になることもある
    • messages[].role
      • userassistant のどちらかを指定する
      • リクエスト時に会話履歴の構造を配列で渡すことが可能
      • 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: "以前の回答を小学三年生のように返答してください",
              },
          ]
          // 会話履歴なしのため、プロンプト単体に対する回答が返ってくる
          
  • 英語/日本語プロンプトによるトークン数を比較してみた
    • APIのレスポンスでトークン数が返されるため、英語/日本語で同じような質問をするとトークン数がどのようになるか確認する
    • 英語
      • 入力: Please explain differential and integral calculus.
        • 単語数: 6
        • トークン数: 15
      • 出力: (省略)
        • 単語数: 391
        • トークン数: 562
    • 日本語
      • 入力: 微分積分を説明して
        • 文字数: 9
        • トークン数: 16
      • 出力: (省略)
        • 文字数: 314
        • トークン数: 355
    • 意外に日本語のほうがトークン数が少なかった。入力内容によってこの辺は変わりそう。
  • 利用料金
    • 入力トークン
      • 1,000トークン: 0.003 USD ≒ 0.48円
    • 出力トークン
      • 1,000トークン: 0.015 USD ≒ 2.42円

Discussion