こんにちは、エンジニアのyokomachiです。
本記事はAmazon Connect アドベントカレンダー 2023、24日目の記事です。
ギークフィードとクラスメソッドさん、スカイアーチHRソリューションズさんのメンバーによるAmazon Connectに関するアドベントカレンダーです。
ぜひ他の記事もチェックしてみてください。
今回は何番煎じかわかりませんがAmazon Connect+Bedrock+Lex+LambdaでAIチャットボットを作成します。
以前にもChatGPTのAPIと連携したチャットボットの作成をしましたが、
今回はLLM(大規模言語モデル)としてBedrockのAnthropic社Claude Instantを使うことによって、
AWSのサービスで完結する構成にすることができました。
Bedrock
まずはAmazon BedrockでLLMにアクセスできるように設定します。
Bedrockは米国東部 (バージニア北部)リージョン、米国西部 (オレゴン)リージョンでは様々なモデルにアクセスすることができますが、
2023/12/23現在、アジアパシフィック (東京)リージョンでは以下のモデルにしかアクセスできません。
今回はClaude Instantが使えればよいので東京リージョンでモデルへのアクセスをリクエストしました。
※今回の構築は数日前に行ったのですが、その時にはClaudeは公開されていなかったと記憶しています。
つい最近使えるようになったようです。この調子だと他のモデルもどんどん追加されていきそうです。
Lambda
次にLexから呼び出され、Bedrock APIに対してリクエストを送るLambdaを作成します。
ランタイムはPython 3.12です。
LambdaのIAMRoleにはBedrockへのアクセスポリシーを追加しておきます。
タイムアウトは30秒に変更しましたが、Claude Instant自体は10秒以内には返答を返してくれています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
import boto3 import json bedrock_runtime = boto3.client('bedrock-runtime') def lambda_handler(event, context): intent_name = event['sessionState']['intent']['name'] # インプットになるテキストを設定 prompt = event['inputTranscript'] prompt = f'\\n\\nHuman:回答は3文までに収めてください。{prompt} \\n\\nAssistant:' # モデルなどの設定 modelId = 'anthropic.claude-instant-v1' accept = 'application/json' contentType = 'application/json' # Bedrock APIにリクエスト body = json.dumps({ "prompt": prompt, "max_tokens_to_sample": 100 }) response = bedrock_runtime.invoke_model( modelId=modelId, accept=accept, contentType=contentType, body=body ) # レスポンスからアウトプットを取得 response_body = json.loads(response.get('body').read()) outputText = response_body.get('completion') print(outputText) # Lexにreturnして終了 return { "sessionState": { "dialogAction": { "type": "ElicitIntent" }, "intent": { "name": intent_name, "state": "Fulfilled" } }, "messages": [ { "contentType": "PlainText", "content": outputText } ] } |
Lex
次に作成したLambdaとAmazon Connectを仲介するLexボットを作成します。
スロットタイプにはAMAZON/FreeFormInputを指定しました。
忘れずにLambdaの設定もしておきます。
Amazon Connect
最後にAmazon Connectでコンタクトフローを作成します。
諸々の初期設定のあと、Lexの呼び出しを行うための顧客の入力取得ブロックを置いています。
チャットしてみる
必要な構築が終わったので、Amazon Connectのチャットテストでチャットをしてみます。
ちゃんと連携できていそうです。
もちろん電話への対応も可能ですが、Lambdaの実行時間などの制約もあるのでチャットの方が使いやすいですね。
また、今回の構築には含まれていませんが、DynamoDBと連携することで会話履歴を保存して、自然な会話を継続することができそうです。またその際には、モデルへのアクセスにLangChainというフレームワークを使うと実装もよりしやすくなりそうです。
https://python.langchain.com/docs/integrations/llms/bedrock
さらに、今回BedrockというAWSマネージドのサービスとしてLLMにアクセスできるようになったことで、他のAWSサービスとの連携もしやすくなったのではないかと思います。
特にAmazon Connectにおける活用法としては、Kendraと連携して顧客向けのQ&Aページを事前にインポートしておいて、顧客からの問い合わせに対してQ&Aをもとに回答を行う、などのユースケースが考えられます。
機会があればこのユースケースの構築も試してみたいと思います。
- Remix SPAモードで静的WebサイトをGithub Pagesにデプロイする - 2024-11-05
- LangGraph入門!LLMアプリ開発ライブラリのQuick StartをAmazon Bedrockでやってみる - 2024-10-10
- AWS ChatbotでSlackからAmazon Bedrock Agentにアクセスしてみる - 2024-09-18
- Amazon Bedrockの新機能「Prompt flows」を試してみた - 2024-07-11
- Amazon ConnectのZero-ETLがGAされたので試してみた - 2024-06-03