シリーズ目次
- 第1回: プロジェクト概要と環境構築(本記事)
- 第2回: Phase 1 - ドキュメントローダーとチャンキング実装
- 第3回: Phase 2&3 - 検索と回答生成の実装
- 第4回: Phase 4 - パフォーマンスチューニング
- 第5回: Phase 5 - デプロイと運用、総括
この記事で学べること
- RAGの基本概念と仕組み
- プロジェクト全体のアーキテクチャ
- 技術スタックの選定理由
- 開発環境のセットアップ方法
- Google AI Studio APIキーの取得方法
はじめに
社内文書を活用した質問応答システムを構築したいと思ったことはありませんか?本シリーズでは、RAG(Retrieval-Augmented Generation)を使用したチャットボットを3時間で構築する方法を解説します。
RAGは、大規模言語モデル(LLM)に外部知識を組み合わせることで、より正確で信頼性の高い回答を生成する技術です。本プロジェクトでは、Google Gemini、LangChain、ChromaDBを使用して、実際に動作するチャットボットを作成します。
このプロジェクトは下記のリポジトリにあるコードを使いながら進行します。
プロジェクトの全体像
目標
- 社内文書(PDF、Word、テキスト)を検索可能にする
- 自然言語での質問に対して、関連情報を検索して回答する
- パフォーマンスチューニング機能を実装する
- Webブラウザから利用できるUIを提供する
- クラウドにデプロイして公開する
システムアーキテクチャ
┌─────────────────┐
│ ユーザー │
└────────┬────────┘
│
↓
┌─────────────────┐
│ Streamlit UI │
└────────┬────────┘
│
↓
┌─────────────────┐
│ LangChain │
│ - Retriever │
│ - QA Chain │
└────────┬────────┘
│
┌────┴────┐
↓ ↓
┌────────┐ ┌────────┐
│ChromaDB│ │Google │
│ │ │Gemini │
└────────┘ └────────┘
処理フロー
- ドキュメントをテキストに変換
- テキストを適切なサイズに分割(チャンキング)
- 各チャンクのEmbeddingを生成
- ChromaDBにインデックスとして保存
- ユーザーの質問を受け取る
- 質問に関連するチャンクを検索
- 検索結果をコンテキストとしてLLMに渡す
- LLMが回答を生成
開発フェーズ
本プロジェクトは5つのフェーズに分かれています。
- Phase 1(30分): ドキュメント読み込みとチャンキング
- Phase 2(30分): 検索機能の実装
- Phase 3(30分): 回答生成とUI構築
- Phase 4(30分): パフォーマンスチューニング
- Phase 5(30分): デプロイと動作確認
技術スタックの選定理由
なぜGoogle Geminiを選んだか
コスト面での優位性
- Google AI Studioの無料枠: 1日1,500リクエスト
- OpenAI GPT-3.5-turboは従量課金
- 学習・プロトタイプ開発では無料枠で十分
性能面
- Flashモデルは高速化に最適化
- 平均レスポンス時間: 1-3秒
- 大きなコンテキストウィンドウ(最大100万トークン)
学習面での利点
- Google AI Studioでブラウザから即座にAPIキー取得
- クレジットカード登録不要
- 最新のLLM技術を習得できる
なぜLangChainを選んだか
学習リソースの豊富さ
- 最も広く使われているRAGフレームワーク
- チュートリアルが豊富
- エラー解決が容易
抽象化のメリット
- API切り替えが容易(OpenAI、Gemini等)
- ベクトルDB切り替えが数行の変更で可能
- 将来的な拡張に有利
エコシステムの充実
- Document Loaders: PDF、Word等の読み込み
- Text Splitters: チャンキング戦略
- Vector Stores: 各種ベクトルDB対応
- Chains: RAGパターンの実装
なぜChromaDBを選んだか
セットアップの簡単さ
pip install chromadb
これだけで使用可能。他のベクトルDBと比較して、外部サービスへの登録やDockerのセットアップが不要です。
学習目的に最適
- 環境構築で時間を使わない
- ローカルで完結
- 数百〜数千ドキュメントの規模に対応
LangChainとの統合
from langchain.vectorstores import Chroma
vectorstore = Chroma(
persist_directory="./chroma_db",
embedding_function=embeddings
)
数行で使用開始できます。
なぜStreamlitを選んだか
開発速度の速さ
最小限のコードでWebアプリケーションを構築できます。
import streamlit as st
st.title("RAGチャットボット")
query = st.text_input("質問を入力")
if query:
answer = qa_chain(query)
st.write(answer)
10行程度で基本UIが完成します。
Python開発者に最適
- HTML/CSS/JavaScriptの知識不要
- 全てPythonで完結
- データ可視化が容易
デプロイが簡単
Streamlit Community Cloudを使用すれば、GitHubリポジトリと連携するだけでデプロイできます。
プロジェクト構造
完成後のディレクトリ構造は以下のようになります。
rag-chatbot/
├── .env # 環境変数(APIキー等)
├── .gitignore # Git除外設定
├── requirements.txt # Pythonパッケージ
├── README.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
環境構築
前提条件
- Python 3.9以上
- Gitがインストールされていること
- テキストエディタ(VS Code推奨)
リポジトリのクローン
git clone https://github.com/TOMOYAKATO-292/RAG.git
cd RAG
Python仮想環境の作成
プロジェクトごとに独立したPython環境を作成します。
# 仮想環境の作成
python -m venv venv
# 仮想環境の有効化(macOS/Linux)
source venv/bin/activate
# 仮想環境の有効化(Windows)
venv\Scripts\activate
仮想環境が有効化されると、プロンプトが以下のように変わります。
(venv) $
必要なパッケージのインストール
requirements.txt
の内容を確認します。
# Streamlit
streamlit>=1.31.0
# LangChain
langchain>=0.3.0
langchain-google-genai>=2.0.0
langchain-community>=0.3.0
# Vector Database
chromadb>=0.4.22
# Google AI
google-generativeai>=0.8.0
# Document Processing
pypdf>=3.17.0
python-docx>=1.1.0
# Utilities
tenacity>=8.2.0
python-dotenv>=1.0.0
インストールを実行します。
pip install -r requirements.txt
Google AI Studio APIキーの取得
-
Google AI Studioにアクセス
https://aistudio.google.com/ -
Googleアカウントでログイン
-
左側のメニューから「Get API Key」をクリック
-
「Create API Key」をクリック
-
APIキーが表示されるので、コピー
環境変数の設定
プロジェクトのルートディレクトリに.env
ファイルを作成します。
touch .env
.env
ファイルを開き、以下の内容を記述します。
GOOGLE_API_KEY=your-api-key-here
your-api-key-here
の部分を、先ほどコピーしたAPIキーに置き換えてください。
.gitignoreの確認
APIキーなどの機密情報がGitにコミットされないよう、.gitignore
に以下が含まれていることを確認します。
# Environment Variables
.env
.env.local
# ChromaDB
chroma_db/
動作確認
環境構築が完了したら、サンプルコードで動作確認を行います。
Pythonインタープリタでの確認
python
>>> import streamlit
>>> import langchain
>>> import chromadb
>>> import google.generativeai as genai
>>> print("環境構築完了!")
環境構築完了!
>>> exit()
エラーが出なければ、パッケージのインストールは成功です。
Google AI Studio APIの接続確認
簡単なスクリプトでAPIキーの動作を確認します。
test_api.py
を作成します。
import os
from dotenv import load_dotenv
import google.generativeai as genai
# 環境変数の読み込み
load_dotenv()
# APIキーの取得
api_key = os.getenv("GOOGLE_API_KEY")
if not api_key:
print("エラー: GOOGLE_API_KEYが設定されていません")
exit(1)
# Gemini APIの設定
genai.configure(api_key=api_key)
# モデルの初期化
model = genai.GenerativeModel('gemini-2.0-flash-exp')
# テスト用のプロンプト
response = model.generate_content("こんにちは。簡単に自己紹介してください。")
print("APIの接続に成功しました!")
print("\nGeminiからの応答:")
print(response.text)
実行します。
python test_api.py
正常に動作すれば、Geminiからの応答が表示されます。
APIの接続に成功しました!
Geminiからの応答:
こんにちは!私はGeminiです。Googleが開発した大規模言語モデルで、...
サンプルドキュメントの準備
次回以降の実装で使用するサンプルドキュメントを配置します。
mkdir -p data/raw
リポジトリには既にサンプルドキュメントが含まれています。data/raw/
ディレクトリに以下のようなファイルがあることを確認してください。
就業規則.md
経費精算マニュアル.md
備品購入フロー.md
- その他の社内文書
独自のドキュメントを使用したい場合は、data/raw/
ディレクトリにPDF、DOCX、TXT、MDファイルを配置してください。
トラブルシューティング
パッケージのインストールエラー
# pipを最新版にアップグレード
pip install --upgrade pip
# 個別にインストールを試す
pip install streamlit
pip install langchain
APIキーエラー
.env
ファイルの場所と内容を確認してください。
# .envファイルの確認
cat .env
APIキーが正しく設定されているか確認します。また、APIキーにスペースや改行が含まれていないことを確認してください。
Pythonバージョンの確認
python --version
Python 3.9以上であることを確認してください。古いバージョンの場合は、Python 3.9以上をインストールしてください。
まとめ
第1回では、RAGチャットボットプロジェクトの全体像と開発環境の構築を行いました。
達成したこと
- RAGの基本概念を理解
- プロジェクトのアーキテクチャを把握
- 技術スタックの選定理由を理解
- Python仮想環境の構築
- 必要なパッケージのインストール
- Google AI Studio APIキーの取得と設定
- API接続の確認
次回予告
第2回では、Phase 1としてドキュメントローダーとチャンキング機能を実装します。PDF、DOCX、TXT、MDファイルを読み込み、適切なサイズに分割し、ChromaDBにインデックスを作成します。
- ドキュメントローダーの実装
- テキスト分割(チャンキング)の実装
- Embedding生成の実装
- ChromaDBへの保存
参考リンク
- GitHubリポジトリ: https://github.com/TOMOYAKATO-292/RAG
- Google AI Studio: https://aistudio.google.com/
- LangChain公式ドキュメント: https://python.langchain.com/
- Streamlit公式ドキュメント: https://docs.streamlit.io/
- ChromaDB公式ドキュメント: https://docs.trychroma.com/