На этой странице

Проверка утверждения

Принимает одно утверждение, сам находит источники, читает их и возвращает вердикт с дословными цитатами: кто подтверждает, кто опровергает, чего проверка не покрывает. Каждая цитата сверена с текстом страницы - не найденная в тексте выбрасывается вместе со своим доводом.

POSThttps://srezai.ru/api/v1/verify

Когда использовать

  • Перед тем как выдать пользователю дату, число, цену, статус - всё, что модель может «вспомнить» неверно.
  • Проверить утверждение, пришедшее извне: из письма, тикета, чужого текста, ответа другой модели.
  • Понять, есть ли по вопросу консенсус: расхождение источников - самостоятельный, полезный ответ.
  • Убедиться, что факт не устарел, - с timeRange проверка пойдёт только по свежим страницам.

Не для этого: развёрнутый разбор темы с выводами - это DeepResearch; нужны конкретные значения с известной страницы - извлечение по схеме; нужен просто список ссылок - веб-поиск. Проверка отвечает на закрытый вопрос «так это или нет», а не на открытый «расскажи про».

Пример запроса

bash
curl -X POST https://srezai.ru/api/v1/verify \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer srz_live_ВАШ_КЛЮЧ" \
  -d '{
    "claim": "GPT-4 вышла в марте 2023 года",
    "maxSources": 4
  }'

Параметры тела

claimstringобязательный

Утверждение одной фразой, до 500 символов. Формулируйте проверяемо: «выручка X за 2024 год - 12 млрд ₽» проверяется, «X - хорошая компания» нет. Длинный текст обрезается до 500 символов.

maxSourcesnumberнеобязательный

Сколько независимых источников читать: от 2 до 5 (4 по умолчанию). Больше источников - выше шанс поймать расхождение, но и дольше. Цена от их числа не зависит.

timeRangestringнеобязательный

Свежесть источников: "" (без ограничения, по умолчанию), day, week, month, year. Для фактов, которые могли измениться - цены, курсы, должности, статусы.

languagestringнеобязательный

Язык поиска источников: auto (по умолчанию), ru, en.

querystringнеобязательный

Отдельный поисковый запрос, если утверждение как есть ищется плохо (длинное, с местоимениями, с внутренними названиями). По умолчанию ищется текст claim. До 300 символов.

Батч-режима здесь нет намеренно, в отличие от чтения и извлечения: одна проверка - это уже поиск, до пяти чтений и вызов модели. Несколько утверждений - несколько запросов, их можно вести параллельно с оглядкой на burst-лимит.

Как устроена проверка

  1. Поиск. По тексту утверждения (или по query) - до 20 результатов.
  2. Отбор. Берём по одной ссылке с домена: три статьи на одном сайте - это один голос, а не три, и бюджет чтения они тратят полностью.
  3. Чтение. Выбранные страницы читаются параллельно, по 6000 символов с каждой, с потолком 18 секунд на страницу. К отобранным адресам добавляется небольшой запас кандидатов: если сайт не открылся, слот не теряется - вместо него читается следующий по классу источник из выдачи, и только когда запас исчерпан, неоткрывшийся адрес получает повторную попытку с более щедрым сроком. Считать вердикт по случайно уцелевшей половине выдачи - не проверка. Что именно не удалось прочитать и почему, видно в meta.sourcesUnread и meta.unreadSources, это попадает в caveats, а при вердикте unverified - ещё и в саму строку вердикта: неполная проверка и «источники прочитаны и молчат» - разные факты.
  4. Вердикт. Модель получает только тексты источников и обязана опираться исключительно на них: если данных в текстах нет, вердикт - unverified, а не догадка по общим знаниям.
  5. Сверка цитат. Каждая цитата ищется в тексте той страницы, на которую сослалась модель. Не найденная выбрасывается вместе с доводом, счётчик уходит в meta.quotesRejected, а уверенность понижается пропорционально потерям. Затем проверяется предмет: если в тексте страницы нет ни имени, ни домена из утверждения, цитата отбрасывается как не относящаяся к делу (meta.quotesOffSubject) - страница про похожую, но чужую организацию не подтверждает и не опровергает утверждение, как бы ни была похожа фраза.
  6. Согласование. Вердикт приводится в соответствие с выжившими цитатами - см. Вердикт и уверенность.

Ответ

json
{
  "claim": "GPT-4 вышла в марте 2023 года",
  "verdict": "supported",
  "confidence": 0.86,
  "agreeing": 3,
  "disagreeing": 0,
  "evidence": [
    {
      "url": "https://en.wikipedia.org/wiki/GPT-4",
      "title": "GPT-4 - Wikipedia",
      "source": "en.wikipedia.org",
      "tier": "reference",
      "quote": "GPT-4 was released on March 14, 2023",
      "stance": "supports",
      "note": "прямое указание даты релиза"
    },
    {
      "url": "https://openai.com/index/gpt-4-research/",
      "title": "GPT-4",
      "source": "openai.com",
      "tier": "unknown",
      "quote": "March 14, 2023",
      "stance": "supports",
      "note": "дата публикации анонса на сайте разработчика"
    }
  ],
  "caveats": [
    "Речь о публичном релизе модели, а не о доступности через API всем пользователям."
  ],
  "meta": {
    "tookMs": 24180,
    "sourcesFound": 11,
    "sourcesPicked": 4,
    "sourcesRead": 4,
    "sourcesUnread": 0,
    "unreadSources": [],
    "quotesRejected": 1,
    "quotesOffSubject": 0,
    "independentDomains": 3,
    "independentSources": 2,
    "mirrors": 1,
    "model": "gemini-3-flash-lite",
    "inputTokens": 21460,
    "outputTokens": 312
  }
}

