全部の発話が質問ではない — 「聞こえてますか」にページの説明を返していた
音声対話アバターのログに、こういうやり取りがあった。
👤 あれ、聞こえてますか。 → 🤖 該当する記載は見つかりませんでした(ページ検索が空振り)
👤 はい、お待ちください。 → 🤖 このページは、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部 音を止める
第2部 言葉を解く 4. 「それ」と「このページ」と「さっきの」は、別物だった 5. 巨大なプロンプトの末尾に置いた1行は、4回とも無視された 6. 謝罪の言葉が、次の検索を汚していた
第3部 見極める 7. 全部の発話が質問ではない ← いまここ 8. 測っていたつもりが、別のものを測っていた
知見の元になったノートは 音声対話アバターの応対品質 にまとめてあります。