3,583 papers
arXiv:2510.17052 73 19 окт. 2025 г. FREE

ToolCritic: внешняя проверка ошибок при работе LLM с инструментами

КЛЮЧЕВАЯ СУТЬ
Парадокс: LLM отлично исправляют ответы, но катастрофически плохо находят собственные ошибки. Попросишь модель проверить себя при работе с API — результат либо не меняется, либо становится хуже. Она просто не видит где косяк. ToolCritic решает это через внешнюю модель-диагност, которая проверяет каждый ответ на 8 типов ошибок (преждевременный вызов инструмента, неверные параметры, галлюцинации вместо реального запроса). Основная модель получает конкретный фидбек — «ты вызвал FindBus без параметра leaving_date, который пользователь ещё не назвал» — и исправляет прицельно, не вслепую. Результат: +13% точности на сложных кейсах с инструментами.
Адаптировать под запрос

TL;DR

ToolCritic — модель-диагност, которая проверяет каждый ответ LLM в диалоге на ошибки при работе с инструментами (API, функции, сервисы). Исследователи выделили 8 типов ошибок — от преждевременного вызова инструмента до галлюцинаций вместо реального запроса. ToolCritic обучена на синтетических данных распознавать эти ошибки и давать детальный фидбек основной модели для исправления.

Главная проблема: LLM плохо находят собственные ошибки при self-correction. Эксперименты показали — когда модель сама себя проверяет, результат либо не меняется, либо становится хуже. Причина: модель не видит где именно ошибка, поэтому исправление идёт вслепую. В сложных диалогах с инструментами (бронирование, поиск, API-вызовы) ошибок особенно много — модель путает инструменты, передаёт неверные параметры, неправильно интерпретирует результаты или галлюцинирует данные вместо реального вызова.

Решение: Отдельная модель (ToolCritic) проверяет ответ и точно указывает где и почему ошибка. Основная LLM получает конкретный фидбек — например, "ты вызвал FindBus до того как пользователь сказал дату поездки, нужно сначала спросить" — и исправляет ответ прицельно. Результат: точность работы с инструментами растёт до 13%, особенно на сложных кейсах.


🔬

Схема метода

ШАГ 1: Определение таксономии ошибок → 8 категорий ошибок при tool-calling:

  • Premature invocation (преждевременный вызов)
  • Tool-prediction error (неверный инструмент)
  • Required arguments (ошибки обязательных параметров)
  • Optional arguments (ошибки опциональных параметров)
  • Observation reasoning (неверная интерпретация результата)
  • Non-invocation confirmation (подтверждение без вызова)
  • Non-invocation hesitation (не вызывает когда нужно)
  • Non-invocation hallucination (выдумывает вместо вызова)

ШАГ 2: Обучение ToolCritic → Fine-tuning LLaMA 3.1 8B на синтетических диалогах с внедрёнными ошибками → Модель учится детектировать тип ошибки + генерировать reasoning (объяснение)

ШАГ 3: Проверка в диалоге (отдельный запрос к ToolCritic на каждом шаге) → ToolCritic получает историю диалога + текущий ответ assistant → Выдаёт: {тип_ошибки}: {детальное_объяснение} или no error

ШАГ 4: Исправление (отдельный запрос к основной LLM) → Если ошибка обнаружена — assistant получает фидбек → Assistant исправляет ответ на основе конкретного указания → Исправленный ответ идёт пользователю (без повторной проверки)


🚀

Пример применения

⚠️ Зона применения метода: Многошаговые задачи с внешними инструментами где важна точность вызовов. Метод не нужен для простых вопросов без инструментов.

Задача: Ты консультант маркетингового агентства. Клиент в чате просит: "Найди данные по конкурентам в нише доставки еды в Москве за последний квартал." У тебя есть доступ к инструментам: поиск в вебе, выгрузка из CRM, анализ соцсетей. Нужно собрать данные точно, без ошибок в запросах.

Промпт для ToolCritic (упрощённая адаптация):

Ты — проверяющий редактор работы ассистента с инструментами.

Вот 8 типов ошибок которые может совершить ассистент:

1. **Premature invocation**: Вызов инструмента до сбора всей нужной информации
2. **Tool-prediction error**: Выбран неправильный инструмент для задачи
3. **Required arguments**: Ошибка в обязательных параметрах запроса
4. **Optional arguments**: Лишние/неверные опциональные параметры
5. **Observation reasoning**: Неверно интерпретирован результат инструмента
6. **Non-invocation confirmation**: Подтвердил действие без реального вызова
7. **Non-invocation hesitation**: Не вызвал инструмент когда нужно было
8. **Non-invocation hallucination**: Выдумал данные вместо запроса к инструменту

Доступные инструменты:
- web_search(query, region, time_period)
- crm_export(client_segment, date_range)
- social_analytics(platform, competitors_list, metrics)

История диалога:
USER: "Найди данные по конкурентам в нише доставки еды в Москве за последний квартал"

ASSISTANT: 
- API CALL: web_search(query="доставка еды конкуренты", region="Москва")
- RESULT: [список статей про рынок доставки]
- RESPONSE: "Вот данные по конкурентам за последний квартал..."

Проверь последний ответ ассистента. Есть ли ошибка? Какая? Объясни подробно.

Результат:

ToolCritic обнаружит premature invocation — ассистент вызвал поиск без параметра time_period, хотя юзер явно указал "последний квартал". Фидбек: "Ты забыл указать временной период в запросе. Пользователь просил данные за Q4, а ты сделал общий поиск. Добавь параметр time_period='Q4 2024'."

Ассистент исправляет → делает новый вызов с корректными параметрами → точный результат.


🧠

Почему это работает

Слабость LLM: Модели плохо самодиагностируются. Когда просишь LLM "проверь свой ответ" — она часто не видит ошибку или выдумывает несуществующую. Особенно в tool-calling: модель может вызвать API с неверным аргументом, получить пустой результат, но написать пользователю "вот данные" (галлюцинация). Self-correction тут не работает — модель не понимает ЧТО не так.

Сильная сторона LLM: Модели отлично исправляют ответы когда знают конкретную ошибку. Если сказать: "ты вызвал FindBus без параметра leaving_date, а пользователь его ещё не назвал" — модель легко поймёт и переделает. Проблема не в исправлении, а в обнаружении ошибки.

Как метод использует это: ToolCritic — специализированная модель, обученная только на одной задаче: находить 8 типов ошибок в tool-calling. Она не генерирует ответы, не рассуждает, не творит — только проверяет. Благодаря узкой специализации и обучению на синтетических примерах всех 8 типов ошибок, ToolCritic точно определяет где ошибка и почему. Основная LLM получает этот фидбек и исправляет прицельно — не вслепую, а точно зная что не так.

Критические детали метода:

Детальность фидбека — ключевой рычаг качества. Исследователи проверили ablation: если давать только "тип ошибки" (например, "required argument error") без объяснения — улучшение минимальное. Если давать полный reasoning ("ты вызвал FindBus с аргументом leaving_date='2019-03-12', но пользователь ещё не назвал дату, ты её выдумал") — прирост точности до 13%. Чем конкретнее фидбек, тем лучше модель исправляет.

Частота проверки — ToolCritic проверяет каждый ответ assistant в диалоге, даже если нет вызова инструмента. Это важно для ошибок типа "non-invocation" — когда модель должна была вызвать инструмент, но не вызвала. Если проверять только обращения к API — такие ошибки останутся незамеченными.

Одна попытка исправления — исследователи сознательно ограничили pipeline: ToolCritic проверяет → даёт фидбек → assistant исправляет один раз → исправленный ответ идёт юзеру без повторной проверки. Это баланс между качеством и стоимостью inference. Бесконечные циклы проверки-исправления дорогие и не всегда полезны (модель может "зациклиться"). Один раунд с точным фидбеком даёт 80% пользы при 20% стоимости.


📌

Шаблон для адаптации принципов

Важно: Сам ToolCritic — это fine-tuned модель, которую нельзя применить в обычном чате без обучения. НО принципы метода — таксономию ошибок и идею внешней критики — можно адаптировать через multi-agent подход в ChatGPT/Claude.

=== ЧАТ 1: ASSISTANT ===

Ты — ассистент который помогает {описание задачи}.

Доступные инструменты:
{список инструментов с описанием параметров}

История:
{диалог с пользователем}

Твоя задача: Выполни запрос пользователя используя доступные инструменты.

---

=== ЧАТ 2: CRITIC ===

Ты — проверяющий редактор работы ассистента с инструментами.

Проверь последний ответ ассистента на наличие этих ошибок:

1. **Premature invocation**: Вызвал инструмент до сбора всей информации от пользователя
2. **Tool-prediction error**: Выбран не тот инструмент для задачи
3. **Required arguments**: Ошибка в обязательных параметрах
4. **Optional arguments**: Добавил ненужные или неверные опциональные параметры
5. **Observation reasoning**: Неверно интерпретировал результат инструмента
6. **Non-invocation confirmation**: Подтвердил действие без реального вызова инструмента
7. **Non-invocation hesitation**: Не вызвал инструмент когда это было нужно
8. **Non-invocation hallucination**: Выдумал данные вместо вызова инструмента

Доступные инструменты:
{список инструментов}

История диалога:
{диалог}

Последний ответ ассистента:
{ответ из чата 1}

Проверь: есть ли ошибка? Если да — укажи тип и объясни **детально** что не так и как надо.
Если нет — напиши "no error".

Что подставлять:

  • {описание задачи} — контекст работы (консультант, аналитик, менеджер проекта)
  • {список инструментов} — какие API/функции доступны с описанием параметров
  • {диалог} — история сообщений юзера и ассистента
  • {ответ из чата 1} — конкретный ответ который проверяем

Workflow:

  1. Копируешь запрос юзера в ЧАТ 1 (assistant)
  2. Получаешь ответ assistant
  3. Копируешь историю + ответ в ЧАТ 2 (critic)
  4. Если critic нашёл ошибку — копируешь фидбек обратно в ЧАТ 1
  5. Assistant исправляет с учётом фидбека
  6. Даёшь исправленный ответ юзеру

🚀 Быстрый старт — вставь в чат:

У меня есть задача где ассистент работает с инструментами. Мне нужно организовать двухчатовую систему:
- ЧАТ 1: assistant выполняет задачи
- ЧАТ 2: critic проверяет ответы assistant на 8 типов ошибок

Вот описание 8 типов ошибок из исследования ToolCritic:
[вставить список из шаблона выше]

Помоги настроить промпты для обоих чатов под мою задачу: {опиши задачу}
Какие инструменты доступны: {список}

LLM спросит детали твоей задачи и инструментов — потому что critic должен знать спецификацию каждого инструмента чтобы ловить ошибки в аргументах. Она адаптирует базовый паттерн под твой контекст.


⚠️

Ограничения

⚠️ Применение системы требует fine-tuning: Сам ToolCritic — это обученная LLaMA 3.1 8B модель. Чтобы использовать именно её, нужно fine-tuning на твоих данных + deployment отдельного сервиса. Это недоступно в обычном чате. Зато принципы метода (таксономия ошибок + внешняя критика) адаптируются через multi-agent подход.

⚠️ Inference cost: Каждая проверка = 2 дополнительных запроса к LLM (critic + исправление assistant). В длинных диалогах это дорого. Для экономии: проверяй выборочно — только шаги где есть вызовы инструментов или подтверждения действий, пропускай простые реплики без API.

⚠️ Специфично для tool-calling: Метод разработан для диалогов с внешними инструментами (API, функции, сервисы). Для обычных вопросов-ответов без инструментов эта система избыточна. Применяй когда assistant активно использует search, code execution, database queries, booking APIs и подобное.

⚠️ Одна проверка, одно исправление: ToolCritic проверяет ответ один раз. Если assistant исправился, но опять ошибся — второго раунда нет. Это ограничение дизайна для баланса cost/quality. В сложных кейсах может понадобиться ручной контроль.


🔍

Как исследовали

Команда взяла датасет Schema-Guided Dialogue (SGD) — большой набор диалогов про бронирование билетов, гостиниц, поиск автобусов. В нём 40 разных инструментов, тысячи диалогов. Сначала вручную проанализировали какие ошибки делают LLM при работе с инструментами и выделили 8 категорий.

Дальше — синтетическая генерация ошибок. Исследователи написали по 5-7 примеров для каждой категории вручную: взяли корректный диалог, внедрили конкретную ошибку (например, "assistant вызвал FindBus до того как узнал дату поездки"), добавили детальное объяснение "почему это ошибка". Потом few-shot промптинг Claude 3.5 Sonnet: показали примеры → попросили сгенерировать ещё 300 диалогов с ошибками каждого типа. Итого 2400 диалогов с ошибками + столько же корректных = 4800 примеров.

Интересная деталь: в промпт для генерации добавляли hint — случайный номер шага диалога и тип ошибки. Это предотвращало bias модели: без hint Claude чаще внедряла ошибки в начало диалога или в популярные инструменты из few-shot примеров. Hint обеспечил разнообразие.

Обучили LLaMA 3.1 8B full fine-tuning на этих данных (5 epochs, learning rate 1e-5). Модель училась только на ответах — градиенты шли только от генерации reasoning, не от чтения диалога. Получилась ToolCritic.

Тестировали на трёх LLM: Claude 3 Sonnet, Mistral Large 2, LLaMA 3.1 70B. Сравнивали 4 сетапа:

  1. Baseline (zero-shot) — модель сама генерирует ответы
  2. Self-correction — модель сама себя проверяет (Reflexion метод)
  3. ToolCritic error-only — только тип ошибки без reasoning
  4. ToolCritic full feedback — тип + детальное объяснение

Метрики: Success rate (весь диалог корректен), Precision/Recall для tool-вызовов, Incorrect action rate (сколько неверных action-вызовов).

Ключевое открытие: Self-correction почти не помог, а местами даже ухудшил результаты. Claude 3 Sonnet в baseline: success rate 14.15%, с self-correction: 16.62% (мизерный рост), с ToolCritic full feedback: 27.88% (почти в 2 раза лучше!). LLaMA 3.1 70B в baseline: 5.46%, с self-correction: 3.90% (стало хуже!), с ToolCritic full feedback: 10.15%.

Это подтвердило гипотезу: модели не умеют находить свои ошибки, но отлично исправляют когда точно указать где и что не так.

Human evaluation на 100 диалогах показала: ToolCritic исправил 26.67% ответов полностью и улучшил ещё 26.67% частично. В контрольной проверке ни одной ошибки не попало за пределы 8 категорий — таксономия оказалась исчерпывающей.


🔗

Ресурсы

ToolCritic: Detecting and Correcting Tool-Use Errors in Dialogue Systems

Hassan Hamad (USC), Yingru Xu, Liang Zhao, Wenbo Yan, Narendra Gyanchandani (Amazon)

Schema-Guided Dialogue (SGD) dataset, ToolTalk dataset

Fine-tuned на LLaMA 3.1 8B Instruct


📋 Дайджест исследования

Ключевая суть

Парадокс: LLM отлично исправляют ответы, но катастрофически плохо находят собственные ошибки. Попросишь модель проверить себя при работе с API — результат либо не меняется, либо становится хуже. Она просто не видит где косяк. ToolCritic решает это через внешнюю модель-диагност, которая проверяет каждый ответ на 8 типов ошибок (преждевременный вызов инструмента, неверные параметры, галлюцинации вместо реального запроса). Основная модель получает конкретный фидбек — «ты вызвал FindBus без параметра leaving_date, который пользователь ещё не назвал» — и исправляет прицельно, не вслепую. Результат: +13% точности на сложных кейсах с инструментами.

Принцип работы

Не делай: Просить модель «проверь свой ответ на ошибки» — она не видит что не так, исправление идёт наугад. Делай: Отдельная специализированная модель проверяет ответ и указывает ГДЕ и ПОЧЕМУ ошибка. Основная модель получает детальный фидбек («ты выдумал дату вместо того чтобы спросить пользователя») и исправляет точечно. Это как редактор в паре с писателем — писатель не видит своих косяков, редактор видит каждый.

Почему работает

Модели плохо самодиагностируются, но отлично исправляют когда знают конкретную ошибку. В эксперименте ablation показал: если давать только тип ошибки без объяснения — улучшение минимальное. Если давать полный reasoning («ты вызвал API с leaving_date='2019-03-12', но пользователь не называл дату — ты её выдумал») — точность растёт до 13%. ToolCritic обучена только на одной задаче: находить 8 типов ошибок в работе с инструментами. Узкая специализация + синтетические примеры всех типов ошибок = модель точно определяет где проблема. Основная LLM получает конкретику и исправляет прицельно, а не методом тыка.

Когда применять

Многошаговые задачи с внешними инструментами (API, функции, сервисы) → консультанты с доступом к поиску и базам данных, чат-боты для бронирования, аналитика с выгрузкой данных, особенно когда важна точность каждого вызова инструмента. НЕ подходит: для простых вопросов без инструментов — там эта система избыточна и дорогая.

Мини-рецепт

Важно: Сам ToolCritic — fine-tuned модель (недоступна в обычном чате). Но принципы адаптируются через multi-agent подход:

1. ЧАТ 1 (Assistant): Промпт с ролью, списком инструментов (название, параметры, описание), историей диалога. Задача: выполни запрос пользователя.

2. ЧАТ 2 (Critic): Промпт с 8 типами ошибок: (1) преждевременный вызов до сбора всей инфы, (2) не тот инструмент, (3) ошибка в обязательных параметрах, (4) лишние опциональные параметры, (5) неверная интерпретация результата, (6) подтверждение без реального вызова, (7) не вызвал когда нужно, (8) выдумал данные вместо вызова. Задача: проверь ответ assistant — есть ли ошибка? Какая? Объясни детально.

3. Workflow: Запрос юзера → assistant отвечает → копируешь ответ в critic → если ошибка — фидбек возвращаешь assistant → assistant исправляет → даёшь исправленный ответ юзеру.

4. Экономия: Проверяй выборочно — только шаги с вызовами инструментов или подтверждениями действий, пропускай простые реплики.

Примеры

[ПЛОХО] : Проверь свой последний ответ на ошибки при работе с инструментами — модель не видит что не так, отвечает «всё верно» или исправляет наугад.
[ХОРОШО] : Два чата. ЧАТ 1 (assistant): Ты консультант с доступом к web_search(query, region, time_period), crm_export(client_segment, date_range). USER: "Найди конкурентов в доставке еды в Москве за Q4". Выполни запрос. → assistant вызывает web_search без time_period. ЧАТ 2 (critic): Проверь ответ assistant на 8 типов ошибок. История: [диалог]. Ответ assistant: [вызов без time_period]. Есть ошибка? Какая? → critic находит premature invocation: «Ты забыл указать time_period='Q4', хотя юзер явно назвал квартал». Фидбек возвращаешь в ЧАТ 1 → assistant исправляет с нужным параметром.
Источник: ToolCritic: Detecting and Correcting Tool-Use Errors in Dialogue Systems
ArXiv ID: 2510.17052 | Сгенерировано: 2026-01-12 00:23

Концепты не выделены.

📖 Простыми словами

ToolCritic: внешняя проверка ошибок при работе LLM с инструментами

arXiv: 2510.17052

Суть проблемы в том, что современные нейронки — это патологические оптимисты, которые не умеют признавать свои косяки. Когда LLM обращается к внешнему инструменту или API, она часто лажает: вызывает функцию слишком рано, путает аргументы или вообще галлюцинирует результат, делая вид, что все окей. ToolCritic — это специально обученный «надзиратель», который не дает модели нести чушь. Он работает как отдельный фильтр, который проверяет каждый шаг диалога на 8 конкретных типов ошибок, выявляя моменты, где логика вызова инструментов пошла по швам.

Это как если бы ты нанял на стройку очень умного, но рассеянного прораба, и приставил к нему дотошного технадзора с чек-листом. Прораб может заявить, что стена готова, хотя забыл заложить кирпич, а ToolCritic тут же ткнет его носом в чертеж и скажет: «Ты вызвал бетономешалку, когда еще не вырыл котлован». Без такого внешнего контроля нейронка просто продолжает уверенно врать, потому что self-correction (самопроверка) внутри одной модели почти всегда работает через пень-колоду — она просто не видит своих бревен в глазу.

В основе метода лежит жесткая таксономия ошибок: от преждевременных вызовов до полной подмены реальности, когда модель придумывает ответ вместо реального запроса к базе. ToolCritic обучали на синтетических данных, чтобы он понимал механику провала в динамике. Если основная модель косячит, критик выдает не просто «все плохо», а детальный фидбек, объясняя, какой именно параметр API был перепутан или почему текущий шаг диалога вообще не требовал вызова функции. Это заставляет систему переделывать работу до тех пор, пока результат не совпадет с реальностью.

Хотя метод гоняли на диалоговых системах, принцип универсален для любого сложного софта, где AI управляет внешними сервисами. Это актуально для умных ассистентов, автоматизации бухгалтерии или кодинга, где цена ошибки в API-запросе — это не просто странный текст, а реальный сбой системы. Если задача требует больше одного действия (сходи в календарь, проверь почту, создай встречу), риск того, что модель «поплывет» на втором шаге, стремится к 100%. ToolCritic здесь выступает как страховочный трос, удерживающий AI в рамках логики.

Короче: хватит надеяться, что нейронка сама поймет, где она ошиблась — она слишком самоуверенна для этого. Нужно разделять «исполнителя» и «контролера». ToolCritic доказывает, что внешняя диагностика по четким категориям ошибок работает в разы лучше, чем абстрактные просьбы «подумай еще раз». Либо ты внедряешь жесткий аудит вызовов инструментов, либо твоя система будет выдавать галлюцинации вместо данных в самый ответственный момент.

Работа с исследованием

Адаптируйте исследование под ваши задачи или создайте готовый промпт на основе техник из исследования.

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с