Amazon Lex のメトリクス「RuntimeSucessfulRequestLatency」の値の定義を解説
困っていること
AWS公式ドキュメントでは、Amazon Lex の RuntimeSucessfulRequestLatency について、次のように説明されています。
リクエストが成功してから、レスポンスが返されるまでのレイテンシー。
あるLexボットのRuntimeSucessfulRequestLatency のメトリクスで27秒という値を確認しました。
私は、RuntimeSucessfulRequestLatencyを「ユーザーの発話が完了してリクエストが作成されてから、Lexのレスポンス返却までの時間」と認識していましたが、発話完了から27秒もの時間(待ち時間)が必要というのは考えにくい状況でした。
RuntimeSucessfulRequestLatency メトリクスは、具体的にどの時点からどの時点までの時間を計測しているのでしょうか。
解説
RuntimeSucessfulRequestLatencyは、「ユーザーの発話が完了してリクエストが作成されてから、Lexのレスポンス返却までの時間」を示すものではありません。
RuntimeSucessfulRequestLatency は、AWS公式ドキュメントに記載されている通り、「リクエストが成功してから、レスポンスが返されるまでのレイテンシー」を表します。
ここでいう「リクエストが作成される」タイミングとは、「Lex が発話を検知し、音声入力をバックエンドに送信した時点」を指します。
リクエストの作成タイミングには、以下の2つのパターンがあります。
- ユーザーが発話中(開始時または継続中)にリクエストが作成される場合
- ユーザーの発話完了後にリクエストが作成される場合
このため、RuntimeSucessfulRequestLatencyで記録される時間は、ユーザーの発話時間と重複する可能性があります。この重複が、メトリクス値が大きくなる主な要因の一つです。
AWS公式ドキュメントには明確な記載はありませんが、前者は発話時間が長い場合、後者は短い時間の場合に該当するのではないかと推測されます。
処理の流れを理解しやすくするため、2つのパターンについて図示します。
ユーザーの発話中にリクエストが作成されるパターン
ユーザーの発話完了後にリクエストが作成されるパターン
Lexボットの会話ログを確認したところ、プロパティaudioProperties
内の記録から、このケースでのユーザーの発話時間は25.455秒であることが確認できました。
{
~中略~
"inputTranscript": "発話内容",
"audioProperties": {
"contentType": "audio/lpcm; sample-rate=8000; sample-size-bits=16; channel-count=1; is-big-endian=false",
"duration": {
"total": 25455, // 総発話時間(ミリ秒)
"silence": 0, // 無音時間(ミリ秒)
"voice": 25455 // 音声時間(ミリ秒)
},
"s3Path": "xx"
}
}
audioProperties
音声会話ログが有効で、ユーザー入力が音声形式だった場合、音声入力の合計時間、音声の再生時間、音声の無音時間が含まれます。また、オーディオファイルへのリンクも含まれています。
https://docs.aws.amazon.com/ja_jp/lexv2/latest/dg/conversation-logs-cw.html
このケースでは、ユーザーの発話時間が25秒であり、発話途中から処理が開始されていると推測します。そのため、Lex の処理完了からレスポンス送信までに27秒程度の時間を要することは、システムの動作として十分に起こり得る現象だと考えられます。
補足1
通常、Lexボットへの音声入力時間は15秒が上限となっています。
ただし、今回メトリクスを記録したLexボットでは、音声入力時間の上限を1分弱まで緩和する設定を適用しています。
この上限緩和設定により、Lexボットは25秒という通常の制限を超える発話時間を正常に処理することができます。
補足2
正しいスペルは「RuntimeSuccessfulRequestLatency」ですが、CloudWatchメトリクス名およびAWSドキュメントでは「RuntimeSucessfulRequestLatency」と表記されています。本記事では、AWS公式の表記に合わせて「RuntimeSucessfulRequestLatency」を使用しています。