Поля ответа

verdictstringнеобязательный

supported, refuted, mixed или unverified - см. ниже.

confidencenumberнеобязательный

0…1 - насколько однозначны показания источников, с учётом отброшенных цитат и независимости источников. Не вероятность истинности.

agreeing / disagreeingnumberнеобязательный

Сколько разных доменов подтверждают и опровергают. Считаем домены, а не цитаты: три цитаты с одного сайта - один голос.

evidenceobject[]необязательный

Цитаты: url, title, source (домен), tier, quote (дословный фрагмент, проверенный по тексту страницы), stance (supports / contradicts / unclear), note - чем фрагмент относится к утверждению. До 8 цитат.

caveatsstring[]необязательный

Чего проверка не покрывает: устаревшие данные, другой регион, иная трактовка терминов. Сюда же попадают наши собственные пометки - про отброшенные цитаты и про единственный источник. До 5 пунктов.

metaobjectнеобязательный

tookMs, sourcesFound (сколько ссылок дал поиск), sourcesPicked (сколько отобрано в чтение), sourcesRead (сколько страниц прочитано), sourcesUnread и unreadSources (сколько отобранных страниц прочитать не удалось и почему - таймаут, недоступность, пустой текст, ошибка), quotesRejected (цитаты, не найденные в тексте), quotesOffSubject (цитаты из источников не по предмету утверждения), independentDomains (домены среди оставшихся цитат), independentSources (они же за вычетом перепечаток - именно по этому числу считаются потолки ниже), mirrors (сколько пар источников признаны перепечатками одного текста), model, inputTokens, outputTokens.

Вердикт и уверенность

  • supported - источники подтверждают утверждение.
  • refuted - источники его опровергают.
  • mixed - источники расходятся между собой. Если есть и подтверждающие, и опровергающие цитаты, вердикт становится mixed, даже когда модель выбрала сторону: агенту нужен сам факт разногласия, а confidence при этом не превышает 0.5.
  • unverified - в прочитанных текстах нет данных по существу утверждения, либо ни одна цитата не подтвердилась.

Последние два - нормальный результат, а не ошибка. HTTP-статус остаётся 200, повторять запрос бессмысленно: источников по такому утверждению нет. Осмысленный следующий шаг - сузить формулировку или задать query, а не звать проверку второй раз. Исключение - когда часть поисковых движков не ответила: тогда в caveats прямо сказано, что это сбой поиска, а не доказательство отсутствия источников, и проверку стоит повторить.

json
{
  "claim": "Redis быстрее Memcached на любых нагрузках",
  "verdict": "mixed",
  "confidence": 0.4,
  "agreeing": 1,
  "disagreeing": 2,
  "evidence": [ "…" ],
  "caveats": [
    "Сравнения относятся к разным версиям и профилям нагрузки.",
    "Подтверждение только из одного источника - независимой проверки нет."
  ]
}

Потолки уверенности, которые мы ставим независимо от мнения модели:

  • цитат не осталось → unverified, confidence: 0;
  • есть и подтверждающие, и опровергающие → mixed, не выше 0.5;
  • supported без ни одной подтверждающей цитаты → unverified, не выше 0.3 (то же для refuted);
  • потолок по числу НЕЗАВИСИМЫХ источников (домены за вычетом перепечаток одного текста): один → 0.5, два → 0.7, три и больше → 0.9;
  • среди прочитанного нет первоисточника (документации, справочника, медиа, сообщества) → не выше 0.6 плюс оговорка;
  • часть цитат отброшена → уверенность умножается на долю выживших;
  • 1.00 из веб-источников не бывает вовсе: верхняя граница - 0.9.

Перепечатки считаются одним источником: тексты прочитанных страниц сравниваются по пересечению восьмисловных фрагментов, и страницы, у которых совпадает больше 30% текста, попадают в один кластер. Три сайта с одним пресс-релизом дают один голос, а не три, и в caveats появляется строка с названиями этих доменов. Источники для чтения при этом выбираются не только по порядку выдачи: сначала площадки известного типа (документация, справочники, медиа, сообщества), и лишь потом unknown и перепечатки - чтобы подборка SEO-зеркал не заняла все места раньше первоисточника.

tier - тип площадки, не оценка правдивости

У каждой цитаты есть tier: docs (официальная документация и стандарты), reference (энциклопедии, научные базы), media, community (форумы, GitHub, Хабр), aggregator (площадки, живущие перепечаткой), unknown.

Через MCP: verify_claim

Тот же функционал доступен агенту как инструмент verify_claim MCP-сервера - с теми же параметрами. Ответ приходит текстом, сверстанным под чтение моделью: сначала вердикт и уверенность, потом сколько источников прочитано и как они разделились, дальше блоки цитат с доменом, ярлыком и ссылкой, в конце оговорки и строка про отброшенные цитаты. Порядок такой намеренно: модель внимательнее читает начало ответа, а главное здесь - не что нашлось, а можно ли этому верить.