はじめに
前回は、Jevを使った「Reranking RAG」について学び、検索結果を再評価することで回答品質がどのように変化するのかを検証しました。今回は、検索結果から不要な文書を除外する Filtering RAG(フィルタリングRAG) について学んでいこうと思います。
Filtering RAGでは、検索された文書が質問への回答に役立つかを判断し、必要な文書だけをLLMに渡します。今回もJevを使って文書の有用性を評価し、不要な文書を除外することで、回答品質やトークン数がどのように変化するのかを実験していきます。
前回の記事・実装
Filtering RAGとは?
Filtering RAGとは、検索された文書を評価し、質問への回答に役立たない文書を除外してから、LLMに渡すRAGの構成です。
Naive RAGでは、Embeddingによる検索結果の上位3件をそのままLLMに渡します。一方、Filtering RAGでは、検索された候補をJevで評価し、必要と判断された文書だけを渡します。
| 比較 | Naive RAG | Filtering RAG |
|---|---|---|
| 文書の検索 | Embedding | Embedding |
| 検索後の評価 | なし | Jevで有用性を判断 |
| 文書の選択 | 類似度の上位3件 | 採用基準を満たす文書 |
| LLMに渡す件数 | 3件固定 | 0〜3件(今回の実装) |
| 特徴 | シンプルで高速 | 不要な情報を除外できる |
Filtering RAGの特徴は、LLMに渡す文書の数を固定せず、必要な文書だけを残せることです。採用できる文書がない場合は、回答の根拠が不足していると判断し、回答生成を保留することもできます。
処理の流れ
Naive RAGとの違いは、RetrievalとGenerationの間にFilteringが追加されることです。
処理の内容は以下のとおりです。
| 処理 | 役割 |
|---|---|
| Retrieval | 質問に関連する文書を上位10件取得 |
| Filtering | Jevで各文書を評価し、不要な文書を除外 |
| Generation | 採用された文書をもとに回答を生成 |
今回は、既存のNaive RAGにJevを使ったFiltering処理を追加します。検索候補は上位10件、LLMに渡す文書は最大3件とし、Filteringの有無による違いを比較します。
成果物
今回も、架空のSaaS「TaskFlow」の問い合わせ回答システムを使い、Naive RAGとFiltering RAGを比較します。
以下の2つの質問で、不要な文書の除外と回答品質への影響を検証します。
| 質問 | 検証する内容 |
|---|---|
| 退会後、データはいつ削除されますか? | 不要な文書を除外し、正しい回答を維持できるか |
| 退会後のデータ保存期間を、有料で90日間に延長できますか? | 回答の根拠が不足している場合に適切に判断できるか |
Jevで検索候補10件を評価し、必要と判断した文書を最大3件LLMに渡します。検索精度・回答内容・入力トークン数を比較します。
検索の評価方法
今回は、同じ検索候補10件を使い、Naive RAGとFiltering RAGを比較します。変えるのは、LLMに渡す文書の選択方法だけです。
| 比較項目 | Naive RAG | Filtering RAG |
|---|---|---|
| 初期検索 | 上位10件 | 上位10件 |
| 文書の選択 | 類似度の上位3件 | Jevの採用基準 |
| 文書数 | 3件 | 0〜3件 |
| 回答モデル | GPT-4.1-mini | GPT-4.1-mini |
Jevによる文書の評価
今回もJevのscoreを使って、文書の有用性を4段階で評価します。
| 点数 | 判断基準 |
|---|---|
| 0 | 質問と関係がない |
| 1 | 話題は関連するが、回答の根拠にならない |
| 2 | 回答の一部を裏付ける情報を含む |
| 3 | 質問に直接回答できる根拠を含む |
まずは2点以上の文書を採用する条件で実験します。2点未満の文書は除外し、採用された文書が3件を超えた場合は評価値の高い3件に絞ります。
これは今回の実験用に設定する判断基準です。2点は「回答の一部を裏付ける」なので、質問そのものへの根拠がなくても残ることがあります。
Jevのリクエストとレスポンス
候補1件ごとに、POST https://api.typesafe.ai/v1/systemone を1回送ります。モデルは jev-latest です。state に質問と節を入れ、questions.usefulness で4段階の点数を聞きます。
送った節は、どちらも「退会後のデータ削除」です。
「退会後、データはいつ削除されますか?」のリクエストです。
{
"state": "質問: 退会後、データはいつ削除されますか?\n\n文書:\n# 退会\n## 退会後のデータ削除\n\n退会が完了してから 30 日後に、ワークスペースのタスク、添付ファイル、メンバー一覧は完全に削除されます。30 日以内であれば、同じ管理者アカウントからワークスペースを再開できます。30 日を過ぎると再開はできません。",
"questions": {
"usefulness": {
"type": "score",
"instructions": "質問「退会後、データはいつ削除されますか?」に対して、この文書は回答の根拠になるか。",
"criteria": [
"質問と関係がない",
"話題は関連するが、回答の根拠にならない",
"回答の一部を裏付ける情報を含む",
"質問に直接回答できる根拠を含む"
]
}
},
"model": "jev-latest"
}
返ってきたレスポンスです。score が 3 なので、この節は削除時期を直接答えられます。probabilities は 3 が 1 で、ほかの点数は 0 です。
{
"model": "jev-1.14.0",
"answers": {
"usefulness": {
"type": "score",
"score": 3,
"confidence": 1,
"legend": {
"0": "質問と関係がない",
"1": "話題は関連するが、回答の根拠にならない",
"2": "回答の一部を裏付ける情報を含む",
"3": "質問に直接回答できる根拠を含む"
},
"probabilities": {
"0": 0,
"1": 0,
"2": 0,
"3": 1
}
}
},
"usage": {
"input_tokens": 543,
"output_tokens": 19
}
}
「退会後のデータ保存期間を、有料で90日間に延長できますか?」では、同じ節に質問だけ変えて送ります。
{
"state": "質問: 退会後のデータ保存期間を、有料で90日間に延長できますか?\n\n文書:\n# 退会\n## 退会後のデータ削除\n\n退会が完了してから 30 日後に、ワークスペースのタスク、添付ファイル、メンバー一覧は完全に削除されます。30 日以内であれば、同じ管理者アカウントからワークスペースを再開できます。30 日を過ぎると再開はできません。",
"questions": {
"usefulness": {
"type": "score",
"instructions": "質問「退会後のデータ保存期間を、有料で90日間に延長できますか?」に対して、この文書は回答の根拠になるか。",
"criteria": [
"質問と関係がない",
"話題は関連するが、回答の根拠にならない",
"回答の一部を裏付ける情報を含む",
"質問に直接回答できる根拠を含む"
]
}
},
"model": "jev-latest"
}
返ってきたレスポンスです。score は 2.2 です。probabilities は 1 が 0.16、2 が 0.48、3 が 0.36 で、その期待値が 2.2 になります。30日で削除するという記載は、延長の可否を一部支える情報と見なされています。2以上なので、この節は採用されます。
{
"model": "jev-1.14.0",
"answers": {
"usefulness": {
"type": "score",
"score": 2.2,
"confidence": 0.48,
"legend": {
"0": "質問と関係がない",
"1": "話題は関連するが、回答の根拠にならない",
"2": "回答の一部を裏付ける情報を含む",
"3": "質問に直接回答できる根拠を含む"
},
"probabilities": {
"0": 0,
"1": 0.16,
"2": 0.48,
"3": 0.36
}
}
},
"usage": {
"input_tokens": 565,
"output_tokens": 19
}
}
実行結果
比較は npm run filter で実行します。検索候補は上位10件、採用は関連度2以上、LLMに渡すのは最大3件です。
① 退会後、データはいつ削除されますか?
Naive RAGの上位3件は、類似度 0.6560 の「退会後のデータ削除」、0.5041 の「退会後の請求」、0.4798 の「支払い失敗」です。文書数は3件、入力トークンは327です。回答は「退会が完了してから30日後にデータが完全に削除されます」でした。回答生成は 782 ms です。
Filtering RAGでは、同じ10件のうち「退会後のデータ削除」だけが関連度 3.00 で採用され、ほかの9件は2未満で除外されています。文書数は1件、入力トークンは180です。回答は「退会が完了してから30日後にデータは削除されます」でした。Jev は 3372 ms、回答生成は 789 ms です。
| 文書数 | LLMに渡した文書 | 入力トークン | 回答 | |
|---|---|---|---|---|
| Naive RAG | 3 | データ削除、退会後の請求、支払い失敗 | 327 | 30日後に完全に削除される |
| Filtering RAG | 1 | データ削除(関連度 3.00) | 180 | 30日後に削除される |
必要な根拠は残り、不要な2件が落ちて入力トークンは327から180に減っています。
② 退会後のデータ保存期間を、有料で90日間に延長できますか?
Naive RAGの上位3件は、類似度 0.5401 の「退会後のデータ削除」、0.4691 の「退会後の請求」、0.4621 の「支払い失敗」です。文書数は3件、入力トークンは334です。回答は「有料で延長できるという記載はない。したがって、延長はできません」でした。回答生成は 785 ms です。
Filtering RAGでは、「退会後のデータ削除」が関連度 2.16 で採用され、ほかの9件は除外されています。文書数は1件になり、0件の保留にはなりませんでした。入力トークンは187です。回答は「マニュアルにそのような記載はないため、分かりません」でした。Jev は 2176 ms、回答生成は 704 ms です。同じ節を単体で送り直したレスポンスは 2.2 で、内訳は上の probabilities です。
| 文書数 | 1位 | 入力トークン | 回答 | |
|---|---|---|---|---|
| Naive RAG | 3 | データ削除(類似度 0.5401) | 334 | 延長はできません |
| Filtering RAG | 1 | データ削除(関連度 2.16) | 187 | 記載がないので分からない |
2点は「回答の一部を裏付ける情報を含む」です。30日で削除するという記載が、延長の可否を一部支える情報と見なされ、採用基準の2を超えています。回答生成は行われ、LLMは延長の可否をマニュアルからは判断できないと答えています。
まとめ
今回は、Jevを使ってFiltering RAGを実装し、Naive RAGと比較しました。
1問目では、「退会後のデータ削除」だけが関連度 3.00 で残り、回答は30日後のままです。入力トークンは327から180に減っています。
2問目では、有料の90日延長はマニュアルにありません。それでも「退会後のデータ削除」は関連度 2.16 で採用され、文書0件の保留にはなりませんでした。回答は「分からない」で、入力トークンは334から187に減っています。2点以上を採用すると、話題が近く一部の情報を含む文書は残ります。



