~/tools / Эмбеддинги и поиск (RAG) / RAG Citation Checker

RAG Citation Checker — Проверьте номера источников и цитаты в ответе RAG по отправленным источникам

Проверьте ссылки в ответе RAG по отправленным источникам: каждый номер источника должен существовать, каждая цитата должна встречаться в своём источнике, а инструмент перечисляет предложения без номера источника, источники, на которые так и не сослались, и обрезанные ответы. Читает ответы /api/chat в Ollama (в том числе потоковые), ответы, совместимые с OpenAI, и обычный текст. Ничего не покидает ваш браузер.

Пример ответа написан вручную, чтобы показать цитату, которой нет в её источнике.

Источников: 4 (массив JSON из строк). Ответ распознан как: ответ /api/chat в Ollama; вид: JSON со ссылками.

Токенов в промпте (prompt_eval_count): 306

  • Цитаты из ссылки #2 нет в источнике [4].

Ссылки

ИсточникЦитатаРезультат
[2]hnsw.ef_search is 40 by defaultНайдена дословно
[4]4 bytes per dimension plus 8Нет в этом источнике

Проверяется только то, что номера и цитаты совпадают с источниками. Инструмент не может определить, верен ли ответ и действительно ли источник подтверждает предложение.

Формат ответа — по справочнику API и исходному коду Ollama, проверено на Ollama 0.40.11 2026-11-05. Ollama API: /api/chat

Всё выполняется в вашем браузере. Инструмент ни к чему не подключается.

Когда модель отвечает по пронумерованным источникам, ссылки на них можно проверить механически. Вставьте те же источники, что вы отправляли, в том же формате, что и в RAG Prompt Builder (массив JSON из строк или объектов либо текст, разделённый строками --- или пустыми строками; они нумеруются с [1] так же), и вставьте ответ. Ответом может быть весь ответ /api/chat в Ollama (инструмент берёт message.content; потоковый ответ с одним объектом JSON в строке склеивается), ответ, совместимый с OpenAI (choices[0].message.content), или просто текст. Если ответ — JSON с ответом и списком ссылок, как просит RAG Prompt Builder, инструмент проверяет каждую ссылку: номер источника должен быть одним из источников, а цитата должна встречаться в этом источнике, дословно или без учёта различий в пробелах, регистре букв, полноширинных символах и изогнутых кавычках. Если ответ — текст, инструмент собирает номера в квадратных скобках, например [2] или [1, 3], сообщает о номерах, которым не соответствует ни один источник, и перечисляет предложения без номера. В обоих случаях он перечисляет источники, на которые так и не сослались, и предупреждает, если ссылок нет совсем или если done_reason равен "length", что означает: ответ был обрезан из-за num_predict. Чего он не может — это судить, верен ли ответ. В нашем тесте с qwen2.5:7b один ответ дословно процитировал верное правило из своего источника и всё равно дал неверное число, а другой сказал, что не знает, но сослался на посторонний источник. Ссылка, прошедшая здесь проверку, показывает лишь то, что процитированный текст есть в источнике.

Основная логика этого инструмента открыта под лицензией MIT. github.com/seigo5555/toolkitbox-lib/src/rag-citations.ts

Когда пригодится

  • Проверить, что ответ локальной модели ссылается только на источники, которые действительно отправлялись, и что цитаты в них действительно есть
  • Найти в ответе предложения без источника, прежде чем показывать ответ пользователям
  • Сравнить промпты или модели на одних и тех же вопросах по тому, как часто их ссылки подтверждаются

Как пользоваться

  1. Вставьте источники, которые вы отправили вместе с вопросом, в том же порядке.
  2. Вставьте ответ: весь ответ /api/chat, ответ, совместимый с OpenAI, или текст ответа.
  3. Прочитайте таблицу ссылок, предложения без номера источника и источники, на которые не сослались.

Вопросы

Цитата помечена как не найденная. Значит, ответ неверен?

Не обязательно. Модель могла пересказать источник, а не скопировать его. Но цитату, которой нет в источнике, проверить нельзя, поэтому считайте это утверждение неподтверждённым, пока не прочитаете источник.

Все ссылки проходят проверку. Значит, ответ верен?

Не обязательно. Инструмент проверяет только то, что номера и цитаты совпадают с источниками. В нашем тесте модель процитировала верное правило (4 умножить на число измерений плюс 8 байт) и всё равно ответила 1552 байта вместо 1,544 для вектора с 384 измерениями.

Почему источники должны идти в том же порядке?

Номера в ответе относятся к порядку, в котором источники были отправлены. Если порядок другой, [2] указывает на другой текст, и проверка теряет смысл.

Как инструмент делит ответ на предложения?

По переводам строк, после . ! ? с последующим пробелом и после полноширинных 。!?. Номер, стоящий сразу за концом предложения, например "… here. [1]", относится к этому предложению. Сокращения вроде e.g. могут разделить одно предложение на два.

Что означает done_reason "length"?

В исходном коде Ollama это причина, которая указывается, когда ответ достиг лимита токенов (num_predict), а не закончился сам. Конец ответа, а возможно и его ссылки, отсутствуют.

Отправляются ли мои данные куда-либо?

Нет. Проверка выполняется в вашем браузере. Инструмент никогда не подключается ни к Ollama, ни к какому-либо другому сервису.

Похожие статьи

Похожие