GiovanniPasq/agentic-rag-for-dummies
A modular Agentic RAG built with LangGraph — learn Retrieval-Augmented Generation Agents in minutes.
エージェント型RAG入門
概要 – LangGraph 上に構築された、モジュール式でエージェント駆動の検索拡張生成(RAG) システムの最小コード例です。階層的なドキュメントインデックス、会話メモリ、クエリ明確化、マルチエージェントのマップリデュース推論を、単一の拡張可能なパイプラインに組み合わせる方法を示しています。
中核となるアイデア
| ステップ | 内容 |
|---|---|
| ドキュメント準備 | PDFをMarkdownに変換し、その後2回分割します。文脈用の大きな親チャンク(Markdown見出しによる)と、精密な検索用の小さな子チャンクに分けます。 |
| 会話メモリ | 要約と最近のターンを組み合わせることで、LLMのコンテキストを肥大化させずにダイアログの一貫性を保ちます。 |
| クエリ明確化 | システムは曖昧な質問を書き換え、複数部分からなるクエリを分割し、不足している詳細をユーザーに尋ねるために一時停止することができます。 |
| マルチエージェントのマップリデュース | 各サブクエリは独自のLangGraphサブグラフ(並列エージェント)で実行されます。各エージェントは子チャンクを検索し、対応する親チャンクを取得し、結果が弱い場合は自己修正し、トークン制限内に収まるようにコンテキストを圧縮します。 |
| 集約 | すべてのエージェントの回答が、単一の流暢なレスポンスに統合されます。 |
主な機能(READMEに記載されている通り)
- 階層的インデックス – 小さなチャンクからの精度、大きな親セクションからの豊かさ。
- 会話メモリ – ターンをまたいでコンテキストが保持されます。
- 人間参加型の明確化 – システムは処理を進める前にユーザーに明確化を求めることができます。
- エージェントオーケストレーション – LangGraphがワークフロー全体を調整します。
- マップリデュース並列処理 – 複数のサブクエリが同時に処理されます。
- 自己修正 – エージェントは信頼度が低い場合に自動的に再クエリします。
- コンテキスト圧縮 – 作業メモリをコンパクトに保ちます。
- 可観測性 – Langfuseと統合し、LLM呼び出し、ツール使用、グラフ実行をログ記録します。
- 評価 – RAGASメトリクススイートで回答をスコアリングするノートブックを提供します。
技術スタック
- Python ≥ 3.11
- LangGraph(v1.2以上)によるグラフベースのエージェントオーケストレーション
- Qdrant ベクターストアとハイブリッド密+疎検索(密はHuggingFace埋め込み、疎はFastEmbed BM25)
- LLMプロバイダー – デフォルトはOllama(ローカルモデル
granite4.1:8b)ですが、コードはOpenAI、Anthropic、Google Gemini、またはLangChain互換のチャットモデルで動作します。 - Chunky(オプション) – PDFからMarkdownへの変換とチャンク検査のためのヘルパーツールキット。
- Langfuse – オプションの可観測性ダッシュボード。
- RAGAS – 検索と回答の品質を定量的に評価するため。
はじめに(概要)
- 依存関係をインストール –
pip install -r requirements.txt(LangGraph、LangChain、Qdrantクライアントなどが含まれます)。 - ベクトルDBをセットアップ – リポジトリはローカルのQdrantインスタンスを作成します(
client = QdrantClient(path="qdrant_db"))。 - ドキュメントを追加 – PDFを
docs/に配置し、ノートブックまたはスクリプトを実行してMarkdownに変換します(pdfs_to_markdowns)。 - インデックス作成 –
index_documents()関数が親/子チャンクを構築し、子チャンクをQdrantに保存します。親メタデータはJSONファイルとして保存されます。 - LLMを選択 –
llm = ChatOllama(...)の行を編集するか、適切なAPIキーを設定した後、ChatOpenAI、ChatAnthropicなどに置き換えます。 - デモを実行 –
notebooks/agentic_rag.ipynbを開いて(またはColabバッジを起動して)、チャットインターフェースと対話します。 - 評価 –
notebooks/evaluation.ipynbを使用して、生成された回答のRAGASスコアを計算します。
対象読者
- 学習者 – エージェント型RAGパイプラインの各コンポーネントを説明するステップバイステップのノートブックを必要とする方。
- 開発者 – 自分のデータ、LLM、ツールに合わせてフォークして適応できる、既製のモジュール式アーキテクチャを探している方。
- 研究者 – マルチエージェント検索、自己修正、ハイブリッド密・疎検索の実験に興味がある方。
主な特徴(READMEに記載の通り)
- 階層的インデックス – 小さなチャンクによる精度と、大きな親セクションによる豊富さ。
- 会話メモリ – ターンをまたいでコンテキストが保持されます。
- 人間参加型の明確化 – システムは処理を進める前にユーザーに明確化を求めることができます。
- エージェントオーケストレーション – LangGraphがワークフロー全体を調整します。
- マップリデュース並列処理 – 複数のサブクエリを同時に処理します。
- 自己修正 – エージェントは信頼度が低い場合に自動的に再クエリします。
- コンテキスト圧縮 – 作業メモリをコンパクトに保ちます。
- 可観測性 – Langfuseと統合し、LLM呼び出し、ツール使用、グラフ実行をログ記録します。
- 評価 – RAGASメトリクススイートで回答をスコアリングするノートブックを提供します。
技術スタック
- Python ≥ 3.11
- LangGraph(v1.2+)によるグラフベースのエージェントオーケストレーション
- Qdrant ベクターストアとハイブリッド密+疎検索(密はHuggingFace埋め込み、疎はFastEmbed BM25)
- LLMプロバイダー – デフォルトは Ollama(ローカルモデル
granite4.1:8b)ですが、OpenAI、Anthropic、Google Gemini、またはLangChain互換のチャットモデルでも動作します。 - Chunky(オプション) – PDFからMarkdownへの変換とチャンク検査のためのヘルパーツールキット。
- Langfuse – オプションの可観測性ダッシュボード。
- RAGAS – 検索と回答品質の定量的評価用。
はじめに(概要)
- 依存関係のインストール –
pip install -r requirements.txt(LangGraph、LangChain、Qdrantクライアントなどが含まれます)。 - ベクトルDBのセットアップ – リポジトリはローカルのQdrantインスタンスを作成します(
client = QdrantClient(path="qdrant_db"))。 - ドキュメントの追加 – PDFを
docs/に配置し、ノートブックまたはスクリプトを実行してMarkdownに変換します(pdfs_to_markdowns)。 - インデックス作成 –
index_documents()関数が親/子チャンクを構築し、子チャンクをQdrantに保存します。親メタデータはJSONファイルとして保存されます。 - LLMの選択 –
llm = ChatOllama(...)の行を編集するか、適切なAPIキーを設定した後、ChatOpenAI、ChatAnthropicなどに置き換えます。 - デモの実行 –
notebooks/agentic_rag.ipynbを開いて(またはColabバッジを起動して)、チャットインターフェースと対話します。 - 評価 –
notebooks/evaluation.ipynbを使用して、生成された回答のRAGASスコアを計算します。
対象読者
- 学習者 – エージェント型RAGパイプラインの各コンポーネントを説明するステップバイステップのノートブックを求める方。
- 開発者 – 自分のデータ、LLM、ツールに合わせてフォークして適応できる、既製のモジュール式アーキテクチャを探している方。
- 研究者 – マルチエージェント検索、自己修正、ハイブリッド密・疎検索の実験に興味がある方。
主な特徴(READMEに記載の通り)
- 階層的インデックス – 小さなチャンクによる精度と、大きな親セクションによる豊かさ。
- 会話メモリ – ターンをまたいでコンテキストが保持されます。
- 人間参加型の明確化 – システムは処理を進める前にユーザーに明確化を求めることができます。
- エージェントオーケストレーション – LangGraphがワークフロー全体を調整します。
- マップリデュース並列処理 – 複数のサブクエリが同時に処理されます。
- 自己修正 – エージェントは信頼度が低いときに自動的に再クエリします。
- コンテキスト圧縮 – 作業メモリをスリムに保ちます。
- 可観測性 – Langfuseと統合し、LLM呼び出し、ツール使用、グラフ実行をログ記録します。
- 評価 – RAGASメトリクススイートで回答をスコアリングするノートブックを提供します。
技術スタック
- Python ≥ 3.11
- LangGraph(v1.2+)によるグラフベースのエージェントオーケストレーション
- Qdrant ベクターストアとハイブリッド密+疎検索(密はHuggingFace埋め込み、疎はFastEmbed BM25)
- LLMプロバイダー – デフォルトは Ollama(ローカルモデル
granite4.1:8b)ですが、OpenAI、Anthropic、Google Gemini、またはLangChain互換のチャットモデルでも動作します。 - Chunky(オプション) – PDFからMarkdownへの変換とチャンク検査のためのヘルパーツールキット。
- Langfuse – オプションの可観測性ダッシュボード。
- RAGAS – 検索と回答の品質を定量的に評価するため。
はじめに(概要)
- 依存関係をインストール –
pip install -r requirements.txt(LangGraph、LangChain、Qdrantクライアントなどが含まれます)。 - ベクトルDBをセットアップ – リポジトリはローカルのQdrantインスタンスを作成します(
client = QdrantClient(path="qdrant_db"))。 - ドキュメントを追加 – PDFを
docs/に配置し、ノートブックまたはスクリプトを実行してMarkdownに変換します(pdfs_to_markdowns)。 - インデックス作成 –
index_documents()関数が親/子チャンクを構築し、子チャンクをQdrantに保存します。親メタデータはJSONファイルとして保存されます。 - LLMを選択 –
llm = ChatOllama(...)の行を編集するか、適切なAPIキーを設定した後、ChatOpenAI、ChatAnthropicなどに置き換えます。 - デモを実行 –
notebooks/agentic_rag.ipynbを開いて(またはColabバッジを起動して)、チャットインターフェースと対話します。 - 評価 –
notebooks/evaluation.ipynbを使用して、生成された回答のRAGASスコアを計算します。
対象読者
- エージェント型RAGパイプラインの各コンポーネントを説明するステップバイステップのノートブックを求める学習者。
- 自分のデータ、LLM、ツールに合わせてフォークして適応できる、既製のモジュール式アーキテクチャを探している開発者。
- マルチエージェント検索、自己修正、ハイブリッド密・疎検索の実験に興味がある研究者。
強み
- モジュール式 – 各コンポーネント(埋め込みモデル、ベクトルストア、PDF変換、エージェントグラフ)が分離されており、交換が簡単です。
- プロバイダー非依存 – どのLangChainチャットモデルでも動作し、特定のベンダーに縛られません。
- 可観測性 – オプションのLangfuse統合により、LLM呼び出しのデバッグと監視が容易です。
- 評価機能内蔵 – RAGASノートブックが定量的なフィードバックを提供します。
- 人間参加型(Human-in-the-loop) – クエリ明確化により、曖昧なプロンプトによる幻覚が軽減されます。
制限事項 / 未解決の点
- デフォルトのOllamaモデルには、ローカルQdrantインスタンスとGPU対応環境が必要です。クラウド代替手段には追加のセットアップが必要です。
- 階層的インデックスロジックはかなり複雑で、初心者はマージ/リバランス手順を理解するためにヘルパー関数を読む必要があるかもしれません。
- 自己補正のしきい値(
RETRIEVAL_SCORE_THRESHOLD = 0.4)はハードコードされており、異なるコーパスでは調整が必要な場合があります。 - デモはPDF/Markdownソースに焦点を当てています。他のドキュメントタイプには追加の前処理コードが必要です。
クイックスタートスニペット
from langchain_ollama import ChatOllama
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_qdrant.fastembed_sparse import FastEmbedSparse
from qdrant_client import QdrantClient
# LLM(ローカルOllama)
llm = ChatOllama(model="granite4.1:8b", temperature=0, seed=42)
# 埋め込み(dense + sparse)
emb_dense = HuggingFaceEmbeddings(model_name="Qwen/Qwen3-Embedding-0.6B")
emb_sparse = FastEmbedSparse(model_name="Qdrant/bm25")
# ベクターストア
client = QdrantClient(path="qdrant_db")
# … コレクションを作成し、ドキュメントをインデックス化してから、ノートブックに示されているようにLangGraphチャットループを開始します。
結論 – エージェント型RAG入門 は、階層的チャンキング、メモリ、明確化、マルチエージェント推論を組み合わせた高度なRAGシステムの、具体的で実行可能なリファレンス実装です。すべてオープンソースツール上に構築されています。これは優れた学習リソースであり、本番グレードのエージェント型検索パイプラインを構築するための確かな出発点でもあります。
SUMMARY: チュートリアル形式のオープンソースPythonプロジェクト。LangGraph、階層的チャンキング、会話メモリ、クエリ明確化、マルチエージェントのマップリデュース、自己修正、RAGASによる評価を備えた、モジュール式でエージェント駆動の検索拡張生成システムの構築方法を示しています。Ollama、OpenAI、Anthropic、Google Gemini、Qdrantベクトルストア、およびオプションのLangfuseオブザーバビリティに対応しています。
TITLE: LangGraphでモジュール式マルチエージェントRAGパイプラインを構築 – 完全なコード、ノートブック、評価
関連
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト