Bedrockをはじめてみよう2

どうもこんにちは、Infrabbitです。

Bedrock第二回。今回はCLIやboto3から呼び出してみたいと思います。端末側環境をいちいち作って説明するのもめんどくさいので、とりあえずCloud Shell使いましょうそうしましょう。楽だし。

クライアント側の環境とかそもそもフロントエンドからSTSよんでどーのこーのってそもそもBedrock関係ないし。それくらいはすでにできていて当然、くらいの勢いです。まあ、AWS使うならそれくらいはできていてほしいです。

なので、ロジカルに進めましょう。

とりあえずCloud Shell起動します。まあboto3入っているんですが、念のためpip install -U boto3でアップデートだけしておきます。

じゃ、おもむろに呼び出します。まあまずはCLIからですね。サブコマンドはbedrock-runtimeです。

といってもbedrock-runtimeにはhelpを除けば6つしかコマンドありません。イージーゲームです。

  • apply-guardrail
  • converse
  • get-async-invoke
  • invoke-model
  • list-async-invokes
  • start-async-invoke

これだけです。で、とりあえずガードレールは無視しまして、最終的に使用するのはおそらく便利だからconverseが多いんじゃないかな、とは思います。とはいえ、単発呼び出しの基本も抑えなければなりますまい。

呼び出しの基本はLambda同様invokeです。invoke-modelでモデル毎にパラメータを与えながら呼び出します。asyncついてるやつは非同期呼び出しなのでいったんこれもさっくり忘れます。

というわけでおっぱじめましょう。

invoke-modelにはたくさんのオプションの指定がありますが、重要なのはそんなに多くありません。

まず、どのモデルを呼び出すか、というモデルID。いきなりわからないですね。APIでさくっとリストも出せますが、当然マネジメントコンソールからも確認できるので安心してください、履いてますよ。

Model Catalog行って、対象のモデルを開けばその中にモデルID書いてあります。

で、次にbodyオプション、最後にoutfileなので、出力先です。そうです、たったこれだけです。

ただ、bodyの中身はちょっとめんどくさいですよ。json形式で、モデル毎のパラメータなどをセットしなければなりません。Titanの場合、以下のjsonです。

{
  "inputText":"this is where you place your input text",
  "textGenerationConfig":{
    "maxTokenCount":8192,
    "stopSequences":[],
    "temperature":0,
    "topP":1
  }
}

これは先ほどのモデルカタログの下の方にどんなパラメータが要るのか書いてあります。別のモデルを使うときはそこからご参考にどうぞ。AWSさんなんでちゃんとユーザーガイドにも書いてあります。

さて、内容的に難しいところはたぶんないと思うんですよね。まあなのでサクッとコマンド作りましょう。v2が入っていたので、とりあえずv1相当の仕様にする–cli-binary-format raw-in-base64-outを付与しています。

aws --cli-binary-format raw-in-base64-out bedrock-runtime invoke-model --model-id "amazon.titan-text-express-v1" --body "$( cat << EOF
{
  "inputText": "who are you?",
  "textGenerationConfig":{
    "maxTokenCount":300,
    "stopSequences":[],
    "temperature":0,
    "topP":1
  }
}
EOF
)" outfile.json

なんかWordpressの記事からコピペすると怒られるんですが、どっかに制御文字でも入ってるんかな。ちまちま書けばたぶん動きます。

outfile.jsonはこんな感じ。

{
  "inputTextTokenCount": 4,
  "results": [
    {
      "tokenCount": 37,
      "outputText": "\nI am Amazon Titan, a large language model built by AWS. It is designed to assist you with tasks and answer any questions you may have. How may I help you?",
      "completionReason": "FINISH"
    }
  ]
}

outputTextがLLMの回答ですね。一応コマンドラインからでもプロンプトには日本語突っ込んで大丈夫です。トークンもカウントされていますね。

さて、Invoke Modelは単発実行には悪くないので、一発処理してもらえればそれでよい場合などはこれでよいのですが、例えばチャットアプリのように前の文脈を使って会話をしたい場合にはこれでは成り立ちません。

BedrockはLang Chainなどのフレームワークの持つ機能を持たせたアプリケーションであり、APIリクエストはこのアプリケーションの利用方法となっています。

このため、BedrockはLLMの実行環境をマネージドすると同時に、アプリケーションとしての側面も強く持っているわけです。
そして、このBedrockにおいてはいわゆる「メモリ機能」の類、過去の会話を履歴として持ちつつ会話をする、ということもAWSのBedrock APIの中で行えます。

それが、converseサブコマンド、ということになります。

converseは、上記のInvoke ModelでModel毎に生じるパラメータのセッティングを隠蔽し、APIの利用者に極力余計なことを考慮せず、プロンプトを設計できるようになっています。

次回は、このconverseサブコマンドを見ていきましょう。

ただ、AWS CLIで連鎖するものを作るのはめんどくさいわかりにくいので、Pythonで軽く書くことにしましょう。ああ、書きたくねぇ…。めんどくせぇ…。と思ってたら普通にAWSドキュメントにサンプルコードあるからこれパクろうそうしよう。