kaedeasset記事 · Notes霧走町 流氷に眠る

「違う」と入力されたら、その候補だけを外して、元の問いを当て直す

When the player types "no", drop only that candidate and re-match the original question

 D09-3-T17-non-understanding-recovery・技術・日本語入力でプレイする仕組み

入力を解いて返すnon-understanding recoveryclarification requestexplicit confirmationclaude自然言語処理

港で佐伯に「船の調子はどうだ」と入力すると、佐伯は「……事件の夜の居場所か? それとも別の話か」と聞き返します。
ここで「違う」と入力すると、佐伯は居場所の話を引っ込め、「動いとるのは六隻。あとは繋いだままだ」と船の話をします。
この回は、通じなかった会話を、行き止まりにしないで戻す仕組みを書きます。

前の回(T16)で、答えるか、聞き返すか、受け流すかを点数で分けるところまで書きました。
分けた後に何を言うかで、体験はほとんど決まります。
「知らんな」しか返らないと、プレイヤーは正解の言い回しを探す作業を始めます。

この回の位置と、前後の回#

区切り: T03〜T24 日本語入力を解いて返すまで(22 回のうち 15 回目)
先に読むとよい回: T15(意図の分類)・T16(答えない判断)
次に読む回: T18(返事は選ぶだけ)

名前 — non-understanding recovery#

正式名
non-understanding recovery(非理解からの回復)
関連
clarification request(明確化要求)、explicit confirmation(明示的な確認)。広くは conversational repair(会話の修復)
略称
CR(clarification request)
日本語
非理解からの回復、誤りからの回復、聞き返し、確認要求
初出・代表
Bohus & Rudnicky, "Sorry, I Didn't Catch That! — An Investigation of Non-understanding Errors and Recovery Strategies"(6th SIGdial Workshop, 2005)。明確化要求の理論は Purver, "The Theory and Use of Clarification Requests in Dialogue"(博士論文, University of London, 2004)

非理解からの回復とは#

非理解からの回復(non-understanding recovery)とは、対話システムが入力の解釈を一つも得られなかった(非理解の)あとに、システムが取る回復の戦略のことです。
音声対話システムの研究で、理解の失敗を二つに分けます。

  • misunderstanding(誤解)… システムが間違った解釈を得た。本人は分かったつもりでいる
  • non-understanding(非理解)… システムが解釈を一つも得られなかった

Bohus & Rudnicky(2005)は後者を扱い、会議室の予約をする音声対話システムのデータで、非理解のあとにシステムが取る回復の戦略 10 種を比べました。
非理解がどこから生まれ、全体の成績にどれだけ響き、どの戦略のあとのどんな返事が回復につながるかを測っています。
問い直すか、先へ進めるかを、感覚ではなくデータで比べた研究です。

明確化要求は、相手の言ったことのどこが分からないかを尋ねる発話です。
「誰のこと?」「火曜日?」のように、省略された形で、しかも何を確かめているのかが一通りでない、というのが Purver の出発点です。

確認には二つの型があります。

  • explicit confirmation … 「札幌、でよろしいですか」と聞き、はい/いいえを待つ。確実だが 1 手かかる
  • implicit confirmation … 「札幌行きですね。何時の便にしますか」と次の質問に混ぜる。速いが、違っていたときの訂正が難しい

よく知られた弱点は三つです。

  • 確認の往復が増えると、会話が重くなる
  • はい/いいえの読み違い。「いや、そうです」のような返事がある
  • 同じ聞き返しを繰り返すと、相手は同じ言い方を繰り返し、抜け出せない

うちの受け皿の一覧#

点数で分けた後の応答に、種別の名前を付けています。

種別 いつ 返事の例(今日の佐伯)
F1.CONFIRM 採用線のすぐ下で、固有名詞が当たっている 「……{話題}、そういう話か?」
F1.WEAK 聞き返しの下限は超えたが、固有名詞の裏付けが無い 「……事件の夜の居場所か? それとも別の話か」
F1.FOLLOWUP 「詳しく」「それで」のような、直前の話題を指すだけの一言 「……事件の夜の居場所、そういう話か?」
F2.REDIRECT ここでは答えられないが、他所でなら答えられる 「そいつは駐在所の話だ。あっちを当たれ。検分の記録は駐在所にある」
F4.BRUSHOFF どこでも答えられない 「知らんな」
F4.ASK 2 回続けて外した 「いつの話だ」
F5.RESCUE 3 回続けて外した、または手帳もフラグも増えない手が 4 回続いた 人物の受け流しに加えて、内部で次の一手の助言を作る

