Odyssey
開発進捗
Phase 0a〜0b 完了時点の到達点と次の主題
1. 一行まとめ
Odyssey の本質的な体験——ラベル仮説 → 設問 → 観測 → Persona 形成 → GAP 認識—— が Console 上で動く状態になった。Phase 0a の Console 基盤 + Phase 0b の推論パイプライン本実装まで完了。
残課題は コンテンツ整備(Lexicon 28 変数投入 / 設問プール再構築 / 行動データ収集)。 Phase 0c 以降の主題はインフラより中身。
2. Odyssey の本質(設計の核心)
2.1 データの 4 階層
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) |
| LLM | Vertex 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 件 → ラベルの first_questions に近い設問を優先
- 観測 ≥ 3 件 → 未投入 trait をカバー
- 回答ごとに「直前の変化」を可視化(新ラベル / α 変化 / Trait 値)
- サイドバーに 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. 動作確認手順(クリーンスタート)
- Odyssey Console にサインイン(管理者メール限定)
- /lexicon/priors で「中高生」「専業主婦」等のラベル統計を作成(LLM 候補提案も可)
- /lexicon/gap_pairs で GAP ペア定義(self_report ↔ action)
- /users/[uid] → プロファイルタブで属性入力
- セッションモードを開始 → 5〜10 問回答
- 各タブで動作確認:
- Persona: 動的抽出 + ラベル/個別比率バー
- Canvas: 「再生成」で Gemini 自然言語
- 連鎖ログ: API + ローカルのマージ
- GAP(Canvas タブ内): 検出があれば赤帯で表示
- プロファイル最下部「全データをリセット」でクリーン状態に戻せる
5. 残課題(Phase 0c 以降)
体験が「微妙」に見える根本原因は コンテンツ不足。インフラは揃ったが中身が追いついていない。
| 領域 | Phase | 内容 |
|---|---|---|
| 設問プール再構築 | 0c | Big Five 系の薄いプール → ラベル / category 連動の設問群へ |
| LLM 動的設問生成 | 0c | 既存プール枯渇時に Gemini で動的生成 + EIG 計算 |
| Lexicon 28 変数投入 | 0c | 4 ドメイン × 28 変数の体系を Firestore に投入 |
| 行動データ収集 | 0c | プロファイルタブに「行動入力」セクション追加 |
| /api/* 認証統合 | 0c | 内製 JWT のみ → Firebase ID Token も受け入れ |
| Pulse SDK | 1 | Google Maps / Calendar / Spotify / Strava の外部 API 連携 |
| Lexicon 探索モジュール | 1 | 新変数の自動発見(RAG) |
| 集団スコープ希少性 | 1 | ユーザー数増加後に本実装 |
| ベイズ更新本格化 | 2 | 階層ベイズモデル / 確率的プログラミング |
| ML パイプライン | 3 | Vertex 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 |