Amazon Lexは、AWS上でチャットボットや音声ボットを作るためのマネージドサービスです。音声認識(ASR)と自然言語理解(NLU)を内蔵しているため、発話からユーザーの意図を判定し、必要な情報を聞き返して処理するまでをサーバー管理なしで組めます。なお「lex」はUNIXの字句解析器生成ツールの名前でもありますが、この記事で扱うのはAWSのAmazon Lexです。
2026年9月時点で使えるのはAmazon Lex V2だけです。本記事では、V2を前提に料金・日本語ボットでの制約・生成AI機能・Lambda連携・Amazon Connectとの接続を、公式ドキュメントの記載に沿って整理します。
まとめ:Amazon Lexの要点
- Amazon Lexは、インテント(ユーザーの目的)とスロット(聞き出す値)で会話を定義するボット構築サービスです。
- V1は2025年9月15日にサポートが終了しました。新規も既存も、V2のコンソールとAPIで作ります。
- 東京リージョンの日本語は、音声リクエスト0.004ドル、テキストリクエスト0.00075ドルです。ストリーミング会話は無音も含めて15秒ごとに0.0065ドルかかります。
- 日本語(ja_JP)は東京で使えます。ただし文法スロット・ランタイムヒント・スペルスタイル・信頼スコア・複数値スロットは英語ロケール限定です。
- 生成AI機能はAmazon Bedrockのモデルを呼び出すため、Lexとは別にBedrockの料金がかかります。QnAIntentの検索先にKendraを選ぶ構成は、2026年7月30日にKendraが新規受付を終えたため、新規顧客は採れません。
- Lambdaはエイリアスの言語ごとに1関数だけ設定でき、ダイアログとフルフィルメントの両方のコードフックで共用します。インテントが増える場合は、関数の中でインテント名によって処理を振り分けます。
Amazon Lexの仕組みと構成要素
インテントとスロットによる会話設計
Lexのボットは、ロケール(言語)ごとにインテントを持ちます。インテントは「予約したい」「注文状況を知りたい」といったユーザーの目的の単位です。インテントにはサンプル発話を登録し、それを手がかりにLexが入力を分類します。
スロットは、インテントを完了するために聞き出す値です。日付・数値・電話番号などの組み込みスロットタイプと、自社の商品名などを列挙するカスタムスロットタイプがあります。必須スロットが埋まるまでLexがプロンプトを出して聞き返し、すべて揃ったらフルフィルメント(業務処理)へ進みます。
設計の上限も決まっています。1インテントあたりのサンプル発話は1,500件(引き上げ申請可)、1インテントあたりのスロットは100個、1アカウントあたりのボットは1リージョン100個です。1ロケールあたりのインテント数は英語(en_AU・en_GB・en_US)が1,000件、日本語を含むそれ以外のロケールは250件で、日本語ボットの方が早く上限に届きます。
Draft・バージョン・エイリアスの関係
編集できるのはDraftバージョンだけです。Draftは最初からTestBotAliasに関連付けられていますが、公式ドキュメントはTestBotAliasを手動テスト専用とし、ランタイムリクエスト数を制限すると明記しています。本番のアプリやAmazon Connectからは、番号付きバージョンを作成して独自のエイリアスに割り当て、そのエイリアスを呼び出します。バージョンは1ボットあたり100個までです。
会話ログの設定もエイリアス単位です。テキストログはCloudWatch Logsに、音声ログはAmazon S3に保存されます。RecognizeTextで記録できるのはテキストだけで、音声まで残せるのはRecognizeUtteranceです。
Lexの呼び出し方式と課金単位の違い
Lexの呼び出し方は2種類あります。リクエスト/レスポンス型は、ユーザーの入力1回を1回のAPI呼び出しで処理します。ストリーミング型は、複数ターンの入力を1本のストリーミングAPI呼び出しで処理し、ボットが聞き続けながら「準備ができたら教えてください」のように先回りして応答できます。料金の数え方がこの2つで異なるため、次の料金の章で比較します。
Amazon Lex V1の終了とV2への移行
AWSはAmazon Lex V1のサポートを2025年9月15日に終了し、以降はV1のコンソールにもリソースにもアクセスできなくなりました。2026年9月時点で英語版のV1開発者ガイドはページが削除されています。日本語版のV1開発者ガイドは閲覧できますが、提供終了前のV1の内容なので、V2の手順としては使えません。
V1とV2のAPIに互換性はありません。LexのFAQは、V2 APIは情報構造を刷新してバージョン管理と1ボット内の複数言語に対応したため、V1 APIとは互換性がないと説明しています。V1では言語ごとに別ボットを作っていましたが、V2では1ボットに複数のロケールを追加します。
古いブログ記事のコード例を参考にする場合は、呼び出しているAPIを確認してください。PostText・PostContentはV1のランタイムAPIで、V2ではRecognizeText・RecognizeUtterance・StartConversationを使います。V1からの移行機能でも、エイリアス、Lambda関数、会話ログの設定、Slackなどのチャネル連携、タグは移行されませんでした。
Amazon Lexの料金と無料枠
Lexは従量課金で、初期費用や最低料金はありません。AWS Price List APIの東京リージョン(ap-northeast-1、2026年9月11日公開分)で日本語(ja-JP)の単価を確認すると、次のとおりで、料金ページに載っている単価と一致します。
| 呼び出し方 | 入力 | 単価(USD) | 課金単位 |
|---|---|---|---|
| リクエスト/レスポンス | 音声 | 0.004 | 1リクエスト |
| リクエスト/レスポンス | テキスト | 0.00075 | 1リクエスト |
| ストリーミング | 音声 | 0.0065 | 15秒(無音を含む) |
| ストリーミング | テキスト | 0.002 | 1リクエスト |
| ストリーミング | DTMF(プッシュ入力) | 0.002 | 1リクエスト |
ストリーミング型の音声は、話した時間でなく入力の時間で数えます。Amazon Lexの料金ページには、無音を含む15秒ごとに1インターバルとし、15秒単位で切り上げると書かれています。たとえば1通話で4回話してもらう場合、リクエスト/レスポンス型なら4回×0.004ドル=0.016ドルです。同じ4ターンに無音込みで60秒かかると、ストリーミング型では4インターバル×0.0065ドル=0.026ドルになります。考える時間が長い業務ほど、ストリーミング型の方が高くつきます。
無料枠は、2025年7月15日以降に作成したAWSアカウントの場合、Lexにも使える最大200ドルのFree Tierクレジットです。無料プランはアカウント作成から6か月間で、クレジットは作成から12か月以内に使い切る必要があります。一方でLexのFAQには、利用開始から最初の1年間は毎月テキスト10,000件・音声5,000件という従来型の無料枠の記載も残っています。どちらが適用されるかはアカウントによって異なるため、請求コンソールのFree Tierの表示で確認してください。
ほかにかかる費用も見積もりに入れてください。自動チャットボットデザイナーは、会話履歴の分析に使ったトレーニング時間1分あたり0.50ドルです。後述の生成AI機能はBedrockのモデル料金、コードフックはAWS Lambdaの料金、音声ログはS3の保管料金が別途発生します。
日本語ボットで使えない機能と回避策
Lex V2の日本語(ja_JP)は東京リージョンで提供されています。ただし「対応言語に日本語がある」ことと「すべての機能を日本語で使える」ことは別です。公式の言語別機能表では、次の機能が英語などのロケールに限られています。
| 機能 | 対応ロケール | 日本語 |
|---|---|---|
| 文法スロットタイプ(SRGS) | en_AU・en_GB・en_US | 不可 |
| ランタイムヒント | en_GB・en_US | 不可 |
| スペルスタイルによるスロット取得 | en_AU・en_GB・en_US | 不可 |
| 音声認識の信頼スコア | en_GB・en_US | 不可 |
| 複数値スロット | en_US | 不可 |
| インテントコンテキスト | en_US | 不可 |
| Kendra検索の組み込みインテント | en_US | 不可 |
| 自動チャットボットデザイナー | en_US | 不可 |
| 説明文からのボット生成 | 英語ロケールのみ | 不可 |
影響が大きいのは電話の音声ボットです。会員番号やアルファベット混じりの予約番号を1文字ずつ聞き取るスペルスタイルや、次に来る語をヒントとして渡すランタイムヒントは、英語ボットでは聞き取り精度を上げる定番の手段ですが、日本語では使えません。日本語で番号を確実に受け取るなら、Amazon ConnectのDTMF(プッシュボタン)入力に切り替えるか、組み込みスロットのAMAZON.AlphaNumeric(日本語で利用可。韓国語と機能制限付きロケールは対象外)で受け、Lambdaで桁数や形式を検証して聞き返す設計にします。
カスタム語彙は公式内で記載が割れています。言語別の機能表では英語(en_GB・en_US)のみですが、カスタム語彙のページには日本語を含む21言語が対応言語として列挙されています。社内用語や固有名詞の聞き取りをカスタム語彙に頼る設計にする場合は、東京リージョンの日本語ロケールで設定画面が出るかを先に確認してください。
生成AI機能とBedrock連携の現状
Lex V2の生成AI機能は、ロケールごとに有効化し、使うBedrockのモデルを選ぶ方式です。料金はBedrock側で発生します。構築を補助する機能(説明文からのボット生成、サンプル発話の生成)と、会話中に動く機能に分かれます。
Assisted NLUと支援付きスロット解決の適用範囲
Assisted NLUは、LLMでインテント分類とスロット解決を補う機能です。ボットに定義したインテントとスロットの範囲からは外れず、ボットの内容も書き換えません。対応ロケールにはja_JPが明記されています。LLMを常に主判定に使うPrimaryモードと、NLUの信頼度が閾値を下回ったときやFallbackIntentに落ちたときだけLLMを使うFallbackモードがあります。有効にするとデータがリージョンをまたいで処理される場合があると注記されているため、国内処理の要件がある案件では事前に確認が必要です。
支援付きスロット解決は、通常の解決に失敗した発話をBedrockでもう一度解決する機能です。対象はAMAZON.AlphaNumeric(正規表現なし)・City・Country・Date・Number・PhoneNumber・Confirmationの組み込みスロットに限られ、カスタムスロットには効きません。Bedrockで解決された値は、会話ログのinterpretationSourceがBedrockになるため、効果を後から集計できます。
QnAIntentとBedrockAgentIntentの接続先と利用条件
AMAZON.QnAIntentは、ナレッジストアを検索して生成AIで回答する組み込みインテントです。サンプル発話を設定しない単一のQnAIntentは未分類の発話を受け、サンプル発話を設定した場合はそのインテントとして認識された入力を受けます。検索先はAmazon OpenSearch Service、Amazon Kendra、Amazon Bedrockナレッジベースの3つから選べます。ただしKendraは2026年7月30日に新規顧客の受付を終えたため、新しく作る場合はBedrockナレッジベースかOpenSearchが現実的です(Kendraの状況はAmazon Kendraの新規受付終了と移行先、Bedrockナレッジベースの構築はAmazon BedrockでRAGを実装する手順で解説しています)。
AMAZON.BedrockAgentIntentは、Bedrockのエージェントまたはナレッジベースに会話を渡す組み込みインテントです。エージェントを使う場合、エージェントがFINISHと判断するまで会話はこのインテントにとどまり、その後Lexに制御が戻ります。注意したいのは接続先のエージェントです。2023年11月に登場したAmazon Bedrock Agentsは現在Bedrock Agents Classicという名称になり、2026年7月30日に新規顧客の受付を終えています。これから作る場合は、ナレッジベース接続として使うか、エージェント部分の設計を別途検討してください。
同じボットロケールに、サンプル発話なしのBedrockAgentIntent、サンプル発話なしのQnAIntent、Kendra検索の組み込みインテントは同居できません。どれか1つを受け皿に選びます。
ボット作成から本番公開までの手順
- Lex V2コンソールでボットを作成し、IAMロール、セッションのアイドルタイムアウト(既定5分、APIでは60秒〜86,400秒)、COPPA(13歳未満向けか)の区分を設定します。
- ロケールに日本語(ja_JP)を追加し、音声応答を使うなら声を選びます(読み上げに使う音声合成の仕組みはAmazon Pollyの解説を参照してください)。
- インテントを作成し、サンプル発話、スロット、確認プロンプト、終了応答を設定します。
- ロケールをビルドし、TestBotAliasのテストウィンドウで手動テストします。まとまった検証はTest Workbenchのテストセットで行います。
- 番号付きバージョンを作成し、本番用エイリアスに割り当てます。エイリアスでLambda関数と会話ログを設定します。
- アプリからRecognizeText・RecognizeUtterance、またはAmazon Connectの問い合わせフローから本番エイリアスを呼び出します。
Lambdaコードフックの実装例(Python)
Lambdaは2つの場面で呼ばれ、入力イベントのinvocationSourceで区別します。DialogCodeHookは、毎ターンの呼び出しを有効にした場合にユーザー入力ごとに実行され、スロット値の検証に使えます。会話の特定段階だけで呼び出す設定も可能です。FulfillmentCodeHookは必須スロットがすべて埋まった後に呼ばれ、予約登録などの業務処理を行います。どちらの応答でも、sessionState.dialogAction.typeで次の動きを指定します。
次の関数は、飲食店予約のインテントで、必須スロットのPeople(AMAZON.Number)とDate(AMAZON.Date)を扱う例です。AMAZON.Numberは「2.5」のような小数も返すため、人数が1〜8の整数でなければPeopleを空にして聞き直します。検証はダイアログとフルフィルメントのどちらで呼ばれても行い、フルフィルメントに不正な人数が届いても完了にしません。予約システムへの登録処理は、コメントの位置に書き足す前提です。
def close(intent, state, text):
intent["state"] = state
return {
"sessionState": {
"dialogAction": {"type": "Close"},
"intent": intent,
},
"messages": [{"contentType": "PlainText", "content": text}],
}
def elicit_slot(intent, slot_name, text):
return {
"sessionState": {
"dialogAction": {"type": "ElicitSlot", "slotToElicit": slot_name},
"intent": intent,
},
"messages": [{"contentType": "PlainText", "content": text}],
}
def slot_value(intent, name):
slot = intent["slots"].get(name)
if not slot:
return None
return slot["value"].get("interpretedValue")
def valid_people(value):
try:
number = float(value)
except ValueError:
return False
return number.is_integer() and 1 <= number <= 8
def lambda_handler(event, context):
intent = event["sessionState"]["intent"]
people = slot_value(intent, "People")
if people is not None and not valid_people(people):
intent["slots"]["People"] = None
return elicit_slot(intent, "People", "人数は1〜8名で指定してください。")
if event["invocationSource"] == "DialogCodeHook":
return {"sessionState": {"dialogAction": {"type": "Delegate"}, "intent": intent}}
date = slot_value(intent, "Date")
# ここで予約システムに登録し、成功した場合だけFulfilledを返す
return close(intent, "Fulfilled", f"{date}に{int(float(people))}名で予約しました。")
公式の入力イベント形式に合わせたテストイベントを、Python 3.14でこの関数に直接渡した結果は次のとおりです(Lexを経由した呼び出しではありません)。
| invocationSource | People | 返したdialogAction.type | 内容 |
|---|---|---|---|
| DialogCodeHook | 12 | ElicitSlot | Peopleを空にして聞き直す |
| DialogCodeHook | 2.5 | ElicitSlot | Peopleを空にして聞き直す |
| DialogCodeHook | 3 | Delegate | 次の手順をLexに任せる |
| FulfillmentCodeHook | 12 | ElicitSlot | 完了にせず聞き直す |
| FulfillmentCodeHook | 3 | Close | stateをFulfilledにして完了 |
応答の必須項目はdialogAction.typeによって違います。ElicitSlotではslotToElicitとインテント名が、Closeではインテント名とstate(Failed・Fulfilled・InProgress)が必要で、ElicitIntentとConfirmIntentではmessagesも必須です。上の例はイベントのintentをそのまま返しているので、名前とスロットが欠けません。
Lambda関数はエイリアスの言語ごとに1つだけ設定でき、同じ言語のダイアログコードフックとフルフィルメントコードフックで共用されます。インテントごとに処理を分けたい場合は、公式ドキュメントのサンプルと同じく、sessionState.intent.nameで振り分けるルーター関数を置きます。Lambda自体の料金体系やコールドスタートはAWS Lambdaの仕組みと料金体系で解説しています。
Amazon Connectとの連携設定
コンタクトセンターでLexを使う場合は、Amazon Connectの問い合わせフローの「顧客の入力を取得する(Get customer input)」ブロックでボットを指定します。事前にAmazon Connectコンソールで対象インスタンスの「Flows」を開き、Amazon Lexのリージョン・ボット・エイリアスを選んで追加します。そのうえで、フローブロックのドロップダウンからビルド済みのボットを選びます。インテントを一覧から選ぶには、ボットにAmazonConnectEnabled=Trueのタグを付け、エイリアスにバージョンを関連付けておく必要があります。また、Amazon Connect側の言語属性は、ボットの構築に使った言語(日本語ボットならja_JP)と一致させます。
電話の聞き取り時間は、ブロックのセッション属性で調整します。
| セッション属性 | 意味 | 既定値 |
|---|---|---|
| x-amz-lex:audio:max-length-ms | 発話の最大長 | 12,000ms(上限55,000ms) |
| x-amz-lex:audio:start-timeout-ms | 話し始めを待つ時間 | 3,000ms |
| x-amz-lex:audio:end-timeout-ms | 話し終わりと判定する無音 | 600ms |
最大長に55,000msを超える値を入れると、問い合わせはエラー分岐に流れます。カード番号のように考えながら読み上げる入力では、属性名の末尾に:インテント名:スロット名を付けて、そのスロットだけ待ち時間を延ばします。ボットが話している途中の割り込み(バージイン)は、Lex V2では既定で有効です。Amazon Connect自体の料金や導入手順はAmazon Connectとは?料金・機能・導入方法にまとめています。
Amazon Lexを選ぶべき場面と避けるべき場面
Lexが強いのは、決まった手続きを最後まで完了させる会話です。予約、住所変更、注文状況の照会のように、聞き出す項目が決まっていて、確認して、業務システムに書き込む流れは、インテントとスロットとLambdaでそのまま表現できます。電話ではAmazon ConnectとDTMFを組み合わせられるため、コールセンターのIVRを自然言語化する用途が第一候補です。
逆に、社内規程やマニュアルへの自由な質問に答えるだけなら、Lexを挟む必要はありません。回答の品質を決めるのは検索と生成の部分なので、Bedrockナレッジベースを直接アプリから呼ぶ方が構成は単純です。Lexを使うのは、自由な質問への回答と、手続きの実行を1つの窓口にまとめたい場合です。
日本語の電話ボットで、英数字混じりの番号を声だけで聞き取る要件がある場合も慎重に判断してください。前述のとおり、スペルスタイルやランタイムヒントは日本語で使えません。プッシュ入力に切り替えられない業務なら、PoCの段階で実際の通話音声を使って認識率を測ってから採用を決めるべきです。
よくある質問
Amazon LexとAlexaは何が違いますか?
Alexaは、Amazonが一般消費者向けに提供する音声アシスタントです。Amazon Lexは、企業や開発者が自社のアプリ、Webサイト、コンタクトセンターに組み込むボットを作るためのAWSのサービスです。Lexで作ったボットはAWSアカウント内で動き、料金もAWSに対して従量で支払います。
Amazon Lexは日本語に対応していますか?
対応しています。Lex V2は日本語(ja_JP)をサポートし、東京リージョンで利用できます。ただし文法スロット、ランタイムヒント、スペルスタイル、信頼スコア、複数値スロットなどは英語ロケール限定で、日本語ボットでは使えません。
Amazon Lexの料金はいくらですか?
東京リージョンの日本語では、リクエスト/レスポンス型が音声1リクエスト0.004ドル、テキスト1リクエスト0.00075ドルです。ストリーミング型は音声が15秒ごとに0.0065ドル(無音を含む)、テキストが1リクエスト0.002ドルです。生成AI機能を使う場合はBedrockの料金が別にかかります。
Amazon Lex V1のボットはまだ使えますか?
使えません。V1は2025年9月15日にサポートが終了し、V1のコンソールやリソースにはアクセスできなくなりました。V1とV2のAPIには互換性がないため、V1時代のPostText・PostContentを使うコード例はV2では動きません。
Amazon LexだけでChatGPTのような自由な会話ができますか?
Lex単体は、定義したインテントとスロットに沿って会話を進める仕組みです。自由な質問に答えさせるには、AMAZON.QnAIntentやAMAZON.BedrockAgentIntentでBedrockのモデルやナレッジベースに接続します。Assisted NLUもLLMを使いますが、定義済みのインテントとスロットの範囲を超えた応答は生成しません。