状況整理・会話継続の初期実装(2026-09-22)
§5.7〜§5.9の基盤をローカル実装した。本番設定・デプロイ・実配信での品質比較は行っていない。1〜6章と source_manifest.json は実装前の調査記録として残す。
この章は初期実装の記録。続く8章で、場面別の予算、TTS準備時間の実測、観客反応の観測窓と引継ぎを追加した。時間配分と台本の取消時処理は8章の仕様を優先する。
適用条件
既存の会話品質設定 conversationExperienceVersion = 2 とSituation有効時に、通常応答・ホストの自発発話・台本生成へ適用する。モデルの推論パラメータは既存の対応モデル判定と conversationReasoningEffort に従う。none を自動で引き上げず、現行設定や本番データも変更しない。v2とlowを選んだ比較から開始できる。
カンペ、認証済みGameEventの専用応答、ゲスト人格、Snapshotを持たない分類・要約には会話用の状況整理を注入しない。ゲーム実況の自発発話はAutonomousとして対象になる。
実装したもの
| 項目 | 動作と根拠 |
|---|---|
| 発話前の状況整理 | 通常応答のMain/Responses/Assistantsとホスト生成に同じ方針を注入。現在状況、発話済み内容、未回収の問い、相手の意図、キャラの反応、今回の目的を照合させる。追加の計画用LLM呼出しや推論過程の出力は要求しない |
| 応答・自発発話の共通履歴 | SituationContextService.TryCommitDeliveredSpeech の既存ledgerと同じロック内で記録。conversation.delivered_turn.<sequence> として直近6件、本文320字、TTL 5分。重複・古い実行scopeを拒否し、可聴完了と可聴断片を区別する |
| 公開範囲 | 共通履歴はv2のSituation rendererでのみ追加注入。既存の履歴公開許可、項目数・1項目文字数・総PII予算を適用し、新しい記録を優先する。最新発話と同じ本文の二重注入は抑止する。カンペ・ゲストは追加履歴の対象外 |
| 訂正の継続 | 同一の安定IDとの直前3分以内の往復と、訂正を示す入力、実際に届けた返答を一組で保持。候補は最大64人、10分、配信内だけ。後続の礼や相槌で訂正元が消えない。本人の履歴公開許可がある場合だけ、元の発言と訂正後の返答を一緒に参照する |
| 訂正の扱い | 固定語彙は候補の保持にだけ使用。意味の確定や世界の事実の上書きは行わない。対象が曖昧なら短く確認し、別人・別の出来事へ一般化しないよう指示する。自発発言には個人別の訂正記録を直接公開せず、許可された共通の実発話履歴から続ける |
| 反応と全体への伝わりやすさ | 既存のコメント履歴・件数・質問待ちを参照し、質問・共感・困惑・訂正で展開を選ぶ方針を追加。未取得・遅延・無言を不評と決めつけない。必要なときだけ初見向けに前提を補い、個別の返答を一般論へ置き換えない |
| 発言の見送り | 対応する自発発話の呼出側だけが [no_speech] の完全一致を許可。Skipped を空出力・障害・取消・時間切れから分離し、TTSにも定型文fallbackにも渡さない。本文と制御記号の混在は失敗。必須の台本発話や補助処理には見送りを指示しない |
| 取消 | 自発発話、長時間無言対応、ゲーム反応、自由会話、台本の各coroutineからCancellationTokenを渡す。待機終了・割込み・破棄でHTTPも取消。取消・予算切れをprovider障害のイベントとして数えない |
共通履歴の正本はSituation、個人別の往復・訂正の正本は既存のCharacterExperienceStateである。質問の開始・回答・完了、台本の進行権、実可聴後の副作用は既存の管理元が引き続き更新する。生成候補や見送りで「話した」「回収した」を確定しない。
台本ノードが進んでも、既に届けた発話は直近の会話として残す。旧ノードで生成した未配送の候補は既存の実行scope検証で拒否する。
配信切替、人格・場面の切替、記憶消去で短期履歴をクリアする。視聴者消去時は、発話の引用元を完全には追跡できない共有履歴も破棄する。個人別の訂正候補は永続アーカイブへ保存しない。
推論量と生成時間
時間予算は初期値であり、実配信の測定で調整する。
| 対象 | 生成全体の上限 | 推論量 |
|---|---|---|
| 通常応答 | 15秒。通常コメントは投稿TTLからTTS準備用の3秒を引いた期限とも比較し、短い方を採用 | 指定値を上限。残予算10秒未満ではmedium→low、4秒未満はnone |
| 自発発話 | 8秒 | 指定mediumはlowへ抑制。noneは保持 |
| 台本生成 | 25秒 | 指定値を上限 |
予算は1要求のVision取得・生成・retry/failover・好み修正を同じ取消tokenで囲む。通常コメントのキュー待ちなどの経過時間は投稿TTLへの絶対期限から差し引かれる。課金・System入力には通常コメントの投稿TTLを適用しない。coroutine側の待機上限や実行scopeの失効が先なら、その時点で終了する。
AsyncLocal で生成ごとの推論量・予算を分離し、並行する応答と自発発言の設定が混ざらないようにする。ログはroute・budgetSeconds・effortを出し、内部推論は記録しない。既存の管理画面の effectiveEffort は設定上の対応値であり、個々の要求で下げた値とは異なる場合がある。
タイムアウト時に延々と別providerを試さず、通常応答は取消、任意の自発発話は見送り、台本は既存の失敗・再試行方針へ戻す。生成エラーによる既存fallbackは残し、正常な見送りでは実行しない。生成を放棄したcoroutineからのHTTP取消はv1にも適用する。
実装箇所
- ConversationReasoningPolicy.cs: 共通指示、route判定、予算、推論量、見送り出力の判定。
- SituationContextService.cs、SituationPromptRenderer.cs: 実配送履歴とPII境界。
- CharacterExperienceState.cs、LLMcontroller.CharacterExperience.cs: 訂正候補の保持・公開・消去。
- LLMcontroller.ConversationExperience.cs、LLMcontroller.Monologue.cs: 要求ごとの予算・取消・生成結果。
- MonologueController.Generation.cs、MonologueController.cs、MonologueController.GameReaction.cs: 生成の寿命と配送判断。
検証と残る範囲
Unity 2022.3.15f1のコンパイルとEditMode検証で、208件成功、失敗0件、スキップ0件(2026-09-22 18:18 JST)。新規の ConversationReasoningTest / ConversationReasoningIntegrationTest は34件。Situation・CharacterExperience・provider隔離・コメント鮮度・台本寄り道・独白間隔の既存テストも含む。並行する要求のeffort隔離、レーン停止でiteratorのDisposeに依存せずHTTPを取消することも検証した。APIキーや本番データを使ったLLM/TTS呼出しはテストしていない。
再実行コマンド(リポジトリルート):
/Applications/Unity/Hub/Editor/2022.3.15f1/Unity.app/Contents/MacOS/Unity \
-batchmode -nographics -projectPath "$PWD" -runTests -testPlatform EditMode \
-testFilter 'ConversationReasoning|ConversationExperiencePolicyTest|SituationSnapshotTest|SituationPromptRendererTest|SituationAutonomy|CharacterExperience|OperatorCueLlmIsolationTest|LlmOpenAiRouteHardeningTest|LiveChatFreshnessTest|AudienceDetourStateTest|Monologue' \
-testResults /tmp/aituber-conversation-tests-final.xml \
-logFile /tmp/aituber-conversation-unity-final.log
§5.9全体の完了を示すものではない。次の範囲は実装・検証が残る。
- 語彙に依存しない訂正対象の解決と、訂正後の意味理解が継続しているかの評価。
- 挨拶・相槌・訂正候補の予算選択、台本残尺とTTS準備時間の留保は8章で追加。設定値の実配信での調整は残る。
- 観客反応の観測窓と発話との時系列の対応付けは8章で追加。意味上の対象の特定、反応別の展開品質、初見への伝わりやすさのA/B評価は残る。
- 実音声・映像での品質・待ち時間・見送り頻度の比較と、設定値の調整。