~/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
Когда пригодится
- Проверить, что ответ локальной модели ссылается только на источники, которые действительно отправлялись, и что цитаты в них действительно есть
- Найти в ответе предложения без источника, прежде чем показывать ответ пользователям
- Сравнить промпты или модели на одних и тех же вопросах по тому, как часто их ссылки подтверждаются
Как пользоваться
- Вставьте источники, которые вы отправили вместе с вопросом, в том же порядке.
- Вставьте ответ: весь ответ /api/chat, ответ, совместимый с OpenAI, или текст ответа.
- Прочитайте таблицу ссылок, предложения без номера источника и источники, на которые не сослались.
Вопросы
Цитата помечена как не найденная. Значит, ответ неверен?
Не обязательно. Модель могла пересказать источник, а не скопировать его. Но цитату, которой нет в источнике, проверить нельзя, поэтому считайте это утверждение неподтверждённым, пока не прочитаете источник.
Все ссылки проходят проверку. Значит, ответ верен?
Не обязательно. Инструмент проверяет только то, что номера и цитаты совпадают с источниками. В нашем тесте модель процитировала верное правило (4 умножить на число измерений плюс 8 байт) и всё равно ответила 1552 байта вместо 1,544 для вектора с 384 измерениями.
Почему источники должны идти в том же порядке?
Номера в ответе относятся к порядку, в котором источники были отправлены. Если порядок другой, [2] указывает на другой текст, и проверка теряет смысл.
Как инструмент делит ответ на предложения?
По переводам строк, после . ! ? с последующим пробелом и после полноширинных 。!?. Номер, стоящий сразу за концом предложения, например "… here. [1]", относится к этому предложению. Сокращения вроде e.g. могут разделить одно предложение на два.
Что означает done_reason "length"?
В исходном коде Ollama это причина, которая указывается, когда ответ достиг лимита токенов (num_predict), а не закончился сам. Конец ответа, а возможно и его ссылки, отсутствуют.
Отправляются ли мои данные куда-либо?
Нет. Проверка выполняется в вашем браузере. Инструмент никогда не подключается ни к Ollama, ни к какому-либо другому сервису.
Похожие статьи
- Хранение и поиск эмбеддингов Ollama в PostgreSQL с помощью pgvectorЭмбеддинги Ollama в PostgreSQL с pgvector, поиск через HNSW или IVFFlat и передача результатов в /api/chat, чтобы ответ ссылался на источники.
- Эмбеддинги в Ollama: основы поиска и RAGСоздание эмбеддингов через /api/embed в Ollama: модели и их размеры, truncate и dimensions, векторы единичной длины и косинусное сходство, по официальной документации.