本アプリケーションは、PDFドキュメントを読み取り、文書をチャンク単位で分割・ベクトル化した上で、ユーザーのクエリに最も関連する文書部分を検索し、OpenAI GPTモデルを用いて日本語で要約・回答を生成するものです。
Gradio による Web UI を備えており、直感的に使えるインターフェースを通じて、PDF検索+要約が可能です。
- 以下のURLにアクセス
- ユーザー名とパスワードを入力
- ユーザー名: moneyforward
- パスワード: 30072025
| 技術・ライブラリー | 用途 | 選定理由 |
|---|---|---|
| Python | アプリケーション全体 | 豊富なNLPライブラリとGradioによるUI構築のしやすさ |
| Gradio | ユーザーインターフェース | 軽量でデモに適しており、セットアップが容易 |
SentenceTransformers (BAAI/bge-m3) |
文ベクトル生成 | 高精度な多言語バイエンコーダモデル |
| FAISS | ベクトル検索 | 高速な類似文書検索が可能 |
| OpenAI API | 要約・質問応答生成 | 高精度な生成モデルによる自然な応答生成 |
PyMuPDF (fitz) |
PDFテキスト抽出 | 高精度で安定した日本語PDFテキストの抽出が可能 |
| dotenv | APIキー管理 | セキュアな環境変数管理を実現 |
| AWS EC2 | アプリケーションのホスティング | セットアップやデプロイが容易 |
pip install -r requirements.txt
または個別に:
pip install gradio faiss-cpu sentence-transformers openai python-dotenv transformers pymupdf
プロジェクトルートに .env ファイルを作成し、以下のように記述してください:
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
documents/ フォルダに処理対象のPDFファイルを格納してください。
以下のコマンドでアプリケーションを起動します:
python main.py
起動後、ブラウザで表示されるURL(例: http://127.0.0.1:7860)からアプリにアクセスできます。
- 入力:
Textboxでのユーザー質問(日本語) - 出力: 入力に最も関連する文書の要約+質問への回答(日本語)
- 処理内容:
- ユーザー質問をベクトル化
- FAISSで関連文書を検索(上位5件)
- コンテキストと質問をテンプレートに埋め込み、OpenAIに送信
- 生成された要約と回答を返却
- ベクトル検索による高速なドキュメント抽出:事前に文書をベクトル化・インデックス化することで、問い合わせごとの再処理を回避
- BGEモデルを使った高精度な日本語文類似度計算
- Gradioによる手軽なUI構築:非エンジニアにも使いやすいフロントエンドを構築
- Prompt Engineering:複数のプロンプトを試行し、最も安定して良い結果が得られたものを選定
- チャンキング:RAGの精度向上のため、文書をトークン長に基づいてチャンク分割
- AWS:AWS EC2上でホスティング
- トークン長の制限対応:モデルに渡すテキストのトークン数が制限(8192)を超えるケースがあり、chunking戦略の調整が必要だった
- FAISSとベクトル整形のバグ回避:1次元 vs 2次元ベクトルの扱いの違いで型エラーが発生しやすい点に注意が必要
- AWS無料枠に収まるようアプリの容量とメモリ使用量を削減:モデルや処理フローを見直し、t3.microなどの低スペックインスタンスでも動作可能に最適化
- PDF読み取りライブラリの選定:当初 Docling を使用したが一部PDFでクラッシュしたため、安定性の高い PyMuPDF に切り替えた
.
├── your_script.py
├── documents/ # PDF格納フォルダ
├── .env # APIキー
├── requirements.txt # 依存ライブラリ(任意)
└── README.md
- FAISSインデックスをMongoDB Atlas Vector Searchに置き換え
- ハイブリッド検索やリランキング導入による検索精度の向上
- PDFの前処理パイプラインを最適化し、処理速度と精度を向上
- EC2の代替としてAWS Fargateを用いたスケーラブルなコンテナベースの運用に移行
- ユーザーごとの履歴保存
- ストリーミング対応(リアルタイム応答)