RAG、モデルにあなたの資料を読ませる
検索拡張生成のシステムをゼロから組み立てます。ドキュメントの分割、ベクトル検索、キーワード検索、クエリの書き換え、リランキング、引用つきの回答と評価。最後に RepoBot に httpx のドキュメントを読ませます。
レッスン一覧
- 01なぜ RAG が必要なのか
同じ質問でも、資料を与えなければモデルは間違え、関係するドキュメントの一節をプロンプトに入れれば正解します。RAG の基本的な流れ、何を解決するのか、そして向いていない場面を説明します。
25 分 · 中級 - 02ドキュメントの分割
httpx のドキュメントで三つの分割方法を実際に比べます。固定長、見出しごと、見出しごと+長さの上限。さらに本物の落とし穴にも出会います。コードブロックの中のコメントが見出しとして扱われてしまうのです。
35 分 · 中級 - 03ベクトル検索をゼロから書く
numpy で数十行のベクトル検索を書きます。チャンクをベクトルの行列に変え、検索時に類似度を計算して上位を取り出す。そして 20 問で評価すると、正しく見つけられたのは半分だけ。問題がどこにあるのかを見ていきます。
45 分 · 中級 - 04ハイブリッド検索とリランキング
BM25 のキーワード検索をゼロから書き、RRF でベクトル検索と融合し、中国語の質問を先に英語の検索語に書き換え、最後にリランキングモデルを加えます。どのステップも同じ 20 問で効果を数値化します。
50 分 · 中級 - 05引用つきの回答
検索したチャンクに番号を付けてモデルに渡し、一文ごとに出典を明記すること、資料にないなら「ない」と言うことを求めます。さらにプログラムで引用が有効かをチェックし、ドキュメントに答えのない質問でモデルがでっち上げるかどうかも見ます。
35 分 · 中級 - 06RAG の良し悪しをどう判断するか
RAG の評価を検索と回答の二つに分けます。検索はヒット率で見て、回答は別のモデルを評価者にし、参考回答と照らして正誤を、資料と照らして忠実さを判定させます。評価者は 60 回判定し、私がそれを一件ずつ確認したところ、評価者自身も間違えることがわかりました。
45 分 · 中級 - 07プロジェクト:アシスタントにプロジェクトのドキュメントを読ませる
分割、ハイブリッド検索、クエリの書き換え、引用つきの回答を RepoBot に組み込み、v2 を作ります。v1 が間違えた質問に正しく答え、マルチターン会話での「じゃあ非同期は?」のような追加の質問の検索問題も解決します。
60 分 · 中級
RepoBot v1 は「httpx は既定でリダイレクトに従うか」に間違え、バージョンの経緯までこしらえました。このモジュールでこの問題を解決します。答える前に、まず httpx の公式ドキュメントから関係する段落を見つけ、ドキュメントに沿って答え、出典をユーザーに伝えるようにするのです。
モジュール全体で、フレームワークはほとんど使いません。分割、ベクトル検索、BM25、融合、引用のチェックは、どれも自分で書き、それぞれ数十行です。すべての検索方法を同じ 20 問で評価するので、何か一つ加えるたびに数字が具体的にどれだけ変わるかがわかります。中にはよく言われる説と違う結果もあります。たとえば私たちのデータでは、ハイブリッド検索はキーワード検索単独よりよくはならず、最も大きな改善は安価なクエリの書き換え一回から来ました。
なぜこの順番なのか
第 1 課ではまず手作業の例で「資料を与えれば正解できる」ことを示し、RAG の流れと適用範囲を説明します。第 2 課から第 4 課では、流れの順に「資料を探す」ステップを固めます。まず分割、次に検索、そして検索の改善です。第 5 課は「資料を使う」ステップを扱います。モデルに引用つきで答えさせ、わからないときは正直にわからないと言わせます。第 6 課ではシステム全体を評価します。検索だけでなく、回答そのものもです。第 7 課でこれらを RepoBot に組み込みます。
修了の目安
- ドキュメントの構造に沿って分割でき、分割の問題(たとえばコードブロックが途中で切られる)を見つけて直せる。
- フレームワークを使わずにベクトル検索と BM25 を書き、RRF で両者を融合できる。
- 自分のドキュメント用に検索の評価問題を用意し、ヒット率と MRR を計算して、それをもとに検索方法を選べる。
- モデルに検索された資料だけに基づいて答えさせ、出典を明記させ、引用が有効かどうかをプログラムでチェックできる。
- RepoBot v2 が v1 の間違えた質問に正しく答え、ドキュメントの出典を示せる。
このモジュールのコード
コードと実行結果は実際に動かしたときのまま載せているため、コメントと出力は中国語です。
- code/04-rag/chunking.py
- code/04-rag/citations.py
- code/04-rag/eval_qa.jsonl
- code/04-rag/hybrid.py
- code/04-rag/rag_eval_results.json
- code/04-rag/rag_eval.py
- code/04-rag/rerank.py
- code/04-rag/rewrites.json
- code/04-rag/vector_search.py
- code/04-rag/why_rag.py
- projects/repobot/v2/eval_qa.jsonl
- projects/repobot/v2/eval_retrieval.py
- projects/repobot/v2/llm.py
- projects/repobot/v2/README.md
- projects/repobot/v2/repobot.py
- projects/repobot/v2/requirements.txt
- projects/repobot/v2/retrieval.py