~/tools / 埋め込みと検索(RAG) / RAG Citation Checker
RAG Citation Checker — RAG の回答の出典番号と引用文を、送った出典と照らして確認
RAG の回答の引用を、送った出典と照らして確認します。出典番号がすべて存在するか、引用文がその出典に含まれているかを調べ、出典番号のない文、一度も引用されなかった出典、途中で打ち切られた回答を一覧にします。Ollama の /api/chat のレスポンス(ストリーミングを含む)、OpenAI 互換のレスポンス、プレーンテキストを読めます。入力した内容はブラウザの外に出ません。
例の回答は、出典にない引用文を示すために手で書いたものです。
出典4件(文字列のJSON配列)。回答はOllama の /api/chat のレスポンスとして読み取り、形式は引用つきのJSONです。
プロンプトのトークン数(prompt_eval_count): 306
- 引用#2の引用文は、出典 [4] にありません。
引用
| 出典 | 引用文 | 結果 |
|---|---|---|
| [2] | hnsw.ef_search is 40 by default | そのまま見つかった |
| [4] | 4 bytes per dimension plus 8 | この出典にはない |
確認できるのは、番号と引用文が出典と一致することだけです。回答が正しいかどうか、出典が本当にその文を裏付けているかどうかはわかりません。
レスポンスの形式は Ollama のAPIリファレンスとソースコードで、2026-11-05に Ollama 0.40.11 で確認しました。 Ollama API: /api/chat
すべてブラウザの中で処理されます。ツールはどこにも接続しません。
モデルが番号付きの出典をもとに答えたとき、その引用は機械的に確認できます。送ったものと同じ出典を、RAG Prompt Builder と同じ形式で貼り付け(文字列かオブジェクトのJSON配列、または --- の行か空行で区切ったテキスト。同じように [1] から番号が付きます)、そのあとに回答を貼り付けます。回答は、Ollama の /api/chat のレスポンス全体(ツールは message.content を取り出します。1行に1つのJSONオブジェクトが並ぶストリーミングのレスポンスは連結されます)、OpenAI 互換のレスポンス(choices[0].message.content)、またはテキストだけでもかまいません。RAG Prompt Builder が求める形の、回答と引用のリストを持つJSONであれば、ツールは各引用を確認します。出典番号は出典のどれかでなければならず、引用文はその出典に、そのままか、空白、大文字小文字、全角文字、曲がった引用符の違いを無視したうえで含まれているはずです。回答がテキストなら、ツールは [2] や [1, 3] のような角括弧の中の番号を集め、出典に対応しない番号を報告し、番号のない文を一覧にします。どちらの場合も、一度も引用されなかった出典を一覧にし、引用がまったくないとき、または done_reason が "length" のとき(回答が num_predict で打ち切られたという意味です)に警告します。できないのは、回答が正しいかどうかの判断です。qwen2.5:7b を使った私たちのテストでは、ある回答は出典の正しい規則を一字一句引用したのに誤った数字を答え、別の回答はわからないと言いながら無関係な出典を引用しました。ここで通る引用が示すのは、引用された文が出典にあるということだけです。
このツールの計算部分は、オープンソース(MIT ライセンス)で公開しています。 github.com/seigo5555/toolkitbox-lib/src/rag-citations.ts
こんな時に使う
- ローカルのモデルの回答が、実際に送った出典だけを、実際にそこにある引用文で引用していることを確認する
- 回答をユーザーに見せる前に、出典のない文を見つける
- 同じ質問に対するプロンプトやモデルを、引用がどれだけ成り立つかで比べる
使い方
- 質問と一緒に送った出典を、同じ順序で貼り付けます。
- 回答を貼り付けます。/api/chat のレスポンス全体、OpenAI 互換のレスポンス、または回答のテキストです。
- 引用の表、出典番号のない文、引用されなかった出典を読みます。
FAQ
引用文が見つからないと表示されました。回答は間違っていますか?
そうとは限りません。モデルが出典をそのまま写さず、言い換えた可能性があります。ただ、出典にない引用文は確認できないので、出典を読むまではその主張を裏付けのないものとして扱ってください。
すべての引用が通りました。回答は正しいですか?
そうとは限りません。ツールが確認するのは、番号と引用文が出典と一致するかだけです。私たちのテストでは、モデルは正しい規則(4 × 次元数 + 8 バイト)を引用したのに、384次元のベクトルについて、1,544ではなく1552バイトと答えました。
出典を同じ順序にしなければならないのはなぜですか?
回答の中の番号は、出典を送った順序を指しています。順序が違うと [2] が別のテキストを指すことになり、確認は意味を持ちません。
ツールは回答をどのように文に分けますか?
改行で、また . ! ? のあとに空白が続くところで、そして全角の 。!? のあとで分けます。"… here. [1]" のように文の終わりのすぐあとに来る番号は、その文のものと数えます。e.g. のような略語で、1つの文が2つに分かれることがあります。
done_reason の "length" は何を意味しますか?
Ollama のソースコードでは、回答が自分で止まらずにトークンの上限(num_predict)に達したときの理由です。回答の終わりが、場合によっては引用も、欠けています。
データはどこかに送られますか?
いいえ。確認はブラウザの中で行われます。ツールが Ollama やほかのサービスに接続することはありません。