【re:Invent 2023】AWS Step FunctionsにAmazon BedrockのAPIが追加されたので、LLMの出力をLLMにチェックさせてみた

記事タイトルとURLをコピーする

サーバーワークスの村上です。

re:Invent 2023、今年も始まりましたね。

さっそくBedrock関連のアップデートを紹介します。

結論

  • AWS Step FunctionsでAmazon BedrockのAPIをコールできるようになりました
  • 対応しているAPIはInvokeModel, CreateModelCustomizationJobの2つです
  • このブログではClaude 2の出力が合っているか、Jurassic-2 Ultraに渡して判定させています

AWS Step Functionsとは?

AWS Step Functionsとはローコードなビジュアルワークフローサービスです。

複数の AWS サービスにまたがる処理を順番に実行したり、並列に実行したり、あるいは条件分岐させたりできます。

以下のように視覚的なコンソール画面で、直感的にワークフローを構築できます。

AWS Step Functionsに追加されたAmazon BedrockのAPIは2つ

今回のアップデートは、生成系AIのサービスであるAmazon BedrockのAPIを叩けるようになったよ、という内容です。

Amazon Bedrockの概要については過去のブログをご参照ください。

blog.serverworks.co.jp

対応したAPIは以下の2つです。

  • InvokeModel
    • モデルを呼び出すためのAPI
  • CreateModelCustomizationJob
    • モデルをファインチューニングするためのAPI

LLMの出力をLLMにチェックさせてみた

私がこのアップデートを見て、簡単に試せそうだなーと思いついたのは、LLM(大規模言語モデル)が出力した内容を別のLLMに渡して内容の信頼性をダブルチェックする、というものでした。

このような考え方は従来からあったものの、今回のアップデートでどれくらい簡単につくれるのか試してみました。

全体概要

図にするほどでもありませんが、こんな感じです。

イメージ図

単純な質問をClaude 2にして、質問と回答のセットをJurassic-2 Ultraに渡して、回答が合っているか判断してもらいます。

まずはステートを追加する

Amazon BedrockのAPIが追加されていることがわかります。ドラッグ&ドロップでステートを直列に繋いでみます。

Amazon BedrockのAPIが追加されている

Claude 2をinvokeする設定

入力

まずは最初のステートを設定します。

Claudeのプロンプトには、人間の入力をHuman:の後に入れ、プロンプトの最後はAssistant:で終わるというお作法がありますので、組み込み関数を使って対応しました。

docs.aws.amazon.com

具体的はConfigrationタブのBedrock Model Parametersを以下のように設定します。

{
  "prompt.$": "States.Format('\n\nHuman: {}\n\nAssistant:', $.input)",
  "max_tokens_to_sample": 200
}

出力

次にOutputタブで出力を整形します。

整形する理由は2点です。

  • ユーザーの質問も次のステート(Jurassic-2 Ultra)に渡したい
  • Claudeの出力のうち必要な情報だけを次のステートに渡したい

1点目についてはResultPathのCombine original input with resultを使いました。これによりステートに対する入力を出力に含めることができます。

2点目についてはClaudeの出力に含まれるContentTypeなどの不要な内容を除去する目的で、ResultSelectorを使いました。

これらの設定により、以下のように必要な情報だけを出力し、次のステートに渡す準備が整いました。

Jurassic-2 Ultraでチェックする設定

入力

同じ要領でBedrock Model Parametersを設定します。

プロンプトには「質問と回答のセットが合っているか教えてください」という内容で、前のステートから出力された質問と回答のセットを渡します。

{
  "prompt.$": "States.Format('Let me know if my answers to the following questions are correct.\n\nQuestion:{}\n\nAnswer:{}', $.input, $.result.completion)"
}

出力

必要な出力だけに絞るためOutputPathを設定します。

Jurassic-2 Ultraの出力は$.Body.completions.[0].data.textに格納されるため、このように設定します。

動作確認

以下のような情報をステートマシンに入力します。

{
  "input": "日本の首都はどこですか"
}

するとClaudeが回答を生成します。

最初のステートが回答を生成

次に2番目のステートに最初のステートの出力が渡されます。

基本的にステートには直前のステートの出力が渡される

最後に、Jurassic-2 Ultraが"\nYes, your answer is correct. 東京 (Tokyo) is the capital city of Japan"と回答しました!

他にも様々な使い方

今回のアップデートに関する公式ブログはこちらです。並列の処理など、ユースケースについても触れられています。

aws.amazon.com

所感

以上、AWS Step Functionsを使ってAmazon Bedrockを直列につなげてみました。

他のAWSサービスと組み合わせるなど、いろいろと夢広がるアップデートですね!

村上博哉 (執筆記事の一覧)

2020年4月入社。機械学習が好きです。記事へのご意見など:hiroya.murakami@serverworks.co.jp