Gemini Flash Live を使った受付AIアバターの勉強用プロトタイプです。最大のポイントは 「Web検索を挟んでも会話が無音にならない」設計で、以下ではその仕組みを含めて技術構成を説明します。
図の要点:ブラウザとFastAPIサーバーはWebSocketで常時接続。サーバーはGemini Liveとも別のWebSocketで常時接続し、音声をほぼそのまま中継する。企業リサーチや時事ネタの取得は、 この音声の接続とは別に、Gemini(非Live)+ Google Searchへ非同期で発火する(点線)。
| フェーズ | 名称 | やること | 終了条件 |
|---|---|---|---|
| 1 | 受付確認 | 訪問者名・アポ相手・予約時刻を確認 | 必須スロットが全部埋まる |
| 2 | 属性収集 | 企業名・業界・来訪都道府県などを確認。企業名が埋まった瞬間に裏でリサーチ発火 | 必須スロットが全部埋まる |
| 3 | 案内中雑談 | 会議室まで案内する想定のビジネス雑談。リサーチ結果・時事ネタ・想定QAを自然に活用 | 設定したターン数に到達(既定10) |
| 4 | 到着・締め | 会話を締めくくり「こちらが会議室です」で終了 | 締めの発話が1回完了 |
Gemini Liveの応答生成をブロックせずに検索するため、tool呼び出しへの応答は即座に返し、 実際の検索は裏で並行実行、完了したら「声に出さない内部メモ」として会話に差し込みます。
実測値:検索完了まで平均12秒前後かかるが、この間も音声のやり取りは止まらない。 さらに、最初の音声チャンクが届くまでの体感遅延は実測 約0.85秒(ターン全体の完了時間とは別物)。
想定外の話題を振られた場合も同じ非同期パターンを使い回す。モデルが lookup_more
というfire-and-forgetなtoolを呼び、その場は相槌でつなぎながら裏で追加検索し、結果を次のターンで使う。
| 区分 | 内容 | 設定画面のセクション |
|---|---|---|
| A. 話し方・人格 | 名前・一人称・口調・呼称・NGトピック・誠実さの指示 | A |
| B. 音声設定 | Voice名 | B |
| C. フェーズ制御 | 案内中雑談のターン数・聞き直し回数・タイムアウト秒数 | C |
| D. 収集スロット | 項目の追加・削除・キー/ラベル/フェーズ/必須の編集(完全動的) | D |
| F. 自社情報・QA | 会社名・概要・会議室案内・想定QAの追加削除 | F |
| E. 検索・リサーチ | 有効/無効・モデル・検索観点・発火スロット・文字数上限 | E |
| G. ログ | ログレベル・プリセットID(A/B比較用) | G |
| 時事ネタ | 手動更新ボタン/起動時24時間鮮度チェックの自動更新 | ページ下部 |
保存はconfig.yamlへの書き込みのみで、サーバー再起動は不要です (WebSocket接続のたびにconfig.yamlを読み直す設計のため、次の会話から反映されます)。
| ファイル | 役割 |
|---|---|
main.py | FastAPIエントリポイント。起動時の時事ネタ鮮度チェックも担当 |
config.yaml | 外出しパラメータの実体 |
reception/config.py | config.yamlの読み書き・バリデーション |
reception/slots.py | 来訪者情報スロットの管理 |
reception/phases.py | フェーズ1〜4のステートマシン・ターン数管理 |
reception/prompts.py | システムプロンプト・tool宣言の動的組み立て |
reception/knowledge.py | 自社情報・QAのテキスト整形 |
reception/research.py | 非同期リサーチ本体・ResearchCoordinator |
reception/trending.py | 時事ネタの取得・キャッシュ |
reception/session_log.py | JSONLセッションログ(効果測定用) |
reception/live_proxy.py | Gemini Live WebSocketプロキシ本体 |
reception/settings_routes.py | /settings, /api/config, /api/trending-topics |
static/index.html | 受付デモ画面 |
static/settings.html | 設定編集画面 |
tests/ | pytest一式(下記参照) |
| 対象 | 内容 |
|---|---|
| config | 読み込み・保存・バリデーション(キー重複/不正文字/フェーズ範囲/trigger_slot_key整合性) |
| slots / phases | スロット充足判定、フェーズ遷移、ターンカウント |
| prompts | スロット構成に応じた動的なtool宣言・進行案内文の生成 |
| research / trending | 非ブロッキング性(検索中もキューが即座に返る)、エラー時のフォールバック |
| settings API | 保存 → 再読み込み → システムプロンプト反映までの一気通貫確認 |
| app boot | FastAPIアプリの起動・ルーティング確認 |
テストはtests/fixtures/config.yamlという固定フィクスチャを見る設計にしており、
運用者が本物のconfig.yamlを設定画面から自由に変更してもテストが壊れないようにしている。