Odyssey
開発進捗

Phase 0a〜0b 完了時点の到達点と次の主題

1. 一行まとめ

Odyssey の本質的な体験——ラベル仮説 → 設問 → 観測 → Persona 形成 → GAP 認識—— が Console 上で動く状態になった。Phase 0a の Console 基盤 + Phase 0b の推論パイプライン本実装まで完了。

残課題は コンテンツ整備(Lexicon 28 変数投入 / 設問プール再構築 / 行動データ収集)。 Phase 0c 以降の主題はインフラより中身。

2. Odyssey の本質(設計の核心)

2.1 データの 4 階層

Lexicon
辞書 / スキーマ。全プロダクト共通の variable_id マスタ(型・値域・prior)。MBTI 化リスクを構造的に回避するための「ラベルは型ではなく確率分布」設計。
Trait
個別ベクター値。ユーザー × 変数 × 値 × 信頼度。category 体系で attribute / action / achievement / self_report / external_eval を区別。
Persona
一元管理された推論結果。効用関数の重みベクトル + Typing + マッチしたラベル + 2 モデル統合での mix。
Canvas
表現。Gemini 2.5 Flash で生成される自然言語サマリー + 類型 + 固有性タグ。

2.2 MBTI との決定的な差

MBTI

自己申告の質問紙 → 16 型のいずれかに当てはめる。回答が増えても型は固定。Stated Preference のみで個人を記述する。

Odyssey

行動ファクトから価値観を逆算する(Revealed Preference)。観測が増えるほどラベルの効力は減衰し、A さん固有像が支配的になる。自己申告と行動の GAP(自己認知のズレ) を可視化する独自体験。

2.3 2 モデル統合(ラベル × 個別 × 減衰)

ラベルは マクロ分析の永続ツール + ミクロの初期仮説補助輪 の二目的。

Persona(N) = α(N) × Model 1(ラベル統計駆動)
            + (1 - α(N)) × Model 2(個別観測駆動)

α(N) = exp(-N / τ),  τ=20

  N = 0   : Persona ≒ 100% ラベル(中高生の典型像)
  N = 20  : Persona ≒ 37% ラベル + 63% 個別観測
  N = 100 : Persona ≒ 100% 個別観測(A さん固有像)

観測が増えるほど Persona は個別像に収束。ラベルは消えないが Persona の中心ではなくなる。これが「中高生 → A さん」の遷移を構造的に保証する。

3. 完了機能

3.1 Console インフラ(Phase 0a)

領域内容
フロントNext.js 16 + Tailwind v4 + TypeScript strict
認証Firebase Auth (Google OAuth) + AdminGuard + FastAPI 側 admin bypass
デプロイFirebase App Hosting(staging branch 自動)
バックエンドFastAPI on Cloud Run (asia-northeast1)
LLMVertex AI Gemini 2.5 Flash (us-central1)

3.2 ユーザー詳細 6 タブ

プロファイル

attribute Trait 入力(学校 / 地域 / 年齢 / 学年 / 職業)+ データクレンジング

回答

セッションモード入口 + Muse 設問へのバルク回答

Trait

category 別表示(attribute / action / achievement / self_report / external_eval)

Persona

動的抽出 + 2 モデル統合(ラベル × 個別 × α 減衰)+ マッチしたラベル + 5 軸ドメイン概観(補助)

Canvas

Gemini 2.5 Flash 自然言語サマリー + 固有性ハイライト + GAP 検出

連鎖ログ

API + localStorage マージ。「Odyssey の頭の中」を時系列で可視化

3.3 セッションモード(Phase 0b・体験の核心)

/users/[id]/session で 1 問ずつ動的選定 + リアルタイム Persona 更新。

3.4 Lexicon 管理

機能エンドポイントUI
Priors(ラベル統計)CRUD/lexicon/priors/lexicon/priors
LLM 候補提案POST /lexicon/priors/suggest同上
GAP ペア定義 CRUD/lexicon/gap_pairs/lexicon/gap_pairs

3.5 推論パイプライン

機能エンドポイント
Trait 蓄積 + 連鎖ログ自動記録POST /users/{id}/traits
連鎖ログ API(Firestore 永続化)GET / POST /users/{id}/inference_log
Canvas LLM 自然言語サマリーGET /users/{id}/canvas (キャッシュ + 再生成)
GAP 検出GET /users/{id}/gaps
全データリセットDELETE /users/{id}/reset

4. 動作確認手順(クリーンスタート)

  1. Odyssey Console にサインイン(管理者メール限定)
  2. /lexicon/priors で「中高生」「専業主婦」等のラベル統計を作成(LLM 候補提案も可)
  3. /lexicon/gap_pairs で GAP ペア定義(self_report ↔ action)
  4. /users/[uid] → プロファイルタブで属性入力
  5. セッションモードを開始 → 5〜10 問回答
  6. 各タブで動作確認:
    • Persona: 動的抽出 + ラベル/個別比率バー
    • Canvas: 「再生成」で Gemini 自然言語
    • 連鎖ログ: API + ローカルのマージ
    • GAP(Canvas タブ内): 検出があれば赤帯で表示
  7. プロファイル最下部「全データをリセット」でクリーン状態に戻せる

5. 残課題(Phase 0c 以降)

体験が「微妙」に見える根本原因は コンテンツ不足。インフラは揃ったが中身が追いついていない。

領域Phase内容
設問プール再構築0cBig Five 系の薄いプール → ラベル / category 連動の設問群へ
LLM 動的設問生成0c既存プール枯渇時に Gemini で動的生成 + EIG 計算
Lexicon 28 変数投入0c4 ドメイン × 28 変数の体系を Firestore に投入
行動データ収集0cプロファイルタブに「行動入力」セクション追加
/api/* 認証統合0c内製 JWT のみ → Firebase ID Token も受け入れ
Pulse SDK1Google Maps / Calendar / Spotify / Strava の外部 API 連携
Lexicon 探索モジュール1新変数の自動発見(RAG)
集団スコープ希少性1ユーザー数増加後に本実装
ベイズ更新本格化2階層ベイズモデル / 確率的プログラミング
ML パイプライン3Vertex AI MLOps

6. 関連ドキュメント

領域場所
Why / What(正本)~/company/00_ceo/10_cpo/10_odyssey/_context.md
技術設計(CTO 向け)~/company/00_ceo/20_cto/odyssey-inference-architecture.md
Console 実装計画~/company/00_ceo/10_cpo/10_odyssey/console-implementation-plan.md
Console 可視化方針~/company/00_ceo/10_cpo/10_odyssey/console-visualization-plan.md
本進捗ドキュメントの MD 正本~/company/00_ceo/10_cpo/10_odyssey/PROGRESS.md