RAG(Retrieval-Augmented Generation)を活用したドキュメント検索システムのデモアプリケーションです。社内ドキュメントに対して自然言語で質問でき、根拠のある回答を得ることができます。
| レイヤー | 技術 | 選定理由 |
|---|---|---|
| フロントエンド | Next.js 16 / React 19 | App Router + RSC対応 |
| バックエンド | FastAPI / Python 3.12 | 非同期処理・型安全 |
| 埋め込みモデル | intfloat/multilingual-e5-large | 日本語精度が高い |
| ベクトルDB | Chroma | 学習コスト低・OSS |
| LLM | Google Gemini 2.0 Flash | 無料枠あり |
| デプロイ | Vercel + HF Spaces | 無料で本番運用可能 |
- ストリーミングレスポンス - ChatGPTのようなリアルタイム表示
- マルチターン会話 - セッション内で会話履歴を保持
- ドキュメント管理 - アップロード・プレビュー・削除
- 出典表示 - ファイル名・行番号付きで回答の根拠を明示
- オンボーディング - 初回訪問者向けのガイドツールチップ
- レート制限 - Gemini無料枠に対応
- モバイルレスポンシブ - スマートフォンでも快適に利用可能
[Vercel] [HF Spaces] [Chroma]
Next.js 16 <---> FastAPI <---> Vector DB
フロントエンド バックエンド 永続化
↑ ↑
└─────── SSE ─────────┘
(ストリーミング)
simple-rag-app/
├── frontend/ # Next.js フロントエンド
│ ├── app/
│ │ ├── components/ # UIコンポーネント
│ │ ├── page.tsx
│ │ └── layout.tsx
│ ├── lib/ # API・定数・型定義
│ ├── hooks/ # カスタムフック
│ └── package.json
│
├── backend/ # Python バックエンド
│ ├── app/
│ │ ├── routers/ # APIエンドポイント
│ │ ├── services/ # ビジネスロジック
│ │ ├── models/ # データモデル
│ │ └── utils/ # ユーティリティ
│ ├── pyproject.toml
│ └── Dockerfile
│
├── dev-notes/ # 開発メモ
└── README.md
- Node.js 20+
- Python 3.12+
- uv (Pythonパッケージマネージャー)
- Google API Key (こちらから取得)
cd backend
# 依存関係をインストール
uv sync
# 環境変数を設定
cp .env.example .env
# .envファイルを編集してGOOGLE_API_KEYを設定
# 開発サーバーを起動
uv run uvicorn app.main:app --reload --port 7860cd frontend
# 依存関係をインストール
pnpm install
# 環境変数を設定(任意)
# NEXT_PUBLIC_API_URL=http://localhost:7860
# 開発サーバーを起動
pnpm run devブラウザで http://localhost:3000 を開いてください。
このプロジェクトはGitHub Actionsを使用した自動デプロイに対応しています。
GitHub (main branch)
│
├─── frontend/** 変更 ──► GitHub Actions (CI) ──► Vercel (自動デプロイ)
│
└─── backend/** 変更 ──► GitHub Actions ──► Hugging Face Spaces
- Hugging Faceでアカウントを作成
- 新しいSpaceを作成
- Space name:
rag-demo(任意) - SDK:
Docker - Visibility: Public または Private
- Space name:
- Secretsに
GOOGLE_API_KEYを設定
リポジトリの Settings > Secrets and variables > Actions で以下を設定:
Secrets:
| Name | Description |
|---|---|
HF_TOKEN |
Hugging Face Access Token(Write権限必要) |
Variables:
| Name | Example | Description |
|---|---|---|
HF_USERNAME |
your-username |
Hugging Faceのユーザー名 |
HF_SPACE_NAME |
rag-demo |
作成したSpaceの名前 |
NEXT_PUBLIC_API_URL |
https://your-username-rag-demo.hf.space |
バックエンドのURL |
- Vercelでアカウントを作成
- GitHubリポジトリをインポート
- 設定:
- Root Directory:
frontend - Framework Preset: Next.js(自動検出)
- Root Directory:
- 環境変数に
NEXT_PUBLIC_API_URLを設定
| トリガー | アクション |
|---|---|
frontend/** へのpush |
GitHub Actions でビルド検証 → Vercel が自動デプロイ |
backend/** へのpush |
GitHub Actions が HF Spaces へ自動デプロイ |
# バックエンドを手動でHF Spacesにデプロイ
cd backend
git init
git remote add space https://huggingface.co/spaces/YOUR_USERNAME/rag-demo
git add .
git commit -m "Manual deploy"
git push --force space main| メソッド | パス | 説明 |
|---|---|---|
| GET | /api/health | ヘルスチェック |
| POST | /api/chat | チャット(ストリーミング) |
| GET | /api/documents | ドキュメント一覧 |
| GET | /api/documents/{id}/content | ドキュメント内容取得 |
| POST | /api/documents/upload | ドキュメントアップロード |
| DELETE | /api/documents/{id} | ドキュメント削除 |
| POST | /api/documents/rebuild | インデックス再構築 |
cd backend
uv run pytestcd frontend
pnpm run buildこのプロジェクトを通じて学んだ主なポイント:
- チャンキング -
chunk_overlapはchunk_sizeの10-20%が推奨。文脈の断絶を防ぐ - Embedding - 意味的類似性を捉えるベクトル表現の重要性
- SSEストリーミング - ChatGPTのようなUXを実現するServer-Sent Events
- Reactのステール・クロージャ - 非同期処理では
useRefか関数型setStateを活用
詳細は dev-notes/ を参照してください。
MIT License
このプロジェクトはRAGの学習とデモ目的で作成されました。