3,583 papers
arXiv:2610.31148 75 22 окт. 2026 г. FREE

Prompt Sensitivity under Tools: формулировка вопроса решает, вызовет ли модель инструмент

КЛЮЧЕВАЯ СУТЬ
Точность модели с инструментом почти целиком зависит от одного: позвала она инструмент или нет. А решает это текст вопроса. Метод позволяет заранее найти формулировки, на которых бот не вызывает инструмент и отвечает наугад. Фишка: если вставить результат инструмента прямо в промпт, модель отвечает верно при любой формулировке. Значит, ломается не чтение данных, а их получение. Поставили данные перед вопросом, и модель начала считать «в уме». Ни одного вызова до конца лимита токенов, ответ неверный.
Адаптировать под запрос
⚡

TL;DR

Если дать модели инструмент (калькулятор, проверку по базе, поиск), результат инструмента всегда один и тот же. Но решение «звать инструмент или нет» модель принимает сама, по тексту вопроса. Эта работа показывает: от перефразировки зависит, будет ли вызов вообще. Точность при этом почти целиком определяется частотой вызова: позвала — права, не позвала — угадала.

Боль выглядит так. В одной формулировке модель вызывает инструмент и отвечает верно. Стоит поставить данные перед вопросом, и она начинает считать «в уме» прямо в тексте, не делает ни одного вызова, пока не кончится лимит токенов, и отвечает неверно. Когда тот же результат инструмента заранее вставили в промпт, модель отвечала правильно при любой формулировке. Значит, ломается не использование результата, а его получение. Поэтому сравнение двух моделей с инструментами при одной формулировке может поменять победителя при другой.

Что делать: не полагаться на то, что модель сама решит позвать инструмент. Варианты, которые авторы проверили: подставить результат в промпт заранее, подключить инструмент через нативный интерфейс модели (вызов как структурированный ход, не строка текста), поменять описание инструмента, потребовать вызов перед ответом. При сравнении моделей или промптов прогонять несколько формулировок, а не одну.

🔬

Схема метода

Это не одна техника, а диагностика и набор рычагов.

ШАГ 1: Одну и ту же задачу записать в 5 формулировках → таблица «вызвал инструмент / нет»
ШАГ 2: Сравнить с вариантом, где результат инструмента вставлен в промпт → если там стабильно, проблема в вызове
ШАГ 3: Вмешаться в вызов: нативный интерфейс / другое описание инструмента / «без вызова не отвечай»
ШАГ 4: Повторить ШАГ 1 → частота вызова должна выровняться

Шаги требуют отдельных запросов: по одному прогону на каждую формулировку.

🚀

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

Сильная зона метода: инструмент сам даёт готовый ответ. Не «калькулятор, результат которого надо ещё собрать в вывод», а «запрос к базе вернул то, что нужно».

Задача: Вы настраиваете ассистента для продавца на Ozon. Клиенты пишут в чат по-разному: - «Сколько у вас осталось красных худи L?» - «Худи красное, размер L. Есть в наличии?» - «Хочу взять 3 штуки. Худи красное L. Хватит?»

Остатки отдаёт инструмент get_stock(sku). Иногда бот отвечает «по памяти» из старого контекста. Нужно проверить, как часто он вызывает инструмент при разных формулировках.

Промпт (тестовый прогон в вашем агенте или в конструкторе, где подключён инструмент):

Прогоню один и тот же вопрос в пяти формулировках. Для каждой записываю: вызвал ли ассистент get_stock до ответа.

Формулировка 1 (стандартная): Сколько осталось красных худи L?
Формулировка 2 (данные до вопроса): Худи, красное, L, артикул HD-RED-L. Есть в наличии?
Формулировка 3 (вопрос до данных): Хватит ли на заказ? Худи красное L, нужно 3 шт.
Формулировка 4 (с контекстом): Я у вас уже брал худи, хочу ещё одно красное L. Остались?
Формулировка 5 (коротко): худи красное L есть?

Результат: Вы получите таблицу из пяти строк «вызвал / не вызвал» и ответ бота в каждой. Если частота вызова скачет между формулировками, значит, точность бота зависит от того, как клиент напишет. Тогда включайте рычаги: описание инструмента, правило «без вызова не отвечай», подстановка остатков в контекст.

