Web開発 注目

Probabilist: The Next Token

Fullstack Developer Personal Project 2024年12月 〜 進行中

LLMの「次のトークン予測」を体験するWebゲーム。プレイヤーがAIの出力エンジンとなり、確率分布からトークンを選択して回答を生成。Gemma-2-2bモデルからリアルタイムでlogitsを抽出するサーバーレスGPU推論基盤を構築。

Probabilist: The Next Token

課題

LLMの仕組みは一般の人には理解しにくく、「AIがどのように文章を生成しているのか」「なぜAIは嘘をつくことがあるのか(ハルシネーション)」を直感的に把握することが困難。

ソリューション

ユーザーがLLMの「出力エンジン」となり、実際のモデルから抽出したlogitsベースの確率分布からトークンを選択する体験型ゲーム。Temperature・Top-K・Top-Pパラメータをリアルタイムで調整し、サンプリングの効果を体感できる。

技術スタック

React
TypeScript
Vite
Tailwind CSS
FastAPI
Python
AWS Lambda
Modal
Terraform

プロジェクト概要

Probabilist: The Next Token は、大規模言語モデル(LLM)のトークン予測メカニズムを体験できるインタラクティブな教育ゲームです。

プレイヤーはLLMの「出力エンジン」となり、NPCからの質問に対して確率付きのトークン候補から選択し、回答を生成していきます。「正解」を選ぶのではなく、**「確率の波をどう渡り歩くか」**を楽しむゲームデザインにより、AIの動作原理を直感的に理解できます。

ゲームメカニクス

コア・ゲームループ

  1. プロンプト提示 — NPCから「おすすめのランチは?」などの問いが届く
  2. トークン選択 — 画面に次のトークン候補が5つ、確率(%)と共に表示
  3. 回答生成 — 選択したトークンが確定し、次の候補が表示される
  4. 終了と評価 — 文末トークン(EOS)選択か制限到達で終了、スコア算出

スコアリングシステム

  • Perplexity(もっともらしさ) — 高確率トークンの選択で高得点
  • Hallucination(幻覚ボーナス) — 低確率トークンによる「意外性」にボーナス
  • Satisfaction(満足度) — プロンプトのキーワードに沿った回答で加点

低確率トークンほど高いボーナスを得られますが、文章の一貫性が崩れるとペナルティ。形態素解析(Sudachi)による日本語の文脈チェックで、単なるランダム選択ではなく「意味のある冒険」が報われる設計です。

サンプリングパラメータ

  • Temperature — 出力のランダム性を制御(高いほどカオス)
  • Top-K — 候補トークン数を制限
  • Top-P — 累積確率でトークンをフィルタリング

これらをリアルタイムで調整し、サンプリングの効果を体感できます。

システムアーキテクチャ

Probabilist AWS Architecture

AWSを中心としたサーバーレスアーキテクチャで構築しています。

フロントエンド

  • React 19 + TypeScript — 最新のReactで構築
  • Vite 6(SWC) — 高速なビルドと開発体験
  • Tailwind CSS v4 — ユーティリティファーストのスタイリング
  • Zustand — 軽量な状態管理(ゲーム状態、パラメータ、チャット履歴)
  • Framer Motion — スムーズなトークン選択アニメーション

バックエンド

  • Python 3.11 + FastAPI — 高パフォーマンスな非同期API
  • Pydantic v2 — 型安全なリクエスト/レスポンス検証
  • Sudachi — 日本語形態素解析による一貫性チェック
  • Mangum — AWS Lambda ASGIアダプタ

推論エンジン(プラグイン方式)

推論プロバイダーをプラグイン形式で実装し、環境に応じて切り替え可能:

  • modal — 本番用サーバーレスGPU(Gemma-2-2b-it)
  • huggingface — HF Inference API
  • mock — 開発用ダミーデータ

Modal推論エンドポイント

LLM推論の核心技術として、model.forward()による直接的なlogits抽出を実装:

# 通常のgenerate()ではなく、forward()で生のlogitsを取得
with torch.no_grad():
    outputs = self.model(**inputs)
    logits = outputs.logits[:, -1, :]  # 最後のトークン位置のみ

# Temperature適用とSoftmaxで確率分布を計算
logits = logits / temperature
probs = F.softmax(logits, dim=-1)

これにより、LLMの「生の思考」である確率分布をフロントエンドに渡し、ユーザーが実際のAIの選択プロセスを体験できます。

インフラストラクチャ

  • Frontend — AWS CloudFront + S3(グローバルCDN配信)
  • Backend — AWS Lambda + API Gateway(サーバーレス、コスト効率◎)
  • LLM推論 — Modal(サーバーレスGPU、T4インスタンス)
  • IaC — Terraform(インフラのコード管理)
  • CI/CD — GitHub Actions(自動デプロイ)

技術的ハイライト

Assistant Prefill(テキスト継続)

Gemma-2のチャットテンプレートを活用し、生成済みテキストを「アシスタントの回答の途中」として扱うことで、自然なテキスト継続を実現:

<bos><start_of_turn>user
おすすめのランチを教えてください<end_of_turn>
<start_of_turn>model
ランチ  ← ここから続きを予測

一貫性スコアリング

低確率トークンを選んでも、文章として成立していればボーナス維持。形態素解析で品詞の連接をチェックし、「意味のある冒険」と「破綻した文章」を区別します。

サーバーレス最適化

  • Lambda + API Gatewayでコールドスタートを最小化
  • Modal の scaledown_window でGPUインスタンスを5分間ウォーム保持
  • モデルキャッシュ用Volumeで起動時間を短縮

成果

AIの仕組みを「体験」として提供することで、プログラミング初心者からAI研究者まで、LLMの動作原理を直感的に理解できる教育ツールとして機能しています。

「なぜAIは嘘をつくのか?」— 「あなたが0.5%の確率のトークンを選んだからです」という体験を通じて、ハルシネーションの本質を伝えています。

関連作品