F1 が明示的な確認、F4.ASK が足りない要素を尋ねる明確化要求、F2 が回復のために先へ進ませる手です。
このほか、日付だけの入力に「何についての話か」を尋ねる F1.DATE_ASK、未解決の指示語を尋ねる F1.DIALOGUE_TARGET(T14 の回)、複文の二つの問いを選ばせる F1.CHOICE(T12 の回)があります。

台詞は人物ごとに書いてあります。
佐伯の分を写します(characters.json の一部)。

"f1": "「……{q}、そういう話か?」",
"f1weak": "「……{q}か? それとも別の話か」",
"f1no": ["「なんだ、違うのか」", "「……はっきりせんな」", "「違うなら、初めからそう言え」"],
"f2place": ["「そいつは{where}の話だ。あっちを当たれ。{why}」", "「ここで聞いても出てこん。{where}へ行きな。{why}」"],
"f4ask": ["「誰の話をしてる」", "「いつの話だ」", "「何が聞きたいんだ、はっきり言え」"],
"f4": ["「知らんな」", "「……」", "「用が済んだら帰ってくれ」", …,
{ "requires": ["sys_missed_saeki_3"], "text": "「何が言いたいんだ、あんたは」" }]

{q} には意図の confirmText(T15 の回)が入ります。
f4 は条件つきの行を持てるので、3 回外された後の佐伯は、苛立ちが口調に出ます。
配列の行は、人物ごとの回数の剰余で順に回すので、乱数は使いません。

はい/違うの読み方#

聞き返した直後の入力は、まず返事として読みます。
processUtterance から写します(ログの組み立ては省きます)。

if (bAllowPending && !PendingIntentId.empty())
{
const bool bYesLead = leadingYes(input);
const bool bNo = !bYesLead && isNo(input);
if (!bNo && (bYesLead || isYes(input)))
{
Turn = execIntentById(Id, Src, /bConfirmedAct=/true);
Turn.reason = "F1.YES";
return;
}
if (bNo)
{
const std::set<std::string> RejectedSet = { Rejected };
const MatchResult R2 = Matcher.query(Src, Engine.state, Engine.data, Th,
&PlayedStages, &RejectedSet);
if (R2.Kind == MatchResult::EKind::Accepted && R2.IntentPtr)
{
Turn = execIntentById(R2.IntentPtr->id, Src);
Turn.reason = "F1.NO";
return;
}
…(受かるものが無ければ、人物の f1no の相槌だけを返す)
}
PendingIntentId.clear(); // 肯定でも否定でもない=別の話題
PendingInput.clear();
}

要点は四つです。

  1. 否定を先に見る。肯定語の「そう」は「そうじゃない」の頭に一致します。以前は肯定を先に見ていて、否定が肯定として実行されました(2026-09-05 に直した)
  2. 「違う」は、否定された候補だけを外して、元の入力をもう一度当てる。2026-09-21 まで、「違う」で元の問いまで捨てていました。AI のプレイヤー 3 人が「どちらを返しても自分の質問は消える」と書いたので変えました
  3. 「はい」は、保留していた候補を選ぶだけです。欠けている材料は足しません。今日の例では、「はい」で居場所の意図に入りましたが、元の「船の調子はどうだ」には日付も夜も無いので、材料の要らない段に落ち、佐伯は「何の話だ。いつのことを聞いとる」と返しました
  4. はいでも違うでもなければ、保留を捨てて新しい発話として読む

肯定と否定の判定は AdvReply.hpp です。
語は共通の言語資源 input.json にあります。

"confirmYes": ["はい", "そう", "そうです", "そうだ", "それだ", "そのこと", "うん", "ああ", "ええ", "yes"],
"confirmNo": ["いいえ", "違う", "ちがう", "そうじゃない", "別の話", "いや", "no"],
"negationMarks": ["違", "ちが", "じゃない", "ではない", "ではありません", "いいえ"],
"yesTailSuffixes": ["で", "だ", "ね", "よ", "っ"],