🧠

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

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

Сильная сторона. Если результат инструмента уже лежит в контексте, модель читает его и отвечает верно почти всегда. Даже когда в 20–27% отчётов подставили заведомо неверный вариант, разброс по формулировкам не расширялся. Читать данные из контекста модели не мешает ни формулировка, ни рассуждение перед ответом.

Как метод обходит слабость. Он убирает решение «звать или нет» или делает его одинаковым при любой формулировке. Рычаги управления: - Подстановка результата в промпт. Самый стабильный вариант, если данные можно получить заранее. Вызова нет, поэтому нет и нестабильности. - Нативный интерфейс инструментов. В молекульном тесте при нём все три проверенные модели вызывали инструмент в 100% случаев. - Описание инструмента. Одна из двух проверенных альтернативных формулировок описания дала почти постоянную частоту вызова. Другая нет. Описание нужно тестировать, а не выбирать наугад. - Принудительный вызов («без вызова не отвечай, один раз вернём»). Для Qwen3-8B разброс вызовов упал с 0.43 до 0.01. Для Phi-4 и Llama-3.1-8B помогло слабее. - Бюджет токенов. Увеличение лимита в четыре раза разброс не убрало.

📋

Шаблон промпта

Метод авторов — протокол сравнения, поэтому шаблон здесь диагностический: он генерирует набор формулировок для проверки.

У меня задача для агента с инструментом {название_инструмента}.
Он делает: {что_делает_инструмент}.

Типовой вопрос пользователя: {типовой_вопрос}

Напиши 5 формулировок этого вопроса, которые отличаются только записью:
1. Стандартная.
2. Данные идут ПЕРЕД вопросом.
3. Вопрос идёт ПЕРЕД данными.
4. С вводной фразой или лишним контекстом.
5. Очень коротко, как в мессенджере.

Не добавляй подсказок про инструмент. Смысл вопроса и ответ должны остаться теми же.
Выдай нумерованный список.

Что подставлять: - {название_инструмента} и {что_делает_инструмент}: как называется и что возвращает ваш инструмент. - {типовой_вопрос}: реальный вопрос из вашей практики.

Каждую формулировку прогоните в своём агенте и запишите: звал ли он инструмент, верен ли ответ. Чем разнообразнее записи, тем честнее картина.

⚠️

Ограничения

⚠️ Нет коммерческих моделей: Проверяли только открытые модели от 4B до 72B. Как ведут себя Claude, GPT и Gemini в тех же условиях, из статьи не следует.

⚠️ Особые задачи: В молекулах и графах инструмент сразу выдаёт правильный ответ. Там вызов решает всё. В таблицах и математике инструменты (калькулятор, решатель) не помогли, а у большинства моделей даже ухудшили точность: сам цикл вызовов стоил больше, чем давали инструменты.

⚠️ Плохой инструмент вредит: Когда инструмент ошибался (в музыке он был прав в 63% вопросов о тональности), точность падала на 4–10 пунктов. Частый вызов плохого инструмента хуже, чем отсутствие вызова.

⚠️ Стабильность ≠ правильность: Когда 50% отчётов подменили неверными, разброс по формулировкам сузился, но точность упала. Стабильно ошибающаяся модель ничем не лучше нестабильной.

⚠️ Статья про оценку, не про промпты: Тексты описаний инструментов, которые вызывают нужное поведение, вынесены в приложение к статье. Здесь я их не видел, поэтому конкретную формулировку описания придётся подбирать самому.

🔍

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

Авторы взяли шесть открытых моделей и пять областей: молекулы, графы, ноты, таблицы (FinQA) и математику (MATH-500). Каждый вопрос задавали в пяти формулировках, а данные записывали в нескольких формах (например, молекулу как SMILES, InChI или название). Главная мера — разброс: насколько меняется разница точности двух моделей при смене формулировки.

Затем они постепенно разбирали, что именно вносит нестабильность. Сравнивали чтение ответа по первому токену и по строке «ANSWER:», добавление рассуждения, цикл с инструментами, тот же цикл, но с инструментами, отвечающими «нет информации», и вариант, где результат инструмента просто вставлен в промпт.

