#音声対話#対話行為#ISO 24617-2#自然言語処理

全部の発話が質問ではない — 「聞こえてますか」にページの説明を返していた


音声対話アバターのログに、こういうやり取りがあった。

👤 あれ、聞こえてますか。   → 🤖 該当する記載は見つかりませんでした(ページ検索が空振り)
👤 はい、お待ちください。   → 🤖 このページは、AIアバターが…(ページの要約)

どちらもアバターや通信について話している。ページに答えがあるはずがない。それなのに ページを検索し、当然見つからず、謝罪を返す。あるいは要約を返す。

分類が足りていなかった

システムには対話行為の分類があった。以前、こういう症状を直したときに作ったものだ。

👤 それは指定しました。 → 通し検証の説明200字 +「どの点についてお知りになりたいですか?」
👤 大体大丈夫          → ほぼ同じ内容      +「どの点についてお知りになりたいですか?」
👤 もう大丈夫。        → ほぼ同じ内容      +「どの点についてお知りになりたいですか?」

終わろうとしているのに終われない。根拠が弱いのは当然で、そもそも質問ではないから対応する 箇所が無い。このとき、分類を国際標準(ISO 24617-2)の次元に寄せて作った。

Task            本題。質問・依頼・情報提供
Auto-Feedback   相槌・理解の表明
Closing         会話を終える合図
Greeting        挨拶

4つしかなかった。 だから「聞こえてますか」も「お待ちください」も Task に落ちる。

標準には、対応する次元があった

同じ標準に、まさにこれらのための次元がある。

Contact Management     … 相手に届いているかの確認(「聞こえますか」「もしもし」)
Turn Management / hold … 自分の番を保留する(「ちょっと待って」)

独自の名前を発明せず、標準の次元に合わせた。後から機械学習の分類器に差し替えるときも、 ラベルが揃う。

これらは調べる対象が存在しないので、定型で返す。

「はい、聞こえております。」
「はい、お待ちしております。」

LLMを通さないので速い。実測で 384ミリ秒。検索も走らない。

実装で2つ踏んだ

① 部分一致にしてはいけなかった。

最初、語のパターンを部分一致で探した。

音が聞こえない原因は?   → 接続確認と判定された

これは本題だ。「聞こえない」がパターンに当たっている。接続確認も待機も短い定型なので、 文全体で照合する形に変えた。加えて「について」「教えて」といった説明要求の語が付いて いたら本題として扱う。

② 「あれ」を落とす必要があった。

あれ、聞こえてますか。 → 本題と判定された

この分類器は文ごとに分けて判定する(「わかりました。もう大丈夫。」のような複合発話を 扱うため)。そして「1つでも本題が混じれば本題」という規則にしてある。迷ったら現行の挙動に 倒す、という方針だ。

「あれ、聞こえてますか。」は「あれ」と「聞こえてますか」に分かれ、「あれ」が本題と 判定されて、全体が本題になっていた。

「あれ」は指示語にも感動詞にもなる。先頭のつなぎとしてだけ落とすようにした (文中の「あれを詳しく説明して」は指示語なので残る)。

判断を1つ変えた

「もしもし」を挨拶から接続確認へ移した。本来は「相手が出たか」を確かめる呼びかけで、 返すべきは「こんにちは。」ではなく「はい、聞こえております。」だ。

既存のテストが挨拶を期待していたので、理由をテストに書き残した。

逆に「そのままで」は拾わないことにした。「そのままで結構です」=終了とも取れて曖昧で、 無理に拾うと誤判定を招く。迷ったら本題に倒す、がこの分類器の方針だ。

検証: 過去の発話全件に掛ける

新しい分類が誤検出しないかを、過去の実発話180件に掛けて確かめた。

contact    あれ、聞こえてますか。
contact    聞こえてるじゃない。
turn_hold  はい、お待ちください。

新しい分類に落ちた発話: 3件

意図した3件だけ。誤検出ゼロ。

新しい判定を入れるときは、これが一番効く検証だと思う。テストケースは自分で考えた入力だが、 過去ログは実際に来た入力だ。「拾いすぎていないか」は、実データでしか確かめられない。

一般化できること

対話システムの入力を「質問」と決めつけると、質問でないものに答え始める。

実際の会話には、本題以外がかなり混ざる。相槌、終了の合図、挨拶、接続の確認、待機の依頼、 言い直し、独り言。これらに検索を走らせると、空振りして謝るか、無関係な要約を返す。 どちらも会話としては失敗だ。

分類を作るとき、独自の名前を発明せずに ISO 24617-2 のような既存の枠組みに寄せるのは、 費用対効果が高かった。「この発話は何をしているか」を考える語彙が既に整理されているので、 自分の分類に足りない次元がすぐ分かる。実際、今回足した2つは標準に最初から載っていた。

そして日本語の対話行為分類器は、調べた範囲では公開されているものが無かった (HuggingFace、日本語NLPリソース集ともに)。音声対話のフレームワークもターン検出 (いつ喋り終わったか)は持つが、発話の種別は持たない。ここは自作する領域だった。

決定論で作った理由は3つある。LLMに聞くと1往復増えること、判定が揺れると同じ発話が日に よって違う扱いになること、そして日本語の終了表現や確認表現は列挙できることだ。


シリーズ: 音声対話アバターに、ちゃんと答えさせるまで

この記事は第3部 見極めるにあたります。

← 前: 謝罪の言葉が、次の検索を汚していた → 次: 測っていたつもりが、別のものを測っていた

シリーズ全8本

第1部 音を止める

  1. 同じ名前のイベントが2種類あった
  2. 自己エコー対策が、一度も動いていなかった
  3. スマホの指がエコーキャンセラを壊していた

第2部 言葉を解く 4. 「それ」と「このページ」と「さっきの」は、別物だった 5. 巨大なプロンプトの末尾に置いた1行は、4回とも無視された 6. 謝罪の言葉が、次の検索を汚していた

第3部 見極める 7. 全部の発話が質問ではない ← いまここ 8. 測っていたつもりが、別のものを測っていた

知見の元になったノートは 音声対話アバターの応対品質 にまとめてあります。

← 記事一覧へ