Notionの親ページと子ページを読み込み、Ollamaだけで検索・回答する、学習用のローカルRAGチャットです。
安心してローカルで利用できるよう、次の対策を実装しています。
- Node.js標準機能による自動テスト
- GitHub Actionsでテスト・ESLint・本番ビルドを自動実行
- 検索結果の並び順と件数制限をテスト
- 不正な検索データを安全に処理
- localhost以外からのAPIアクセスを拒否
- 外部Originからのアクセスを拒否
- Notion未接続・Ollama停止時のエラー表示
- 処理中のボタン連打を防止
- アクセストークンや検索データをGit管理から除外
- 自動テスト:7件成功
- ESLint:成功
- Next.js本番ビルド:成功
テストは次のコマンドで実行できます。
npm test- Notionの深い子ページまで再帰的に読み込む
- ページ階層と見出しを残したまま検索カードを作る
- EmbeddingGemmaで質問に近い箇所を検索する
- Qwen3で参考資料に基づく日本語回答を生成する
- 回答と一緒に参照元のNotionページを表示する
- OpenAI APIや有料ベクトルDBを使わず、Mac内で実行する
このリポジトリは学習用MVP・ローカル実行専用です。認証付きの社内サービスやインターネット公開用には作られていません。
- Vercel、Cloudflareなどへデプロイしないでください。
0.0.0.0で起動したり、LANへ公開したりしないでください。- 個人情報・機密情報を含む本番マニュアルには、追加の認証・権限制御・監査が必要です。
- 「完全無料」はAPI課金がないという意味です。Macの電力・保存容量・通信料は含みません。
詳しくは SECURITY.md を読んでください。
Notion
↓ ページと子ページを取得
Next.js
↓ 見出しごとに分割
EmbeddingGemma
↓ ベクトルをローカルJSONへ保存
類似検索
↓ 関連箇所だけ渡す
Qwen3
↓
回答+参照元リンク
- macOS Sonoma 14以降を推奨
- Node.js 20以降
- Ollama
- 読み取り専用のNotion Internal Connection
- Ollamaモデル
qwen3:4bとembeddinggemma
git clone <このリポジトリのURL>
cd manual-ai
npm install
ollama pull qwen3:4b
ollama pull embeddinggemma- Notion DevelopersでInternal Connectionを作ります。
Read contentだけを有効にします。Content accessに、検索対象の親ページを追加します。- Integration tokenをコピーします。GitHub、チャット、スクリーンショットには載せないでください。
npm run devブラウザで http://localhost:3000 を開きます。
検索順とローカルアクセス制限の自動テストを実行できます。
npm test- 画面左側へNotion Integration tokenを入力します。
- 検索対象のNotionページURL、またはページIDを入力します。
- 「接続する」を押します。
- 「同期を開始」を押します。
- 同期完了後、チャット欄から質問します。
Notionを更新したら「もう一度同期」を押してください。
| ファイル | 内容 | GitHubへの登録 |
|---|---|---|
data/config.json |
Notion tokenとページID | 禁止・.gitignore済み |
data/rag-index.json |
マニュアル本文とベクトル | 禁止・.gitignore済み |
.env* |
将来使う場合の環境変数 | 禁止・.gitignore済み |
設定ファイルは所有者だけが読める権限で作成されます。アプリのAPIもlocalhost以外からのリクエストを拒否します。
npm run lint
npx next build --webpack