Результаты: - В молекулах медианный разброс пары моделей был 0.17 с циклом и 0.02 со вставленным результатом. - У 37 из 60 молекульных пар разброс вырос по сравнению с рассуждением без инструментов. - При десяти формулировках вместо пяти разброс с инструментами вырос в 2,88 раза. Без инструментов только в 1,12. - Порядок моделей разворачивался у 4 из 15 пар в музыке и молекулах. Без инструментов не разворачивался ни у одной пары. - Нативный интерфейс свёл разброс вызовов к нулю у трёх проверенных моделей: все вызывали инструмент всегда. - Принудительный вызов помог Qwen3-8B, но не всем.

Удивило, что детерминированный инструмент не гарантирует стабильного сравнения: нестабильность создаёт не он, а решение его позвать. Побочный вывод: при выборе лучшего ответа из нескольких вариантов (A–D) надёжнее читать букву после строки «ANSWER:», а не по первому токену. На графах так разброс 36 из 45 пар сузился, медиана упала с 0.25 до 0.05.

💡

Адаптации и экстраполяции

Это мои переносы идей статьи. Авторы их в таком виде не проверяли.

💡 Адаптация для инструкции агенту: Принудительный вызов в петле перенесён в системный промпт. В статье он реализован в обвязке: цикл один раз отказывается принять ответ без вызова. Текстом это можно приблизить правилом. Эффект на вашей модели нужно проверить, как в шаблоне выше.

Перед ответом о {предметная_область: остатках, ценах, статусах заказов}
ты ВСЕГДА вызываешь инструмент {название_инструмента}.
Если ты не вызвал инструмент, ответь: «Сейчас проверю» и вызови его.
Отвечай только после получения результата. Не используй данные из памяти.

🔧 Техника: данные из инструмента до вопроса → убрать нестабильность. Если результат можно получить заранее (остатки, курс, статус), не заставляйте модель его запрашивать. Сначала соберите данные отдельным шагом (в автоматизации: узел «запрос в базу» → узел «ответ клиенту») и вставьте в промпт. В статье это условие «supplied report»: самый устойчивый вариант.

🔧 Техника: строка ответа вместо первого слова. Если вы оцениваете модели или промпты на вопросах с вариантами A–D, добавьте в конец промпта ANSWER: и читайте букву отсюда. Читать «первое, что напишет» ненадёжно.

💡 Адаптация для сравнения промптов: Тот же принцип применим к выбору промпта или модели для вашего агента. Не выбирайте победителя по одной формулировке. Прогоните 5–10 реальных перефразировок и посмотрите, сохраняется ли порядок.

🔗

Ресурсы

  • Prompt Sensitivity in Tool-Augmented Model Comparisons
  • Авторы: Mateusz Modrzejewski, Tomasz Radzikowski, Institute of Computer Science, Warsaw University of Technology
  • Связанные работы: ReAct (Yao et al., 2022); Sclar et al., 2023 и Mizrahi et al., 2023 о чувствительности к формулировке; Wang et al., 2024 о чтении ответа по первому токену; Fatemi et al., 2023 (графы); FinQA (Chen et al., 2021); MATH-500 (Hendrycks et al., 2021; Lightman et al., 2023).

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

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

Точность модели с инструментом почти целиком зависит от одного: позвала она инструмент или нет. А решает это текст вопроса. Метод позволяет заранее найти формулировки, на которых бот не вызывает инструмент и отвечает наугад. Фишка: если вставить результат инструмента прямо в промпт, модель отвечает верно при любой формулировке. Значит, ломается не чтение данных, а их получение. Поставили данные перед вопросом, и модель начала считать «в уме». Ни одного вызова до конца лимита токенов, ответ неверный.

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

Это не одна техника, а диагностика с рычагами. Работает как процесс: 5 формулировок → таблица «вызвал / не вызвал» → сравнение с вариантом, где результат уже в промпте → вмешательство в вызов → повтор. Если с готовым результатом всё стабильно, а с вызовом скачет, проблема в вызове. Сравнивай модель с самой собой на разных записях одного вопроса, а не на одной записи. Это как проверять водителя не на одной ровной трассе, а на пяти разных дорогах. Каждая формулировка — отдельный прогон.

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

