このプロジェクトは、RAG(Retrieval-Augmented Generation)技術を使用した質問応答システムです。PDF や Word 文書などをアップロードし、その内容について自然な日本語で質問すると、関連する情報を検索して回答を生成します。初心者向けのハンズオンを想定しています。
RAG チャットボットのメイン画面
https://ragchatbothandon202510.streamlit.app/
RAG(Retrieval-Augmented Generation)は、大規模言語モデル(LLM)と検索システムを組み合わせた技術です。
従来の LLM の課題:
- 学習データにない最新情報や専門知識には答えられない
- 回答の根拠が不明確
RAG による解決:
- ユーザーの質問に関連する文書を検索
- 検索した文書を参考に LLM が回答を生成
- 参照元の文書も表示されるため、回答の根拠が明確
- 社内マニュアル・規定の検索
- 技術文書の質問応答
- 報告書・議事録の検索
- FAQ 作成の補助
- 多様な文書形式に対応: PDF、Word(.docx)、テキスト(.txt)、Markdown(.md)
- セマンティック検索: キーワードだけでなく、意味的に関連する情報を検索
- 自然言語での回答生成: Google Gemini AI が文脈を理解して回答
- 参照元の表示: 回答の根拠となった文書を表示
- チャット形式の UI: 使いやすい Web インターフェース
- パラメータ調整: 検索精度や回答の創造性を調整可能
- パフォーマンス計測: 検索時間や処理時間を表示
- チャンキング設定: 文書の分割方法を調整して検索精度を向上
| カテゴリ | 技術 | 説明 |
|---|---|---|
| LLM | Google Gemini 2.5 Flash | 回答生成 |
| Embedding | Google text-embedding-004 | 文書のベクトル化 |
| フレームワーク | LangChain | RAG パイプラインの構築 |
| ベクトル DB | ChromaDB | 文書の保存・検索 |
| UI | Streamlit | Web インターフェース |
| デプロイ | Streamlit Community Cloud | クラウドホスティング |
詳細は技術選定理由.mdを参照してください。主なポイント:
- Google Gemini: 無料で高性能、大きなコンテキストウィンドウ
- LangChain: 豊富なドキュメントと活発なコミュニティ
- ChromaDB: セットアップが簡単、小規模データに最適
- Streamlit: 数行のコードで美しい UI を構築可能
- Python 3.9 以上
- Google アカウント(Google AI Studio API キー取得用)
git clone https://github.com/yourusername/rag-chatbot.git
cd rag-chatbotmacOS / Linux:
python -m venv venv
source venv/bin/activateWindows:
python -m venv venv
venv\Scripts\activate仮想環境が有効化されると、プロンプトが (venv) で始まります。
pip install -r requirements.txt- Google AI Studioにアクセス
- Google アカウントでログイン
- 「Get API Key」をクリック
- 「Create API Key」で API キーを生成
- 生成された API キーをコピー
プロジェクトルートに .env ファイルを作成:
# .envファイルを作成
touch .env.env ファイルに以下を記述:
GOOGLE_API_KEY=your-api-key-here
重要: your-api-key-here を実際の API キーに置き換えてください。
data/raw/ ディレクトリに検索対象の文書を配置してください。
サンプルとして、以下のドキュメントが含まれています:
- 就業規則
- 経費精算マニュアル
- 備品購入フロー
- FAQ 文書
独自の文書を使用する場合は、data/raw/ 内のファイルを置き換えてください。
streamlit run app.pyブラウザが自動的に開き、アプリケーションが表示されます。
開かない場合は、ターミナルに表示される URL(通常は http://localhost:8501)にアクセスしてください。
初回起動時、または新しいドキュメントを追加した際に必要です。
- サイドバーの「インデックス構築」セクションを確認
- ドキュメントディレクトリが正しいか確認(デフォルト:
./data/raw) - 必要に応じてチャンクサイズとオーバーラップを調整
- 「インデックス作成」ボタンをクリック
- 処理完了まで待機(数百ファイルで数分程度)
チャンクサイズとは?
- 文書を小さな塊(チャンク)に分割する際のサイズ
- 小さすぎる: 文脈が失われる
- 大きすぎる: 検索精度が下がる
- デフォルト(500 文字)で問題ない場合が多い
オーバーラップとは?
- チャンク間で重複させる文字数
- 文脈の連続性を保つために使用
- デフォルト(50 文字)で通常は十分
- 画面下部のチャット入力欄に質問を入力
- Enter キーを押すか、送信ボタンをクリック
- 回答が生成されるまで待機(通常 5 秒以内)
質問の例:
- 「有給休暇は何日取得できますか?」
- 「経費精算の期限はいつですか?」
- 「会議室の予約方法を教えてください」
- 「出張申請はどのように行いますか?」
回答と共に以下が表示されます:
- 参照元: 回答の根拠となった文書
- パフォーマンス: 処理時間の詳細
参照元を確認することで、回答の信頼性を判断できます。
サイドバーで以下のパラメータを調整できます:
取得ドキュメント数(top_k)
- 検索で取得する関連文書の数
- デフォルト: 5 件
- 多いほど情報量が増えるが、処理時間も増加
Temperature
- 回答の創造性を調整
- 0.0: 決定的(毎回同じ回答)
- 1.0: 創造的(毎回異なる可能性)
- デフォルト: 0.0(事実ベースの質問応答に最適)
原因: .env ファイルが存在しないか、API キーが正しくない
対処法:
.envファイルがプロジェクトルートにあるか確認- ファイル内に
GOOGLE_API_KEY=your-api-key-hereが記述されているか確認 - API キーが正しいか確認(Google AI Studio で確認)
- アプリケーションを再起動
原因: data/raw/ ディレクトリにファイルがない、または対応していない形式
対処法:
data/raw/ディレクトリにファイルがあるか確認- ファイル形式が対応しているか確認(PDF, DOCX, TXT, MD)
- ファイルが破損していないか確認
原因: Google AI Studio API の無料枠制限(1 分間に 15 リクエスト)
対処法:
- 1 分程度待ってから再試行
- 連続して質問する場合は間隔を空ける
対処法:
- チャンクサイズを調整(300〜800 の範囲で試す)
- 取得ドキュメント数を増やす(5〜10 件)
- 質問をより具体的にする
- インデックスを再作成
Google AI Studio API の無料枠には以下の制限があります:
- 1 日あたり: 1,500 リクエスト
- 1 分あたり: 15 リクエスト
- コスト: 完全無料
これらの制限を超えた場合、リクエストは失敗します。本番環境で使用する場合は、有料の Vertex AI への移行を検討してください。
- 絶対に Git にコミットしないでください
.envファイルは.gitignoreに含まれています- 公開リポジトリに API キーをプッシュしないよう注意してください
- 万が一 API キーが漏洩した場合は、直ちに Google AI Studio で無効化してください
# APIキーがGit履歴に含まれていないか確認
git log -p | grep -i "GOOGLE_API_KEY"何も表示されなければ安全です。
rag-chatbot/
├── .env # 環境変数(APIキー)※Gitに含めない
├── .gitignore # Git除外設定
├── requirements.txt # Pythonパッケージ
├── README.md # このファイル
├── 要件定義.md # 詳細な要件定義
├── 技術選定理由.md # 技術選定の背景
│
├── app.py # Streamlitメインアプリ
│
├── config/
│ ├── __init__.py
│ └── settings.py # 設定ファイル
│
├── src/
│ ├── __init__.py
│ ├── document_loader.py # ドキュメント読み込み
│ ├── text_splitter.py # テキスト分割
│ ├── embeddings.py # Embedding生成
│ ├── vector_store.py # ベクトルDB操作
│ ├── retriever.py # 検索機能
│ └── qa_chain.py # QAチェーン
│
├── utils/
│ ├── __init__.py
│ ├── file_handler.py # ファイル処理
│ └── performance.py # パフォーマンス計測
│
├── data/
│ ├── raw/ # 元ドキュメント
│ └── processed/ # 処理済みデータ
│
├── chroma_db/ # ChromaDB永続化ディレクトリ
│
└── tests/ # テストコード
├── __init__.py
└── test_chunking.py # チャンキングテスト
このプロジェクトは、以下の目的で開発されました:
- 学習目的: RAG の基本から最適化までを実践的に学ぶ
- 実用性: 実際に使えるツールを作る
- 低コスト: 完全無料で構築可能
- 短期間: 1 週間で完成可能な規模
詳細は要件定義.mdを参照してください。
- データ規模: 数百〜数千ドキュメントを想定(ChromaDB の限界)
- 同時接続: 5-10 ユーザー程度(Streamlit Community Cloud の制限)
- メモリ: 1GB(Streamlit Community Cloud の制限)
- ファイルサイズ: 1 ファイルあたり 10MB 以内を推奨
- 本番環境での運用は想定していない
- セキュリティ対策は最小限
- データのバックアップ機能なし
- 商用利用の場合は Google AI の利用規約を確認してください
このプロジェクトは学習目的で作成されたものです。本番環境での使用は想定していません。使用により生じたいかなる損害についても責任を負いません。
質問や問題が発生した場合は、GitHub の Issues でお知らせください。