境界を並べます。

  • 長さ。正規化して 12 文字を超える入力は、返事として読みません。長い文は新しい発話です
  • 肯定は厳しく見る。肯定語と完全に一致するか、肯定語のあとが「で・だ・ね・よ・っ」の 1 文字か、残りも肯定語のときだけ。「そういえば昨日は」は肯定になりません
  • 否定は緩く見る。否定語で始まるか、12 文字以内に否定の印(「違」「じゃない」など)があれば否定。「はい、違います」は否定です
  • 例外として、肯定語のすぐ後ろに読点などの区切りが来て文が続く「はい、その話です。…」は、後ろに「違いません」があっても肯定として確定します(2026-10-07)
  • 場所を移ったり、相手を変えたりすると、保留は取り消されます

今日入力した結果です。

  • 「違う」→ 居場所の候補を外して当て直し、雑談の「港の船」に着地
  • 「そうじゃない」→ 同じ着地(「そう」で肯定にならない)
  • 「はい」→ 居場所の意図の、材料の要らない段
  • 「はい」の後に「詳しく」→ 直前の話題への聞き返し(F1.FOLLOWUP)

受け流しが続いたとき#

外れが続いたときの扱いは、回数で段を変えます。

  • 2 回続けて外す → F4.ASK(「いつの話だ」)
  • 3 回続けて外す → F5.RESCUE
  • 通じてはいるが、手帳もフラグも増えない手が 4 回続く → F5.RESCUE

3 つ目が要るのは、通じているのに進まない詰まりがあるからです。
8 月の AI 初見プレイで、同じ焦点のまま 32 手足踏みして、全部の手が受理されたまま救済が一度も出なかったことがありました。
同じ段の言い直しは数えません。言い方を探した回数ではなく、別の話題を試して外した回数を数えたいからです。

救済で作る次の一手の助言は、いま UE とブラウザの画面には出していません。
2026-09-12 に「ヒントとして簡単すぎる」と決め、手掛かりは本文と手帳に置くことにしました。
コアは助言を作り続け、CLI の判定と、到達の検査がそれを使います。
画面に出るのは、人物の受け流しの台詞だけです。

ほかに、聞き返しの文が先出しにならないよう、まだ明かしていない名前を含む聞き返しは出さず、受け流しに落とします。
他所へ回すときも、まだ行っていない場所の人の名前ではなく、場所の名前で言います。

名前どおりでない所 — non-understanding recovery#

non-understanding recovery の、文字入力での形です。

  • 音声認識の誤りは扱いません。入力は文字なので、非理解の原因は認識ではなく、言い方と意図の対応です
  • 非理解の線を点数で引いています。F1 の帯(0.27〜0.33)は、解釈は一つあるが自信が無い、という状態で、厳密には非理解ではなく、誤解を防ぐための確認です
  • 回復の戦略を選ぶのは、学習した方策ではなく、回数と点数の固定の規則です
  • 確認は明示的な確認だけで、暗黙の確認はしていません

弱点と、採らなかった案 — non-understanding recovery#

今日の「船の調子はどうだ」は、裏付けのない聞き返しの典型です。
船の話を聞いたのに、居場所の話かと聞き返されます。
「それとも別の話か」と添えて当てずっぽうだと分かる言い方にしていますが、話題が遠いことは隠せません。
「違う」の 1 手で船の話に届くので、行き止まりにはなりません。

採らなかった案です。

  • 2 つの候補を並べて聞く(「居場所の話か、港の船の話か」)。8 月に試して、「どちらが『はい』なのか分からない」とプレイヤー役に指摘され、候補を 1 つに絞りました
  • 暗黙の確認(受け取った意図で答えてしまい、違っていたら訂正してもらう)。間違った台詞を一度読ませることになり、推理の場面では言っていない論法を主人公が代弁してしまいます
  • 「もう一度言ってください」だけを返す。言い直しを促すだけでは、どう言えばいいかが分からず、呪文探しが始まります

聞き返しで大事なのは、外れたときの戻り道が 1 手で済むことでした。
「はい」も「違う」も、元の問いを捨てません。

検索語#

non-understanding recovery
clarification request dialogue
explicit confirmation implicit confirmation
conversational repair

聞き返されたら「違う」と入力してみてください。元の問いが消えずに、別の話へ届きます。『霧走町 流氷に眠る』の第一章はブラウザで遊べます。プロフィールのリンクから。

#claude #自然言語処理