TL;DR
Grounded Test-Time Adaptation — подход, который готовит LLM-агента к работе в новом окружении (сайт, набор функций) через два метода адаптации. Параметрический — обновляет лёгкий вектор смещения в модели на каждом шаге, чтобы выровнять ответы под специфичный синтаксис окружения. Непараметрический (dynamics grounding) — перед выполнением задач запускает фазу исследования: агент целенаправленно изучает окружение, собирает правила переходов состояний (что происходит после каждого действия) и использует эти правила как контекст при работе.
Агенты плохо работают в новых окружениях из-за двух разрывов. Синтаксический — модель не знает как называются элементы в конкретном окружении: пытается нажать click("Search"), а кнопка на сайте называется "Go". Семантический — модель не понимает причинно-следственные связи: ожидает, что клик по "Go" покажет результаты, а на самом деле откроется календарь для выбора даты. Первый разрыв вызывает немедленные ошибки формата, второй ломает многошаговое планирование.
Параметрический метод решает синтаксическую проблему через онлайн-обучение вектора смещения — модель видит реальные названия элементов в наблюдениях и подстраивает распределение ответов под них за один шаг градиента. Непараметрический метод решает семантическую проблему через структурированное исследование: (1) LLM генерирует список исследовательских персон/целей для окружения, (2) агент выполняет их, записывая все переходы состояний, (3) LLM извлекает правила вида "действие X в состоянии Y приводит к Z", (4) правила фильтруются от тривиальных, (5) чистый список правил добавляется в контекст агента при выполнении реальных задач.
Схема метода
Параметрический метод (требует доступ к модели):
ШАГ 1: Инициализация вектора δ = 0 в начале эпизода
ШАГ 2: На каждом шаге — один градиентный шаг для обновления δ → модель подстраивается под синтаксис
ШАГ 3: Генерация ответа с δ как смещением в скрытом слое → действие учитывает специфику окружения
ШАГ 4: Сброс δ = 0 при новом эпизоде
Непараметрический метод (принцип применим вручную):
ПОДГОТОВКА (один раз для окружения):
ШАГ 1: LLM генерирует 10 персон/целей для исследования окружения
ШАГ 2: Агент выполняет каждую персону, на каждом переходе записывает правило (наблюдение → действие → новое наблюдение)
ШАГ 3: LLM извлекает чистые правила переходов из логов
ШАГ 4: Фильтрация тривиальных и повторяющихся правил
ВЫПОЛНЕНИЕ (для каждой задачи):
ШАГ 5: Добавить список правил в контекст агента → агент использует знания о переходах при планировании
Пример применения
Задача: Ты продуктовый аналитик, тебе дали доступ к новому внутреннему API для работы с аналитикой Ozon. Нужно построить отчёт по продажам категории за месяц, но ты впервые работаешь с этим API и не знаешь его особенностей.
Промпт (фаза исследования):
Мне дали новый API для аналитики Ozon. Вот документация функций:
[вставить документацию]
Составь список из 5 исследовательских вопросов, которые помогут понять:
- Какие неочевидные особенности есть у функций
- Что происходит при граничных случаях (пустые данные, большие периоды)
- Как функции связаны между собой
- Какие есть скрытые ограничения
Для каждого вопроса предложи последовательность вызовов функций, которые помогут найти ответ.
Промпт (выполнение исследования):
Вопрос 1: [вопрос из списка]
Выполни последовательность вызовов. После каждого вызова:
1. Запиши что получил
2. Сформулируй правило: "Если делать X с параметрами Y, то получишь Z"
3. Есть ли неожиданное поведение?
Продолжай пока не ответишь на вопрос.
Промпт (извлечение правил):
Вот логи исследования API:
[вставить записи всех вызовов и результатов]
Извлеки из них список чётких правил работы API:
- Правило должно быть конкретным: "функция X с параметром Y возвращает Z" или "если сначала вызвать A, потом B, то получишь C"
- Убери очевидные вещи (типа "функция get_data возвращает данные")
- Сфокусируйся на неочевидном поведении, связях между функциями, ограничениях
Формат: нумерованный список правил.
Промпт (выполнение задачи):
Задача: Построй отчёт по продажам категории "Электроника" за октябрь 2024.
Вот правила работы API, которые я выяснил:
[вставить список правил из предыдущего шага]
Используя эти правила, составь план вызовов функций и выполни задачу.
Результат:
Модель пройдёт четыре фазы. Исследование: сгенерирует 5-7 вопросов про граничные случаи, порядок вызовов, форматы данных. Выполнение: для каждого вопроса выполнит серию тестовых вызовов, записывая наблюдения. Извлечение: соберёт 10-15 конкретных правил типа "функция get_sales требует сначала вызвать init_session", "параметр period не работает для диапазонов больше 90 дней". Применение: используя эти правила, построит корректный план вызовов для реальной задачи, избегая найденных ловушек.
Почему это работает
Синтаксическая проблема: Модель обучалась на огромном корпусе текстов, где элементы интерфейсов и API называются по-разному. В новом окружении она продолжает генерировать привычные названия из своего опыта ("Search", "Submit"), а реальные элементы называются иначе ("Go", "dest_field"). Параметрический метод смотрит на текущее наблюдение (в нём есть реальные названия) и через градиент сдвигает распределение ответов так, чтобы модель чаще выдавала токены, которые видит в контексте. Но этот метод требует доступ к весам модели — недоступно в ChatGPT/Claude.
Семантическая проблема: Модель не знает что произойдёт после действия в конкретном окружении. Она строит план на основе типичного поведения похожих систем, но каждое окружение уникально: один сайт после клика показывает результаты, другой открывает модалку, третий требует дополнительный шаг. Сильная сторона LLM — способность извлекать паттерны из примеров и использовать их в контексте. Непараметрический метод даёт модели конкретные примеры переходов из этого окружения: "когда делаешь X, происходит Y". С этими знаниями в контексте модель строит реалистичный план.
Ключевой инсайт: Не пытаться работать вслепую, а сначала изучить, потом действовать. Структурированное исследование (через персоны/цели) находит неочевидные связи, которые пропустит случайное тыкание. Извлечение правил формализует знания. Фильтрация убирает шум. В итоге модель получает концентрированное знание о причинно-следственных связях конкретного окружения — это её world model на естественном языке.
Рычаги управления (для непараметрического метода):
- Число персон (10 в исследовании) → уменьши до 3-5 для простых окружений, увеличь до 15-20 для сложных
- Глубина исследования (сколько шагов на персону) → 5-10 шагов для быстрой разведки, 20-30 для глубокого изучения
- Критерий фильтрации → строгий ("только неочевидное") для лаконичного списка, мягкий ("всё полезное") для полноты
- Формат правил → краткий ("X → Y") для экономии токенов, развёрнутый ("когда делаешь X в ситуации Z, происходит Y потому что...") для сложных зависимостей
Шаблон промпта
Фаза 1: Генерация исследовательских целей
У меня есть новое окружение: {описание окружения — API, сайт, инструмент, документация}
Составь список из {N} исследовательских вопросов, чтобы понять:
- Неочевидные особенности и поведение
- Граничные случаи и ограничения
- Связи между элементами
- Что происходит при нестандартных действиях
Для каждого вопроса предложи конкретные действия для проверки.
Фаза 2: Исследование
Исследовательский вопрос: {вопрос}
Предложенные действия: {действия}
Выполни их поочерёдно. После каждого действия:
1. Зафиксируй что получил
2. Сформулируй правило: "Действие X → Результат Y"
3. Отметь неожиданное поведение
Продолжай пока не ответишь на вопрос полностью.
Уже известные правила (не повторяй исследование):
{список уже найденных правил}
Фаза 3: Извлечение правил
Вот логи исследования окружения:
{вставить все записи: действие → результат → наблюдение}
Извлеки список чётких правил работы этого окружения:
- Формат: "Если делаешь X, то получаешь Y"
- Только конкретные, проверенные правила
- Убери тривиальные ("кнопка нажимается")
- Сфокусируйся на неочевидном, связях, ограничениях
Нумерованный список.
Фаза 4: Фильтрация
Вот список правил работы окружения:
{список правил из предыдущего шага}
Отфильтруй этот список:
1. Удали тривиальные правила (очевидные, типичные для всех похожих систем)
2. Удали дубли и почти одинаковые правила
3. Объедини связанные правила
4. Оставь только то, что реально помогает избежать ошибок и понять специфику ЭТОГО окружения
Итоговый чистый список.
Фаза 5: Выполнение задачи
Задача: {твоя задача}
Знания об окружении (правила, которые я выяснил):
{вставить чистый список правил}
Используя эти правила, выполни задачу. Планируй действия с учётом того, как работает это конкретное окружение.
Пояснение к плейсхолдерам:
{описание окружения}— что это: API (вставь документацию), сайт (опиши назначение), инструмент (какие функции){N}— число вопросов: 3-5 для простого окружения, 10-15 для сложного{вопрос},{действия}— копируй из вывода Фазы 1{список уже найденных правил}— накапливай правила после каждого исследовательского вопроса, чтобы не дублировать{твоя задача}— конкретная задача в этом окружении
🚀 Быстрый старт — вставь в чат:
Помоги адаптировать шаблон исследования окружения под мою задачу.
Моё окружение: [опиши — новый API, незнакомый сайт, инструмент]
Моя задача: [что нужно сделать]
[вставить Фазу 1 из шаблона выше]
Проведи меня через все фазы: сначала сгенерируй вопросы, потом помоги исследовать, потом извлечём правила, потом выполним задачу.
LLM задаст уточняющие вопросы про окружение — есть ли документация, можно ли безопасно экспериментировать, какие есть ограничения. Это нужно чтобы правильно настроить глубину и стиль исследования. Она возьмёт структуру фаз из шаблона и адаптирует под твою ситуацию.
Оригинал из исследования
Промпт для генерации персон (WebArena):
You are a helpful assistant that generates diverse user personas for exploring a website.
Website description: {website_description}
Generate {N} diverse user personas. Each persona should:
- Have a clear goal or intent that would lead to interesting exploration
- Cover different aspects of the website's functionality
- Include both simple and complex tasks
- Encourage discovery of non-obvious interactions
Example persona format:
"As a [user type], I want to [goal] so that [reason]."
Generate the personas:
Промпт для исследования:
You are an exploration agent. Your goal is to discover how this environment works by taking novel actions.
Current observation: {observation}
Rules discovered so far:
{list_of_rules}
Instruction: Take an action that will help you discover new state transitions. Prefer actions you haven't tried before or in different contexts.
Your action:
Промпт для извлечения правила (после каждого перехода):
Previous observation: {obs_before}
Action taken: {action}
New observation: {obs_after}
Summarize this state transition as a concise rule in the format:
"[Action] in [state/context] causes [outcome]"
Rule:
Промпт для фильтрации:
Here is a list of environment dynamics discovered during exploration:
{list_of_all_rules}
Your task:
1. Remove trivial rules (e.g., "typing in a text field shows text")
2. Remove repetitive or near-duplicate rules
3. Consolidate related rules
4. Keep only rules that provide non-obvious, actionable insights
Filtered list:
Адаптации
Авторы исследования автоматизировали весь процесс через код и API. Для работы в чате можно адаптировать так:
Для полностью виртуальных окружений (модель может симулировать):
Ты — симуляция API системы аналитики интернет-магазина.
Функции: get_sales(category, period), get_inventory(category), create_report(data)
Правила симуляции (не раскрывай их сразу):
- get_sales работает только для периодов до 90 дней
- get_inventory нужно вызывать после get_sales, иначе ошибка
- create_report принимает только определённый формат данных
---
Теперь я буду исследовать этот API. Отвечай реалистично, как настоящая система.
[дальше запускаешь фазы исследования из шаблона]
Для реальных окружений (сайт, реальный API): - Вместо автоматического выполнения действий — попроси модель предложить действия - Выполни их сам вручную или через инструменты - Вернись в чат с результатами - Модель извлечёт правило - Продолжи исследование
Упрощённая версия (без отдельных фаз):
Я работаю с новым {окружение}. Не знаю всех особенностей.
Действуй как мой исследовательский ассистент:
1. Предложи 3 проверки для выявления неочевидного поведения
2. Я выполню их и дам результаты
3. Ты извлечёшь правила
4. Используем эти правила для выполнения задачи: {задача}
Начнём с проверок:
Ограничения
⚠️ Параметрический метод недоступен: Требует доступ к внутренним представлениям модели и возможность обновлять веса. Не работает в ChatGPT/Claude через веб-интерфейс.
⚠️ Ручная работа в непараметрическом: В исследовании процесс автоматизирован — агент сам исследует, сам извлекает правила, сам фильтрует. В чате нужно проходить фазы вручную, копировать результаты между промптами, следить за логикой.
⚠️ Стоимость исследования: Каждая фаза исследования — отдельные токены. Для сложного окружения (10 персон × 20 шагов × извлечение правил) может набежать 50-100k токенов. Имеет смысл только если окружение будешь использовать многократно.
⚠️ Нужна возможность экспериментировать: Метод требует безопасно пробовать разные действия. Если окружение критичное (реальные платежи, удаление данных) — исследование опасно. Нужна тестовая среда или симуляция.
⚠️ Сложность адаптации: Оригинальный метод заточен под веб-навигацию и function calling с чёткими переходами состояний. Адаптация под другие домены требует переосмысления что такое "правило" и "переход" в твоём контексте.
⚠️ Качество извлечённых правил: Зависит от того, насколько хорошо модель формулирует правила. Могут быть слишком общие ("кнопка работает") или слишком специфичные ("в ситуации X с Y получается Z, но только если до этого было W"). Нужна итерация и улучшение формулировок.
Как исследовали
Тестировали на трёх бенчмарках: WebArena (812 задач на 6 самохостящихся сайтах: интернет-магазин, админка, GitLab, карты, Reddit, мультисайтовые задачи), BFCLv3 (function calling на 8 доменах реальных API), Tau-Bench (реалистичные диалоги с функциями: авиакомпания, ритейл).
Параметрический метод: вектор адаптации δ размерности d (скрытая размерность модели), добавляется как смещение к финальному скрытому слою перед проекцией. Обновляется через один шаг градиента на языковой моделировании текущего контекста. Learning rate = 0.1, сбрасывается в начале каждого эпизода. Тестировали на Qwen2.5-14B-Instruct.
Непараметрический метод: генерация 10 персон через GPT4o для каждого окружения, исследование каждой персоны агентом GPT4.1 (макс 30 шагов), извлечение правила после каждого перехода, фильтрация через o3. Правила добавляются в контекст при выполнении реальных задач.
Результаты:
WebArena: GPT4.1 базовый 30% → +NPA 35% (+5%), GPT4o-mini 12% → +NPA 18% (+6%), Qwen2.5 17% → +PA 18% (+1%) → +NPA 20% (+3%). Гибрид PA+NPA: 21% (+4%).
Multi-site split (самый сложный): GPT4.1 базовый 2% → +NPA 23% (+21%!) — огромный рост на сложных задачах с непредсказуемыми переходами.
BFCLv3: Qwen2.5 18.5% → +PA 20% (+1.5%) → +NPA 22% (+3.5%).
Tau-Bench (только PA, т.к. нет фиксированных переходов состояний): Airline 21.6% → 25.2% (+3.6%), Retail 43.3% → 44.9% (+1.6%).
Сравнение с World-Model-Augmented (WMA) baseline: GPT4o-mini 12% → +WMA 13.5% (+1.5%) → +NPA 18% (+6%). Непараметрический метод сильно превосходит обученную мировую модель, при этом не требуя обучения отдельной модели.
Абляция: на multi-site split протестировали разное число эпизодов исследования (0, 2, 5, 10). Рост с увеличением исследования: 0 эпизодов (базовый) → 2 эпизода (+7%) → 5 эпизодов (+12%) → 10 эпизодов (+21%). Фильтрация правил даёт +2-3% сверху.
Ресурсы
Grounded Test-Time Adaptation for LLM Agents (Preprint, under review)
Arthur Chen (University of Waterloo), Zuxin Liu, Jianguo Zhang, Akshara Prabhakar, Zhiwei Liu, Shelby Heinecke, Silvio Savarese, Victor Zhong, Caiming Xiong (Salesforce AI Research)
Связанные техники: test-time adaptation (TTA) из computer vision, steering vectors, environment modeling, in-context learning
