きっかけ
こんにちは!
最近、RAG(Retrieval-Augmented Generation)の動きをちゃんと理解してみたくていろいろ調べているのですが、クラウドサービスが主流の中、なかなかイメージしづらいものがありますよね。
で、どうせならローカルのPDFとかテキストに質問できるようなアプリにしたら面白そうだなと。
そうして作ったのが、LocalQA というWebアプリです。
手元のファイルを読み込んで、AIに「これどういうこと?」って聞いたら、ちゃんと中身を読んで答えてくれる。
実際に動かしてみると、思った以上に便利でびっくりしました。
できること
LocalQAでは、以下のようなことができます。
- PDFやTXT、DOCXファイルをアップロードしてデータベース化
- 文書の内容を自然言語で質問し、AIが回答
- 回答の出典(元文書の一部)を表示
- 関連する質問を自動で提案
- データベースごとの統計やチャンク分布を可視化
セットアップ
Python環境で動きます。以下で起動できます。
git clone https://github.com/your_username/localqa.git
cd localqa
pip install -r requirements.txt
次に、.env
ファイルを作成して、OpenAIのAPIキーを設定します。
OPENAI_API_KEY=your_api_key_here
アプリ起動:
streamlit run app.py
ブラウザが開いてWebアプリが立ち上がります。
データベースの作成と管理
サイドバーから「データベース管理」を選びます。
- 新しいデータベースを作成
- 既存のデータベースを選択(ラジオボタン)
- 削除や初期化も可能です。
ファイルは複数同時にアップロード可能。対応フォーマットは PDF
, TXT
, DOCX
。
アップロードが完了すると、自動でチャンク分割(500文字 + オーバーラップ100文字)が行われ、埋め込み処理が始まります。
質問してみる
「質問応答」タブを開き、使用するデータベースを選びます。
質問を入力し、「質問する」ボタンをクリックすると、以下の情報が返ってきます。
- AIによる回答
- 出典テキスト(チャンク)
- 関連質問の提案
データベース分析機能
アップロードされた文書やチャンクの状況をグラフと表で確認できます。
- 総チャンク数
- 総ファイル数
- 総文字数
- 平均チャンク長
- チャンク長の分布
- ファイルごとのチャンク数・文字数など
技術スタック
LocalQA は以下の技術で構成されています。
- Python 3.9+
- Streamlit:UI構築
- OpenAI:埋め込み&質問応答
- FAISS / ChromaDB:ベクトル検索
- PyMuPDF, python-docx:ファイル読み込み
- LangChain / LlamaIndex:一部機能に使用可能(拡張予定)
プロジェクト構成は以下の通りです:
local_qa/
├── app.py # Streamlitアプリの本体
├── file_loader.py # ファイル読み込み
├── embedder.py # 埋め込み処理
├── vector_store.py # ベクトルDB管理
├── qa_engine.py # 質問応答ロジック
├── config.py # 各種設定
├── logger.py # ログ出力
├── logs/ # ログ保存先
├── data/ # アップロードファイル格納
├── index/ # ベクトルDB格納先
├── requirements.txt
└── README.md
注意点
- OpenAI APIキーが必要(
.env
ファイルで管理) - ファイルサイズ上限は200MBまで
- チャンク分割は自動(変更可能)
- データベース削除は復元不可なので注意
- 音声ではなく、テキストベースの応答です(音声対応は検討中)
GitHub
コードは以下で公開しています:
📎 https://github.com/mtrtrdev/localqa
スターしてもらえると嬉しいです!
日々のファイル整理と知識活用に、AIとの自然なやりとりができるLocalQA。
業務でも趣味でも、ローカルデータの新しい活かし方として、ぜひ使ってみてください。