TL;DR
NLT — это замена структурированного формата выбора инструментов (JSON-схемы) на простой список с ответами YES/NO на естественном языке. Вместо того чтобы модель выводила {"tool": "check_availability"}, ей дают список вариантов — она просто помечает каждый: нужен или нет.
Когда модель вынуждена выбирать инструмент через JSON, она одновременно решает две несовместимые задачи: думает о сути запроса и форматирует структурированный вывод. Это как параллельно решать логическую задачу и диктовать текст по правилам синтаксиса — внимание раздваивается, и страдает именно смысловая часть. У языковых моделей JSON-паттерны «живут» в зоне кода, а рассуждение о задаче — в зоне языка. Совмещение двух зон снижает точность.
NLT оставляет модель в одной зоне — языковой. Список YES/NO — это не структура данных, это текст. Модель думает и отвечает в одном режиме, без переключения. Результат: на 15% точнее и в 15 раз меньше критических сбоев.
Схема метода
Все шаги — в одном промпте:
ШАГ 1: Роль + контекст → кто агент, что за диалог, задача
ШАГ 2: Список инструментов → каждый в формате "[Инструмент] – YES/NO"
ШАГ 3: Модель заполняет список → YES для нужных, NO для ненужных
ШАГ 4: Завершающая фраза → "Оценка завершена."
Пример применения
Задача: Ты строишь ассистента для менеджера по продажам в SberCRM. Клиент написал: "Хочу понять, стоит ли продлевать подписку на ваш пакет Pro". Ассистент должен автоматически решить, какую информацию о клиенте поднять перед ответом.
Промпт:
Ты — помощник Алексея, менеджера по работе с клиентами в B2B SaaS-компании.
Тебе дана переписка между Алексеем и клиентом.
Сообщение клиента:
"Хочу понять, стоит ли продлевать подписку на ваш пакет Pro."
Твоя задача — определить, какие данные о клиенте нужны Алексею
для подготовки к ответу. Отметь каждый пункт:
Размышление: (вставь свои мысли)
История платежей и подписки – YES/NO
Активность использования продукта за последние 30 дней – YES/NO
Открытые обращения в поддержку – YES/NO
Информация о тарифных планах и скидках – YES/NO
Данные о продлении у похожих клиентов – YES/NO
Контакты ответственного за аккаунт – YES/NO
Передать разговор старшему менеджеру – YES/NO
Оценка завершена.
Результат: Модель покажет краткое рассуждение в блоке "Размышление", затем выдаст список с YES/NO для каждого пункта. YES получат только релевантные источники — в этом случае, скорее всего, история платежей, активность и тарифы. Вывод чистый, без лишнего текста, без JSON-синтаксиса.
Почему это работает
LLM плохо делает два дела одновременно. JSON — это синтаксис из мира кода: скобки, кавычки, точные имена ключей. Рассуждение о задаче — это совсем другой паттерн. Когда модель должна одновременно рассуждать и форматировать вывод по схеме, внимание делится. Страдает то, ради чего всё затевалось — точный выбор нужного инструмента.
Модель хорошо работает в своей стихии. YES/NO — это язык, не код. Список инструментов на обычном языке — это тоже язык. Когда весь промпт и весь вывод находятся в одной «зоне» — языковой — модель не переключается и не тратит ресурс на соблюдение синтаксиса.
Рычаги управления:
- Количество инструментов в списке → больше вариантов = чуть сложнее задача, но всё равно лучше JSON
- Блок "Размышление" → если убрать, получишь чистый список без объяснений; если оставить — видишь логику выбора
- Завершающая фраза ("Оценка завершена.") → служит стоп-сигналом и снижает дополнительный текст после списка
- Формулировки инструментов → чем точнее и конкретнее название, тем точнее выбор
Шаблон промпта
Ты — помощник {имя_агента}, {роль и контекст агента}.
Тебе дан диалог между {агентом} и {пользователем}.
{Содержание диалога или сообщения пользователя}
Твоя задача — определить, какие из следующих {ресурсов / инструментов /
источников} нужны для работы с этим запросом.
Размышление: (вставь свои мысли)
{Инструмент 1} – YES/NO
{Инструмент 2} – YES/NO
{Инструмент 3} – YES/NO
{Инструмент 4} – YES/NO
{Инструмент 5} – YES/NO
Оценка завершена.
Что подставлять:
- {имя_агента} — имя роли: "Алексей", "Саша", "Служба поддержки"
- {роль и контекст} — чем занимается агент и в каком контексте
- {диалог} — сообщение или переписка, по которой нужно принять решение
- {Инструмент N} — конкретные источники данных, базы знаний, действия или шаги
🚀 Быстрый старт — вставь в чат:
Вот шаблон NLT — метода выбора инструментов через естественный язык.
Адаптируй под мою задачу: {твоя задача}.
Задавай вопросы, чтобы заполнить поля.
[вставить шаблон выше]
LLM спросит: какова роль агента, какой контекст задачи, какие инструменты/шаги нужно включить в список — потому что эти поля определяют всю логику маршрутизации. Она возьмёт паттерн из шаблона и адаптирует под твою задачу.
Ограничения
⚠️ Новейшие топовые модели: Gemini 2.5 Pro показал обратный результат — структурированный вызов точнее на 34%. GPT-5 показал паритет. Эти модели специально обучены на структурированном выводе — преимущество NLT у них минимально или отсутствует.
⚠️ Только выбор инструментов, не выполнение: NLT решает задачу маршрутизации — что нужно использовать. Что делать с выбранными инструментами дальше — отдельная история.
⚠️ Нет параметров: Метод тестировался на выборе без передачи параметров ("открыть историю покупок", а не "открыть историю покупок за период 2024-01-01 – 2024-06-30"). Для сложных вызовов с параметрами — отдельное исследование.
Как исследовали
Идея была простой: взять оригинальное исследование Johnson et al. (2025), которое показало +18.4pp в пользу NLT, и проверить независимо — на новых моделях, другим кодом. Исследователи написали собственный Python-фреймворк с нуля и прогнали 8 560 испытаний на 14 моделях — от маленьких (Mistral 7B, Llama 3.1 8B) до топовых (GPT-5, Claude Sonnet 4, Gemini 2.5 Pro).
Каждой модели давали один и тот же диалог дважды: в одном случае — NLT (список YES/NO), в другом — стандартный структурированный вызов через JSON-схему. Задача — правильно выбрать нужные инструменты. Оценка жёсткая: точное совпадение с эталоном, никакого частичного зачёта.
Самый неожиданный результат — Claude Sonnet 4: frontier-модель, которую ждёшь на уровне 80%+, выдала лишь 18.8% на структурированном формате и 61.9% на NLT. Это +43pp — самый большой разрыв в исследовании. Причина, скорее всего, в том, что конкретный API-путь для function calling у Claude оказался слабо оптимизирован. Mistral 7B вообще полностью сломался на JSON: 320 ошибок из 320 попыток, 0% точности — и при этом 39% с NLT. Вывод прямой: структурированный вывод — хрупкая зависимость. Reasoning-модели (DeepSeek-R1) получили +24pp с NLT — потому что цепочка рассуждений и JSON-форматирование буквально мешают друг другу, а в NLT рассуждение можно вынести в блок "Размышление" без конфликта.
Оригинал из исследования
You are an assistant to Alex, an AI customer service agent who handles bookings
for a music venue called "Yes! Music". You will be given a message between Alex
and a customer. They are texting one another.
Your mission is to identify if any of the following topics have been brought up...
Thinking: (insert_thinking)
Recap of previous conversation – YES/NO
Website information – YES/NO
Recent social media posts – YES/NO
Available discounts – YES/NO
List of upcoming events – YES/NO
Past Purchases – YES/NO
Talk to a Human – YES/NO
Assessment finished.
Контекст: Это точный промпт из исследования для агента "Alex" — менеджера по билетам музыкального зала. Модель получает диалог с клиентом и должна выбрать, какие источники данных открыть. YES/NO — вся структура вывода.
Адаптации и экстраполяции
💡 Адаптация для контент-команд: тот же принцип работает для роутинга задач внутри контент-процесса.
Ты — редактор Маша, главред телеграм-канала об инвестициях.
Тебе прислали идею для поста: "{идея}".
Определи, что нужно для подготовки материала:
Размышление: (вставь свои мысли)
Проверить актуальные данные / цифры – YES/NO
Найти мнение эксперта или цитату – YES/NO
Добавить исторический контекст – YES/NO
Проверить юридические/регуляторные ограничения – YES/NO
Сравнить с предыдущими постами на эту тему – YES/NO
Запросить правку у юриста перед публикацией – YES/NO
Оценка завершена.
🔧 Техника: убрать блок "Размышление" → чище, быстрее
Если тебе нужен только список без объяснений — убери строку Размышление: (вставь свои мысли). Получишь чистый чеклист напрямую. Оставь "Размышление" — и увидишь логику, по которой модель сделала выбор. Полезно при отладке промпта.
🔧 Техника: именованная роль → точнее выполнение
Вместо безликого "Ты — помощник агента" дай конкретное имя и характер:
Ты — Полина, ведущий специалист по удержанию клиентов в Тинькофф.
Полина педантична: она никогда не открывает лишних вкладок.
Конкретный персонаж с характером даёт модели более чёткий ориентир — и список YES/NO становится строже.
Ресурсы
Основная работа: The Remarkable Effectiveness of Providing AI Agents with Natural Language Tools: A Replication Study Validating NLT Performance Across 14 Models — A. Somma, I. Plante, F. Premji, Sage.is AI-UI, July 2025
Оригинальное исследование: Johnson et al. (2025) — первая публикация NLT-фреймворка (+18.4pp, 10 моделей, 6 400 испытаний)
GitHub: github.com/Sage-is/NLT-Replication-Study
Связанные работы: ToolFlow (Chen et al., 2025), CallNavi (Zhang et al., 2025), Martinez (2025) по RL-оптимизации tool use
