Blog

Amazon Bedrock Converse APIのTool Useを使ってLLMの出力をJSON形式で取得する

はじめに

こんにちは。ニフティ株式会社の高垣と申します。

私が所属しているチームでは、会員様向けのお問い合わせに対応するコールセンターの業務改善にAIを活用しています。その中で、Amazon BedrockのLLMを呼び出すLambdaを実装する際に 「LLMの出力を安定してJSON形式で受け取りたい」 という課題にぶつかりました。

本記事では、この課題を Converse APIのTool Use で解決した方法をご紹介します。BedrockでLLMの出力を構造化データとして扱いたい方の参考になれば幸いです。

簡単な業務背景

弊社のコールセンターでは、お電話をいただいた際にお客様がニフティのご契約者かどうかを確認する「本人確認」のステップがあります。これにAIを活用することで、本人確認にかかる時間を短縮し、お客様がよりスムーズにお問い合わせできるのではないかというアイデアが生まれました。私はこの取り組みの中で、Amazon Bedrockを呼び出すLambdaの作成を担当しました。Bedrockから受け取った結果を後続の処理にJSON形式で渡す必要があったのですが、ここで課題が発生しました。

invoke_model の課題:LLMの出力が文字列になる

通常、Python(boto3)のLambdaからBedrockを呼び出す際は invoke_model がよく使われます。しかし、この方法ではLLMからの回答が「文字列(String)」として返ってきます。

LLMの特性上、出力は確率に基づいて生成されるため、たとえプロンプトでJSONを返すように指示しても、常に期待通りのデータ構造になるとは限りません。その結果、後続の処理でパースに失敗し、エラーを招くリスクがありました。

Converse APIのTool Useによる解決

そこで今回は、この不確実性を排除するために Converse API を採用しました。Converse APIを活用することで、LLMからの出力を安定して「JSON形式」で受け取れるようになり、後続処理への連携が非常にスムーズになりました。

Converse APIのドキュメント

具体的には、toolConfigtools に期待するJSONの形式を定義し、Converse APIでBedrockを呼び出す際にtoolを指定します。

以下にサンプルコードを載せます。

このサンプルコードでは{A: 1, B: "test"}のような形式のJSONレスポンスが返されます。tool_listinputSchema で定義したスキーマに沿って、LLMの出力が構造化されます。

レスポンスからJSONデータを取り出すには、以下のようにします。

終わりに

invoke_model ではLLMの出力が文字列になるため、JSON構造を保証するのが難しいという課題がありましたが、Converse APIの Tool Use 機能を活用することで、この問題をシンプルに解決できました。

LLMの出力を構造化データとして扱いたい場面では、ぜひConverse APIを利用してみてください。

今後も、お客様の満足度向上のために、AIやクラウド技術を活用したコールセンター業務の改善に取り組んでいきます。

参考

https://catalog.workshops.aws/building-with-amazon-bedrock/en-US

https://docs.aws.amazon.com/boto3/latest/reference/services/bedrock-runtime/client/converse.html

ニフティでは、
さまざまなプロダクトへ挑戦する
エンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトより
お気軽にご連絡ください!

ニフティに興味をお持ちの方は
キャリア登録をぜひお願いいたします!

connpassでニフティグループに
参加いただくと
イベントの
お知らせが届きます!