RAGシステムを作ってみた — 初めてのAIサイドプロジェクト
about 2 months agoby Shin1分で読了
Open Source
AI
RAG
LangChain
Python
共有:
RAGシステムを作ってみた — 初めてのAIサイドプロジェクト
冬休みに、RAG(Retrieval-Augmented Generation)システムをゼロから構築しました。最初は勉強目的でしたが、最終的にはGitHubでオープンソースとして公開するプロジェクトになりました。
RAGとは?
RAGは、大規模言語モデルの能力と外部知識の検索を組み合わせる技術です。LLMが学習時に「記憶した」情報だけに頼るのではなく、クエリ時に関連するドキュメントを渡して、実際の資料に基づいた回答を生成します。
LLMの学習データが古かったり不十分だったりするドメイン固有の質問に特に有用です。
プロジェクト:rag-research
rag-research — Rustの公式ドキュメントをナレッジベースとした完全なRAGパイプラインです。自然言語でRustについて質問すると、公式ドキュメントに基づいた回答が得られます。
技術スタック:
- LangChain — RAGパイプラインのオーケストレーション
- ChromaDB — ドキュメント埋め込みを保存するベクトルデータベース
- OpenAI API — 埋め込み(text-embedding-3-small)と生成(GPT-4o-mini)
- FastAPI — SSEストリーミング対応のREST API
- Chainlit — インタラクティブなWeb UI
- Docker — コンテナ化デプロイ
仕組み:
- Rustドキュメントをダウンロードし、テキストチャンクに分割
- 埋め込みを生成してChromaDBに保存
- クエリ時に、ユーザーの質問と最も類似したチャンクを検索
- そのチャンクをコンテキストとしてLLMに渡して回答を生成
- SSEでリアルタイムにレスポンスをストリーミング
学んだこと
このプロジェクトを通じて、RAGの実践的な課題を多く学びました:
- チャンキング戦略が重要 — ドキュメントの分割方法が検索品質に大きく影響する
- 埋め込み品質が決定的 — ベクトル検索はGIGO(ゴミを入れればゴミが出る)が当てはまる
- ストリーミングがUXを改善 — ユーザーは10秒待ってテキストの壁を見たくない
- 多言語RAGは難しい — EN/JA/ZH対応には言語固有のクエリ処理が必要
今後
このプロジェクトは、このブログのAIアシスタント「Kokoron」の基盤になりました。Rustドキュメントの質問応答ツールから、より汎用的なブログコンテンツアシスタントへと進化させる計画です。