ProvenanceGuard: у MCP-агента факт может быть верным, а источник нет

29 сентября Multiverse Computing выложила на Hugging Face разбор ProvenanceGuard. Слой садится после ответа MCP-агента и смотрит, тот ли источник назван, а не только нашёлся ли факт где-то в следах. Для бота, который за один ответ зовёт поиск, карточку клиента и базу, путаница источников как раз и ломает доверие к цитате.

Пост называется Getting the Source Right, Not Just the Fact. Полное имя работы: ProvenanceGuard: Source-Aware Factuality Verification for MCP-Based LLM Agents. Текст лежит на странице статьи Hugging Face, номер 2606.18037.

RAGAS faithfulness, MiniCheck, AlignScore и SummaC в обычном виде спрашивают, держит ли утверждение общая куча evidence. Какой выход MCP-инструмента его поддержал и тот ли это источник, который назвал ответ, они не разбирают. Ошибку, когда факт верный, а приписан не туда, в посте называют cross-source conflation.

30 дней возврата не из карточки аккаунта

В примере из поста агент поддержки говорит: по записи аккаунта в тарифе есть окно возврата 30 дней. Окно может быть настоящим, но жить в документе политики, а не в записи, на которую ссылается ответ. Свалить два текста в одну кучу, и утверждение выглядит поддержанным. Держать их отдельно, и атрибуция уже неверная. В чувствительных данных чужой источник бьёт не слабее неверного факта.

Тот же рисунок у клинического агента. Деталь лекарства из истории пациента становится кривой, как только ответ подаёт её как находку из медицинской литературы. Поэтому оценки faithfulness для MCP-агента мало. У ответа есть происхождение: иногда прямым «по записи аккаунта», иногда намёком. ProvenanceGuard эту связь не выбрасывает.

След MCP не схлопывают в одну кучу

ProvenanceGuard стоит поверх чёрного ящика. Агент уже ответил. Слой читает снятый след MCP: выходы инструментов и их идентификаторы источников. Модель агента заново не учат. Evidence в один безымянный контекст не сваливают, source id тащат через весь конвейер.

Дальше пять шагов подряд. Ответ режут на конкретные утверждения. Для каждого ищут самый близкий источник. Проверяют, что этот источник утверждение действительно держит. Сравнивают его с тем, который ответ назвал или подразумевает. На выходе вердикт по каждому утверждению и общее решение: пропустить ответ или заблокировать.

В экспериментах статьи модели были локальные, чтобы следы крутить офлайн и под контролем. Маршрутизацию к источнику делает MiniLM, карточка sentence-transformers/all-MiniLM-L6-v2. Поддержку утверждения проверяет NLI-модель DeBERTa, карточка MoritzLaurer/DeBERTa-v3-base-mnli-fever-anli. Отдельная локальная языковая модель режет ответ на утверждения. Число, дата или идентификатор, которых в источнике нет, не проходят только потому, что фраза звучит гладко. Калиброванный шаг собирает сигналы в решение. Если ответ заблокирован, починка в духе RARR может предложить правку от источника или безопасный запасной текст, и верификатор смотрит ещё раз.

Эти имена моделей относятся к замеренной сборке, а не к обязательной комплектации ProvenanceGuard. Те же шаги можно перенести на облачные модели, но такой контур надо заново тестировать и калибровать. Цифры в посте сняты с локальной конфигурации. Политика осторожная: для чувствительных данных важнее верный источник, чем самый быстрый ответ. Отдельного тарифа, кнопки в чате и пакета на VPS в тексте нет.

138 из 139 и 67 лишних стопов

Проверяли на ответах медицинского агента. Тот ходил в карты пациентов, в исследовательские статьи и в другие инструменты. Получилось 281 живой след. Медицина тут удобна тем, что факт из карты пациента и факт из общего обзора нельзя считать одним источником. Тот же подход годится в других областях, если агент хранит выходы инструментов и source id.

На основном тесте люди разобрали 361 утверждение из 40 ответов, отложенных от данных, на которых систему собирали. Эксперты сказали, что 139 утверждений пропускать нельзя. ProvenanceGuard поймал 138 и пропустил одно. Ещё 67 утверждений, которые эксперты считали поддержанными, слой придержал и отправил на разбор или починку. Это осторожный режим: лучше второй взгляд на часть годных утверждений, чем пропуск негодных. Если источник у утверждения опознаваем, верный источник слой выбирал примерно в 86% случаев этого теста.

На тех же утверждениях прогнали ещё четыре проверки поддержки. У ProvenanceGuard самый высокий F1 на отказ.

  • ProvenanceGuard: F1 0,802, идентификатор источника на каждое утверждение есть.
  • MiniCheck: 0,783, идентификатора нет.
  • RAGAS Faithfulness: 0,758, идентификатора нет.
  • AlignScore: 0,662, идентификатора нет.
  • SummaC-ZS: 0,436, идентификатора нет.

Соседи по таблице не говорят, какой выход инструмента поддержал утверждение. ProvenanceGuard эту связь пишет, так что ревьюер видит проверенный источник и решение по каждой строке.

Похожие источники: точный id в 50,3%

Отдельный тест жёстче: источников несколько, и они похожи. F1 на решение «блокировать или нет» вышел 0,846. Точный источник при этом угадан только в 50,3% утверждений. Развести похожие источники пост сам называет открытым местом.

Был и контролируемый прогон на чужую атрибуцию. В 50 случаях поменяли названный источник, а поддерживающие evidence оставили как были. ProvenanceGuard поймал все 50 подмен. Явная ошибка источника видна. Выбрать один id из пачки правдоподобных источников сложнее. Здесь как раз разъезжается ожидание «F1 высокий, значит цитата точная».

173 блокировки и 144 запасных текста

Блокировка имеет смысл, если с ответом ещё что-то делают. Петля починки в духе RARR на полном следе закрыла все 173 заблокированных ответа. Но 144 из них закончились запасным текстом, а не содержательной переписью. Система предпочла не сочинять ответ, который нельзя проверить.

На восстановленных многоисточниковых следах свежий прогон починки закрыл все 59 изначально заблокированных ответов. Только два закончились запасным текстом.

Как офлайн-шлагбаум накладные расходы скромные. На заявленной локальной сборке это примерно полсекунды на ответ. Сами вызовы NLI и маршрутизации укладываются в десятки миллисекунд.

В том же посте есть прикладной след, не отдельный продукт. В NVIDIA NVFlow влили необязательную стадию проверки заземления для финансового агента. Она сверяет уже готовый ответ с фрагментами SEC, которые агент достал, и пишет отдельные решения. Исходный rollout и обучающие данные не трогает. Берут source-aware подход ProvenanceGuard. Петля починки остаётся у исследовательской системы, а не у этого изменения.

Оценка grounded у бота с несколькими MCP-инструментами значит разное. Либо факт нашёлся в любом выходе инструмента, либо его держит тот источник, который ответ назвал. Цифры выше сняты с локального офлайн-прогона на медицинских следах. На похожих источниках точный id держится лишь в половине утверждений, а часть годных слой специально придерживает. Облачную сборку пост предлагает калибровать заново, а не переносить локальные 0,802 как готовый порог.

Источники и ссылки


Комментарии загружаются…