В цикле с инструментами модель сначала читает вопрос и только потом решает, звать ли программу. На это решение влияют мелочи: порядок данных и вопроса, длина, вводная фраза. Решила «посчитаю сама» — пишет длинное рассуждение и упирается в лимит токенов. Результат инструмента, лежащий в контексте, модель читает и использует верно почти всегда, а вот решение «звать или нет» плывёт от перефразировки. Прикол: сравнение двух моделей на одной формулировке может поменять победителя на другой. Что проверили из рычагов: - Подстановка результата в промпт — самый стабильный вариант. Нет вызова, нет и разброса. - Встроенный интерфейс инструментов (вызов как отдельный ход модели, а не строка текста). В молекулярном тесте все три модели вызывали инструмент в 100% случаев. - Принудительный вызов («без вызова не отвечай»). У Qwen3-8B разброс упал с 0.43 до 0.01. У Phi-4 и Llama-3.1-8B помогло слабее. - Описание инструмента. Из двух вариантов один дал почти постоянную частоту вызова, другой нет. Тестируй, не угадывай. - Лимит токенов выше в 4 раза разброс не убрал.

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

Агенты с инструментами → особенно там, где инструмент сразу выдаёт готовый ответ (запрос к базе, остатки, проверка молекул и графов), и клиенты пишут вопросы по-разному. Также подходит, когда выбираешь между двумя моделями или двумя промптами и боишься, что победитель случайный. НЕ подходит для таблиц и математики: там калькулятор и решатель не помогли, а у большинства моделей даже ухудшили точность. Плохой инструмент тоже вредит: при 63% правильных ответов точность упала на 4-10 пунктов. Проверяли только открытые модели от 4B до 72B, про Claude, GPT и Gemini в статье ничего нет.

Мини-рецепт

1. Возьми реальный вопрос: тот, что клиенты задают чаще всего, и запомни, какой инструмент он должен вызвать.
2. Нагенерируй 5 записей: стандартная, данные до вопроса, вопрос до данных, с лишним контекстом, коротко как в мессенджере. Смысл не меняй.
У меня агент с инструментом {название}. Он делает: {что_делает}. Типовой вопрос: {вопрос}. Напиши 5 формулировок: стандартная, данные ПЕРЕД вопросом, вопрос ПЕРЕД данными, с лишним контекстом, очень коротко. Подсказок про инструмент не добавляй. Смысл должен остаться тем же. Выдай нумерованный список.
3. Прогони каждую отдельным запросом: запиши, звал ли агент инструмент и верен ли ответ.
4. Сделай контрольный прогон: вставь результат инструмента прямо в промпт. Если там ответы стабильны, виноват вызов.
5. Включи рычаги: встроенный интерфейс вызова, другое описание инструмента, правило «без вызова не отвечай», подстановка данных заранее. Описание придётся подбирать самому, готовых текстов в статье нет.
6. Повтори шаг 3: частота вызова должна выровняться по всем пяти строкам.

Примеры

[ПЛОХО] : Сколько осталось красных худи L? — бот ответил верно один раз, значит, всё работает.
[ХОРОШО] : Прогоню один вопрос в пяти формулировках. Для каждой записываю, вызвал ли ассистент get_stock до ответа. 1: Сколько осталось красных худи L? 2: Худи, красное, L, артикул HD-RED-L. Есть в наличии? 3: Хватит ли на заказ? Худи красное L, нужно 3 шт. 4: Я у вас уже брал худи, хочу ещё одно красное L. Остались? 5: худи красное L есть? Дальше получаешь таблицу из пяти строк. Если в строках 2 и 5 бот ответил «по памяти» без вызова, это и есть дыра. Закрывай её правилом Без вызова get_stock не отвечай про остатки или подставляй остатки в контекст заранее.
Источник: Prompt Sensitivity in Tool-Augmented Model Comparisons
ArXiv ID: 2610.31148 | Сгенерировано: 2026-10-26 15:20

Проблемы LLM

