RAGは「検索してからLLMに渡す」固定パイプラインですが、検索回数やキーワードをLLM自身に決めさせると、より柔軟な回答が得られます。イタリアのデータサイエンティストDavide Vidotto氏が、無料講座LLM ZoomcampのModule 1を修了し、PythonだけでAgentic RAGを完成させた事例が公開されています。ソリューションコードもGitHubで入手できるため、同じ手順を追いながら再現できます。

この記事でわかること

  • Agentic RAGと従来のRAGの違い
  • minsearch・chunking・function callingを組み合わせた実装の流れ
  • 公開されているソリューションコードの場所と学習リソース

Agentic RAGとは何が違うのか

RAG(Retrieval-Augmented Generation)は、ユーザーの質問に関連する文書を検索し、その内容をLLMのプロンプトに載せて回答を生成する手法です。LLMは学習データにない情報を知らないため、外部の知識ベースから文脈を渡すことで、根拠のある回答を出せます。

従来のRAGは「質問を受け取る→検索を1回実行→LLMに渡す」という固定フローです。質問の言い回しが知識ベースとずれていると、1回の検索ではヒットしないことがあります。

Agentic RAGでは、検索をLLMが使う「ツール」として登録します。LLMがfunction callingで検索のタイミングとキーワードを自分で決め、結果を見て追加検索を行うか判断します。検索回数が事前に決まらないため、エージェントループと呼ばれる繰り返し処理が必要になります。

LLM Zoomcamp Module 1で学ぶ構成

https://github.com/DataTalksClub/llm-zoomcamp

DataTalks.Clubが提供するLLM Zoomcampは、RAGやエージェント、ベクトル検索などを10週間で学ぶ無料の実践コースです。Module 1「Agentic RAG」は2部構成になっています。

Part 1では、プレーンなPythonでRAGパイプラインを組み立てます。コースFAQデータセットに対してminsearchで検索インデックスを作り、検索結果をプロンプトに載せてOpenAI APIを呼び出す流れを、フレームワークを使わずに実装します。

Part 2では、このパイプラインをエージェント化します。function callingでLLMにsearchツールを渡し、モデルが検索の要否とクエリを判断するエージェントループを構築します。講座では教育向けの軽量ライブラリToyAIKitの使い方も扱います。

Vidotto氏が公開した実装の中身

https://github.com/davidevdt/llm_zoomcamp_code/blob/main/homework_1_agentic_rag/solutions.ipynb

2026年6月15日、Vidotto氏はXでModule 1の修了を報告し、上記Jupyter Notebookをソリューションコードとして公開しました。実装は宿題の課題に沿ったもので、コースのレッスンページ自体を知識ベースに使います。

データ取得とインデックス構築

gitsourceライブラリのGithubRepositoryDataReaderで、DataTalksClubのllm-zoomcampリポジトリからレッスンのMarkdownファイルを取得します。特定のコミットIDを指定することで、受講者全員が同じデータセットで作業できます。

取得した文書はminsearchのIndexクラスでインデックス化します。contentをテキストフィールド、filenameをキーワードフィールドに設定し、TF-IDFとコサイン類似度によるキーワード検索を行います。minsearchはAlexey Grigorev氏が開発した軽量な検索ライブラリで、Python 3.10以上が必要です。

チャンキングで検索精度を上げる

レッスンページは数千文字に及ぶものがあり、ページ単位で検索すると関連箇所以外のテキストもまとめてLLMに渡されます。gitsourceのchunk_documentsでスライディングウィンドウ方式の分割を行います。ウィンドウサイズ2000文字、ステップ1000文字の設定では、隣接チャンクが1000文字重なるため、境界で切れた文脈も別チャンクに残ります。

チャンク単位でインデックスを作り直すと、LLMに送るプロンプトのトークン数が大幅に減ります。コースの宿題では、チャンキング前後で入力トークンが約10分の1になることを確認する設計になっています。

function callingでエージェント化

最終段階では、チャンクインデックスを使うsearch関数をツールとして登録し、ToyAIKitのOpenAIResponsesRunnerでエージェントループを回します。エージェントへの指示には「複数のキーワードで何度も検索してから回答する」と明記し、LLMが自律的に検索を繰り返すよう促します。

エージェントは質問の内容に応じてsearchツールを複数回呼び出します。コースの宿題では、OpenAIのgpt-5.4-miniを使った場合にsearchが約4回呼ばれることを想定しています。モデルやプロバイダによって回数は変わりますが、「検索→結果確認→追加検索→回答」という流れが自動で回る点が、固定パイプラインのRAGとの決定的な違いです。

再現に必要な環境

Vidotto氏のリポジトリREADMEによると、環境構築はuvでパッケージ管理を行い、requests・minsearch・openai・jupyter・python-dotenvを導入します。宿題ではgitsourceとtoyaikitの追加インストールが必要です。LLMにはOpenAI APIのgpt-5.4-miniが推奨されていますが、他のモデルやプロバイダでも動作するよう設計されています。

学習を始めるなら

LLM ZoomcampのModule 1は、RAGの仕組みをコードレベルで理解してからエージェント化に進むカリキュラムです。Vidotto氏のソリューションは宿題の答え合わせ用として、そのまま手を動かす教材にもなります。

まずはコースのレッスン動画とノートでPart 1のRAGパイプラインを理解し、Part 2でfunction callingとエージェントループに進むのが効率的です。宿題の提出先はコース公式サイトからアクセスできます。

固定のRAGパイプラインを一度自分の手で組み立てたうえで、LLMに検索の判断を委ねるAgentic RAGに拡張する。この順序で学ぶことで、LangChainなどの高レベルフレームワークが内部で何をしているかも見通しやすくなります。