サーバーワークスの村上です。
このブログではAmazon Bedrockをモニタリングするツールについて、主にCloudWatchとWeights & Biasesを比較していきます。
後述しますが、Weights & BiasesはAWSサービスではなく、機械学習の実験管理などに使われるサードパーティ製のサービスです。
結論
CloudWatchとWeights & Biases、ぞれぞれどの機能でモニタリングするか、私なりの考えですがざっとまとめてみました。
モニタリング項目 | CloudWatch | Weights & Biases |
---|---|---|
ユーザーが入力した情報(prompt) | CloudWatch Log Insights | W&B TablesやW&B Prompts |
LLMが出力した情報(completion) | CloudWatch Log Insights。ただしストリーミング出力している場合は出力が分割して記録される | W&B TablesやW&B Prompts |
入出力トークン数 | CloudWatchメトリクスやCloudWatch Log Insights | W&B Tables |
出力に要した時間(レイテンシー) | CloudWatchメトリクス | W&B Tables |
認証情報 | モニタリング不可 | アプリケーションがユーザー名などの情報を持っている場合はW&B Tablesでモニタリング可能 |
総論 | 簡単に始められるが、モニタリングできる項目には限りがある | アプリケーションコードに少量のコードを書く必要があるが、自由度は高い |
詳細を記載していきます。
前提
以下のようなチャットボットを使っていると想定します。自然言語の生成を前提とし、画像生成は想定しません。
主なモニタリング事項
私の思いつく限りですが、以下のようなモニタリング事項があるかと思います。
- ユーザーが入力した情報(prompt)
- Amazon Bedrockが出力した情報(completion)
- 入出力トークン数と料金
- 出力に要した時間(レイテンシー)
- 認証情報(誰がAmazon Bedrockを呼び出したか)
AWSサービスを使ったモニタリング
(前提)Amazon Bedrockのモニタリング設定
前提としてAmazon Bedrockのモデル呼び出しをロギングするためには、設定を有効化する必要があります。
Amazon BedrockのコンソールにあるSettingsから、ログの出力先を選択します。S3やCloudwatch Logsが選択可能です。
CloudWatch Log Insightsを使ったモニタリング
CloudWatch Logsで取得できる情報は以前のブログでも紹介しました。
CloudWatch Logsではpromptやトークン数の情報が取得できますが、1つのログにはBedrockを1回呼び出した際の情報が記録されるので、例えば月間の呼び出し回数を集計するなど、LLMアプリケーションの全体の動きを俯瞰して見ることはできません。
そういった場合はCloudWatch Log Insightsを使って、ログをクエリする方法がおすすめです。
- 任意のロググループを任意の期間で検索することが可能です
- 必要な情報だけを選択して表示することができます(今回はpromptやトークン数を表示)
- ただしストリーミング出力を有効にしている場合、出力が分割されて記録されるため視認性に難があります。
実際にクエリしてみます。
promptをテンプレート化しているため、input.inputBodyJson.prompt
フィールドに定型文(Human: Use the following...
)しか見えていませんが、表示を展開することで詳細を確認することができます。
また、CloudWatch Log Insightsではいくつかのクエリ構文も利用できるので、例えば「トークン数に利用料単価を乗じて利用料金を表示させる」ような使い方も可能です。
ストリーミング出力している場合、出力が分割される
ストリーミング出力をしている場合、出力した内容は分割して記録されます。
以下はCloudWatch Logsの例ですが、outputBodyJson
内のcompletion
が配列として記録されています。
{ "schemaType": "ModelInvocationLog", "schemaVersion": "1.0", "timestamp": "2023-11-16T09:13:28Z", "accountId": "xxxx", "region": "xxxx", "requestId": "xxxx", "operation": "InvokeModelWithResponseStream", "modelId": "anthropic.claude-v2", "input": { "inputContentType": "application/json", "inputBodyJson": { "max_tokens_to_sample": 4096, "temperature": 0.1, "top_k": 250, "top_p": 1, "stop_sequences": [ "\n\nHuman" ], "prompt": "\n\nHuman: Use the following...xxxx" }, "inputTokenCount": xxxx }, "output": { "outputContentType": "application/json", "outputBodyJson": [ { "completion": " 日本の", "stop_reason": null, "stop": null }, { "completion": "首都は", "stop_reason": null, "stop": null }, { "completion": "東京です", "stop_reason": null, "stop": null } ], "outputTokenCount": xxxx } }
CloudWatch Log Insightsのフィールドでもoutput.outputBodyJson.0.completion
やoutput.outputBodyJson.1.completion
のように、別のフィールドとして認識されています。
CloudWatch Logsだとアプリごとのロギングはできない
さきほどAmazon BedrockのコンソールにあるSettingsからロギングを有効化すると記載しました。
この設定はリージョンごとの設定であり、例えば同一AWSアカウントの同一リージョンでBedrockを使ったアプリを複数ホストしている場合、全てのログがひとつのCloudWatchロググループに記録されてしまいます。
そのため、CloudWatch Logsだけでモニタリングしようとしている場合は、AWSアカウントを分けるなどの対応が必要と考えます。
もしくはアプリ側で別途、会話履歴などの必要な情報をDynamoDBに保存するような処理をしてもいいかもしれません。
レイテンシーやトークン数はCloudWatchメトリクスでも確認可能
CloudWatchメトリクスのInvocationLatency
やInputTokenCount
、OutputTokenCount
で確認できます。
CloudWatchメトリクスについてはモデル別に参照することができます。以下はオレゴンリージョンでのInvocationLatency
を表示させた様子です。
認証情報も記録したい場合は別の仕組みが必要
CloudWatch Logsには「誰が」にあたる認証情報は含まれません。
そのため誰が何をBedrockに入力したかモニタリングしたい場合は、アプリケーション側で実装する必要があると考えます。
例えばUIにSlackを使っている場合、誰が何を入力したか追跡可能なため、その情報をDynamoDBや後述するW&B Tablesに記録しておく、などの実装が考えられます。
サードパーティ製品を活用する
Weights & Biases
Weights & Biases(wandb)は機械学習の実験管理などに使われるツールです。wandbを使うときめ細かなモニタリングが可能です。
いくつか紹介させていただきます。
W&B Tables
W&B Tablesを使うと、表形式で任意の情報をモニタリングすることが可能です。テーブルに記録したい情報をアプリケーションのコード内に書いていくので、アプリで保持している情報なら自由にロギング可能です。
例えば以下では、Bedrockを呼び出すコードの直前でtimeモジュールを使って現在時刻を取得しておき、アプリへ出力した直後に再度現在時刻を取得して、処理に要した時間をelapsed_time
として記録しています。また、アプリケーションがユーザー情報も持っているので、一緒にテーブルに記録しています。
また、CloudWatch Log Insightsのinput.inputBodyJson.prompt
フィールドには、ユーザーの入力に加えプロンプトテンプレートのHuman: Use the following...
が含まれていました。
しかし、こういったお決まりの文句は見ても仕方ないので、以下のようにユーザーが入力した情報だけを表示し、トークン数のカウントではプロンプトテンプレートを含む全体のトークン数を表示する、といったことも可能です(これくらいの処理ならCloudWatch Log Insightsのクエリ構文を駆使してできそうではありますが)。
さらに、GUI上でcost列を追加し、計算式を使って利用料金を表示させる、ような使い方も可能です。
さらにさらに、W&B Tablesなら画像などの情報も記録可能です。冒頭に記載したとおり自由度が高い点が魅力です。
W&B Prompts
W&B PromptsではLLMのチェーンやエージェントを使っている際のトレース情報を可視化できます。
今回、私の個人環境で作成したチャットボットはシンプルなものなので、以下のような表示でしたが、Langchainを使って複数のChainやAgent、Toolsを使うような場合だと重宝する機能かと思います!
Weights & Biasesの料金体系
個人利用は無料ですが、組織で利用する場合は料金がかかりますのでご留意ください。
(番外編)LangSmith
LangSmithはLangchainとシームレスに動かすことができるモニタリングツールです。
ただし、ブログ執筆時点ではベータ版での提供で、使用するには制限があります。使えるようになったらぜひ試してみたいですね。
WAITLIST
LangSmith is currently in private beta. If you'd like to be added to the waitlist, please sign up for an account here.
所感
自分のアプリにとって何が必要な情報なのか定義しモニタリングする必要があります。
必要に応じて自由度の高いWeights & Biasesなどのツールを使っていくと良いかと考えます。