こんにちは!筋肉痛と戦う女、岩間です。
Amazon Connect Advent Calendar 2025 14日目の記事です。
今回は、Q in Connectセルフサービスで多言語対応チャットボットを構築する方法をご紹介します。
目次
はじめに
日本語と英語、両方対応できるチャットボットを Q in Connectセルフサービスで実現しようとしたところ、 思わぬ壁にぶつかりました。
本記事では、その解決策を紹介します。
Q in Connectセルフサービスって何?という方はこちら
課題:1つのAIエージェントでは多言語対応が難しい?
Q in Connectセルフサービスでは、SELF_SERVICEタイプのAIエージェントに対して1つのプロンプトしか紐付けできないようでした。

そのため、多言語対応を実現するためにまずは1つのプロンプト内で以下のような工夫を試みました。
- 「ユーザーが日本語で話す場合は日本語で、英語で話す場合は英語で丁寧に回答してください」と指示
- 日本語と英語それぞれのプロンプトを1つにまとめて記述
しかし、英語でチャットしたところプロンプトの手順(TOOLS)を正しく守らず、ナレッジベースの回答も日本語で返ってくるという問題が発生し、どうやら1つのAIエージェントのみを用いて多言語対応のチャットボットを構築することは難しそう、ということがわかりました…
1つのAIエージェントが難しいなら、複数エージェント作ればいいのでは!?とも思い、
Amazon Connectのフロー、Connect Assistantブロック等での設定を試みましたが、一見、複数エージェントの設定ができないようにみえます。
解決策:UpdateSession APIでAIエージェントを切り替える
調査を進める中で、UpdateSession APIを発見しました。
各言語毎に対応するAI エージェントを作成したうえで、このAPIを使えばセッション毎に使用するAIエージェントを上書きできます。
つまり1つのフローで複数のAIエージェントが使えます!
前提条件
- Amazon Connect Q in Connectセルフサービスのセットアップ済み
- 日本語用・英語用のAIエージェントをそれぞれ作成済み
実装手順
全体のフロー構成
ポイントとなるのは赤枠で囲っているブロックとその順番です。
1. 顧客の入力を取得(言語選択)
ここでは言語選択用のLexボットをセットし、プロンプトを設定しています。
チャット開始時にユーザーに言語の選択を促すためのブロックです。


Lexボットの設定は以下の画像の通りです。
Japanese、Englishのインテントを作成し、それぞれのサンプル発話に「日本語」「Japanese」、「英語」「English」を設定しました。

2. コンタクト属性の設定(言語保存)
言語選択のLexボットでは、ユーザーの選択に応じて「Japanese」または「English」インテントに振り分けられます。
このインテント名をコンタクト属性 lang に保存しておき、後続の処理で言語判定に使用します。

3. コンタクト属性の確認(言語判定)
lang の値が「Japanese」か「English」かで分岐します。

4. コンタクト属性の設定(挨拶文保存)
言語ごとに最初の挨拶文を firstMessage に保存します。
日本語
|
1 2 |
本日はどのようなご用件でしょうか? お気軽にお問い合わせください。 |
英語
|
1 2 |
I'll assist you in English. How can I help you today? Please feel free to ask any questions. |

5. AIエージェントの作成(Connect assistant)
デフォルトで使用するAIエージェントを設定します。

6. Lambda関数の呼び出し
UpdateSession APIを実行するLambdaを呼び出します。
パラメータにQのSessionArnを渡します。
| パラメータ | 値 |
|---|---|
| sessionId | $.Wisdom.SessionArn |


7. 顧客の入力を取得(AIエージェント用)
AIエージェント用のLexをセットし、保存していた挨拶文を動的に設定します。