ПроблемаСутьКак обойти
Вызов инструмента зависит от того, как сформулирован вопросМодель с инструментом (поиск, база, калькулятор) сама решает, звать его или нет. Решение идёт по тексту вопроса. Меняешь порядок слов, длину, вводную фразу, и модель то зовёт инструмент, то считает «в уме». Во втором случае она может писать рассуждение, пока не кончится лимит токенов. Инструмент так и не вызван, ответ неверный. Точность зависит от того, как пользователь написал вопросНе надейся, что модель позовёт инструмент сама. Если данные можно получить заранее, вставь результат в запрос. Или добавь правило: «Без вызова инструмента не отвечай». Или подключи инструмент через встроенный интерфейс вызова функций вместо описания в тексте. Всегда проверяй несколько формулировок, а не одну

Методы

МетодСуть
Проверка на пяти формулировках — видно, где ломается вызовЗапиши один и тот же вопрос в 5 видах: обычный, данные перед вопросом, вопрос перед данными, с лишним контекстом, коротко как в мессенджере. Смысл не меняй. Прогони каждый отдельно. Записывай: позвала модель инструмент или нет, верен ли ответ. Затем прогони тот же вопрос с готовым результатом инструмента в тексте. Если так ответы стабильны, а с вызовом скачут, проблема в самом вызове, а не в понимании данных. Почему работает: метод разделяет две причины ошибки: «не получила данные» и «не поняла данные». Когда применять: настраиваешь агента, сравниваешь модели или промпты. Когда не нужно: инструмента нет, или он вызывается всегда
Убрать решение «звать или нет» — вызов перестаёт зависеть от формулировкиЕсть три рычага. 1) Вставь результат инструмента в запрос заранее: вызова нет, значит, нет и нестабильности. 2) Добавь жёсткое правило: «Перед ответом обязательно вызови инструмент». Это резко выравнивает вызовы у одних моделей и слабо помогает другим. 3) Перепиши описание инструмента: разные описания дают очень разную частоту вызова. Почему работает: рычаги убирают выбор или делают его одинаковым для любого текста. Проверяй результат повторной прогонкой пяти формулировок. Лимит токенов повышать не помогает

Тезисы

ТезисКомментарий
Читать данные из контекста модель умеет стабильно. Слабое место — получить данныеЕсли готовый результат лежит в тексте запроса, модель отвечает верно почти при любой формулировке. Ломается другое: решение вызвать инструмент. Применяй: при плохих ответах агента сначала проверь, был ли вызов. Не переписывай инструкции по использованию данных, если вызова не было
📖 Простыми словами

PromptSensitivity inTool-AugmentedModelComparisons

arXiv: 2610.31148

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

Это как дать школьнику на сложном экзамене открытый справочник, а он решит им не пользоваться просто потому, что ты спросил «Сколько будет...?» вместо «Посмотри в таблице». Формально парень очень старается, исписывает три черновика бешеными вычислениями, у него кончается время, и он выдаёт полную дичь. Хотя готовый верный ответ лежал прямо под носом.

Исследование вскрывает феномен Prompt Sensitivity — слепой зависимости от формулировки. Модель триггерят сущие мелочи: порядок фактов, длина вопроса или порядок слов. Стоит слегка изменить фразу, и вместо прямого вызова функции модель уходит в текстовое месиво рассуждений, сжигает весь лимит токенов и выдаёт случайную галлюцинацию.

Тестировали на вызовах готовых баз, но принцип универсален для любых задач. Строишь ли ты сложного агента, прикручиваешь калькулятор или настраиваешь RAG-систему — ты чаще тестируешь не ум модели, а то, насколько удачно легли слова в запросе. Если агент не вызывает базу данных, 90% его рассуждений — мусор, сколько бы параметров у нейросети ни было.

Короче: хватит списывать косяки на «тупость модели» и надеяться на её благоразумие. Точность инструментального AI равна частоте вызова кода, и точка. Если агент начал нести отсебятину вместо клика по кнопке — не меняй модель, переписывай триггерный промпт. Иначе твоя дорогая система останется умным идиотом, который просто забыл открыть шпаргалку.

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

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

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