注意ポイント
Qのセッション作成ブロックの後に、AIエージェント用のLex(顧客の入力取得)ブロックを配置するようにしましょう。
順番が逆だと以下のエラーが発生します。
|
1 |
Amazon Lex needs active session for Q In Connect. Please provide valid session attribute `x-amz-lex:q-in-connect:session-arn` |
Lambda実装(CDK)
今回はCDKでLambdaをデプロイしてみました。
Lambda定義
|
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 |
import * as cdk from "aws-cdk-lib"; import { Runtime } from "aws-cdk-lib/aws-lambda"; import { NodejsFunction } from "aws-cdk-lib/aws-lambda-nodejs"; import { PolicyStatement, Effect } from "aws-cdk-lib/aws-iam"; // -------------------------------------------- // Q in Connect UpdateSession Lambda // -------------------------------------------- const updateSessionFunction = new NodejsFunction( this, "QInConnectUpdateSessionFunction", { functionName: "qInConnectUpdateSessionFunction", runtime: Runtime.NODEJS_22_X, entry: "lambda/update-q-connect-session.ts", handler: "handler", timeout: cdk.Duration.seconds(600), // 環境変数 environment: { AWS_ACCOUNT_ID: this.account, WISDOM_ASSISTANT_ID: props.WISDOM_ASSISTANT_ID, WISDOM_AI_AGENT_ID: props.WISDOM_AI_AGENT_ID, }, // IAMポリシー initialPolicy: [ // Q Connect: セッション更新 new PolicyStatement({ effect: Effect.ALLOW, actions: ["wisdom:UpdateSession"], resources: [ `arn:aws:wisdom:${this.region}:${this.account}:assistant/*`, `arn:aws:wisdom:${this.region}:${this.account}:session/*/*`, ], }), // Connect: コンタクト情報取得 new PolicyStatement({ effect: Effect.ALLOW, actions: ["connect:DescribeContact"], resources: [ `arn:aws:connect:${this.region}:${this.account}:instance/${props.CONNECT_INSTANCE_ID}/contact/*`, ], }), ], } ); |
Lambdaコード
|
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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
import { QConnectClient, UpdateSessionCommand, UpdateSessionCommandOutput } from "@aws-sdk/client-qconnect"; // ============================================ // 定数・設定 // ============================================ const REGION = "ap-northeast-1"; const client = new QConnectClient({ region: REGION }); // 環境変数 const { AWS_ACCOUNT_ID, WISDOM_ASSISTANT_ID, WISDOM_AI_AGENT_ID } = process.env; // ============================================ // 型定義 // ============================================ interface ConnectEvent { Details?: { Parameters?: { sessionId?: string; }; ContactData?: { Attributes?: { lang?: string; }; }; }; } interface LambdaResponse { statusCode: number; body: string; } // ============================================ // ヘルパー関数 // ============================================ /** セッションIDの先頭ピリオドを除去 */ const sanitizeSessionId = (sessionId?: string): string => sessionId?.replace(/^\.+/, "") ?? ""; /** アシスタントARNを生成 */ const buildAssistantArn = (): string => `arn:aws:wisdom:${REGION}:${AWS_ACCOUNT_ID}:assistant/${WISDOM_ASSISTANT_ID}`; /** 成功レスポンスを生成 */ const successResponse = (data: object): LambdaResponse => ({ statusCode: 200, body: JSON.stringify(data), }); /** エラーレスポンスを生成 */ const errorResponse = (message: string): LambdaResponse => ({ statusCode: 500, body: JSON.stringify({ message }), }); /** Q Connect セッションを更新 */ const updateQConnectSession = async ( sessionId: string, aiAgentId: string ): Promise<UpdateSessionCommandOutput> => { const command = new UpdateSessionCommand({ assistantId: buildAssistantArn(), sessionId, aiAgentConfiguration: { SELF_SERVICE: { aiAgentId }, }, }); return client.send(command); }; // ============================================ // メインハンドラー // ============================================ export const handler = async (event: ConnectEvent): Promise<LambdaResponse> => { console.info("Event:", JSON.stringify(event.Details)); try { const { Parameters: params, ContactData: contact } = event.Details ?? {}; const sessionId = sanitizeSessionId(params?.sessionId); const lang = contact?.Attributes?.lang; // 日本語の場合は更新不要 if (lang !== "English") { console.info("言語が日本語のためセッション更新をスキップ"); return successResponse({ message: "No Update Session" }); } // 英語の場合:AIエージェントを切り替え const aiAgentId = `${WISDOM_AI_AGENT_ID}:1`; console.info(`英語セッションに更新: sessionId=${sessionId}, aiAgentId=${aiAgentId}`); const response = await updateQConnectSession(sessionId, aiAgentId); console.info("UpdateSession成功:", JSON.stringify(response)); return successResponse(response); } catch (error) { const message = error instanceof Error ? error.message : "Unknown error"; console.error("エラー発生:", message); return errorResponse(message); } }; |
動作確認
Connectのテストチャット画面で確認してみます。
日本語を選択した場合

英語を選択した場合

言語に応じて適切なAIエージェントに切り替わり、それぞれの言語で正しく応答できていることが確認できました。
まとめ
Q in Connectセルフサービスで多言語対応チャットボットを構築する方法をご紹介しました。
- 1つのAIエージェントで多言語対応は難しい
- 言語ごとにAIエージェントを作成し、UpdateSession APIで切り替える
- Lexで言語選択 → Lambda でAIエージェント切り替え → 選択された言語で応答
この方法を応用すれば、2言語以上の多言語対応や、用途別のAIエージェント切り替えなども実現できます。
この記事が参考になれば幸いです!
- Amazon Q in Connectセルフサービスで多言語対応チャットボットを作ってみた - 2025-12-14
- 【Kiro・Playwright】社内でフルAI開発バトルを企画した話〜ルール説明編〜 - 2025-12-01
- ロングネイル女子エンジニア、筋トレとピラティスで最強になった話 - 2025-08-26
- 取引先から最短距離にいる担当者へメール通知する仕組みをSalesforce Apexで実現してみた〜後編〜 - 2025-05-28
- 取引先から最短距離にいる担当者へメール通知する仕組みをSalesforce Apexで実現してみた〜前編〜 - 2025-05-23
【採用情報】一緒に働く仲間を募集しています


