Как работает Toolformer-like обучение для агентов (self-supervised tool use)?
Краткий тезис
Toolformer — это подход от Meta, который обучает языковую модель самостоятельно решать, когда и какой API вызвать, используя самоконтроль (self-supervision) без ручной разметки. Процесс состоит из трёх шагов: генерация кандидатов на вызов API (маскировка мест в тексте), выполнение API и вставка результата, затем обучение модели предсказывать API-вызовы с loss только на токенах API. В итоге модель становится агентом, способным использовать внешние инструменты для улучшения ответов.
1. Термин: Toolformer и self-supervised tool use
Toolformer — архитектура, предложенная Meta AI в 2023 году, которая позволяет LLM (например, GPT-3) научиться использовать инструменты (калькулятор, поисковик, переводчик, календарь) через обучение на текстовых корпусах. Ключевая идея — self-supervised learning: модель сама генерирует примеры вызова API, проверяет, улучшают ли они ответ, и учится на успешных случаях.
Self-supervised tool use означает, что модель не получает готовые размеченные пары «запрос → вызов API», а учится на собственном опыте: пробует вызвать API, смотрит на результат и корректирует поведение.
2. Идея: обучение модели вызывать API без размеченных данных
Традиционные подходы к обучению агентов (например, ReAct, ToolLLM) требуют ручной разметки цепочек вызовов API или используют reinforcement learning с дорогим окружением. Toolformer предлагает более лёгкий путь:
- Берётся большой текстовый корпус (например, C4).
- Для каждого текста модель пытается найти места, где вызов API мог бы улучшить предсказание следующего токена.
- Если после вставки результата API perplexity (перплексия) снижается, пример считается удачным и добавляется в обучающий набор.
- Финальная модель дообучается на этих примерах с маскированным loss — штрафуется только за неправильное предсказание токенов API-вызова, а не всего текста.
3. Шаг 1: Генерация кандидатов на вызов API (маскировка)
На первом этапе для каждого текста из корпуса модель генерирует возможные места для вызова API. Это делается с помощью шаблонов:
- Для каждого API (калькулятор, поиск, перевод) задаётся текстовый шаблон, например:
"Результат вычисления [калькулятор(выражение)] равен ...". - Модель (например, GPT-3) получает промпт: «Продолжи текст, используя API, если это уместно». Она генерирует несколько вариантов (beam search) с маскированными токенами API.
- Пример: для текста «Площадь круга радиусом 5 равна 78.5» модель может сгенерировать:
"Площадь круга радиусом 5 равна [калькулятор(π * 5^2)] = 78.5".
Маскировка означает, что токены API (например, [калькулятор(π * 5^2)]) помечаются специальным образом, чтобы на этапе обучения loss считался только по ним.
4. Шаг 2: Выполнение API и вставка результатов
Для каждого сгенерированного кандидата:
- Извлекается вызов API (например,
калькулятор(π * 5^2)). - Выполняется реальный API (калькулятор возвращает
78.5398...). - Результат вставляется в текст на место вызова:
"Площадь круга радиусом 5 равна [калькулятор(π * 5^2)] → 78.54".
Затем сравнивается perplexity исходного текста (без API) и текста с API:
- Если perplexity снижается (модель лучше предсказывает следующие токены), пример считается полезным.
- Если perplexity не меняется или растёт, пример отбрасывается.
Это фильтр качества — модель учится только на тех вызовах, которые действительно помогают.
5. Шаг 3: Обучение с loss только на API-токенах
Финальный датасет состоит из текстов, где некоторые участки заменены на API-вызовы (например, [калькулятор(π * 5^2)]). Модель дообучается на этих текстах с маскированным loss:
- Для обычных токенов loss не считается (они уже предсказаны хорошо).
- Loss считается только для токенов, относящихся к API-вызову (от
[до]).
Таким образом, модель учится генерировать правильные API-вызовы в нужных контекстах, не переобучаясь на остальной текст.
Формула loss (упрощённо):
L = - Σ log P(api_token_i | context) для всех api_token_i в вызове
Где context — предыдущие токены (включая обычный текст).
6. Пример кода (псевдокод на Python)
# Упрощённая реализация этапа обучения Toolformer
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("gpt2")
tokenizer = AutoTokenizer.from_pretrained("gpt2")
# Пример текста с API-вызовом
text = "Площадь круга радиусом 5 равна [калькулятор(π * 5^2)] = 78.54"
inputs = tokenizer(text, return_tensors="pt")
# Маска: 1 для токенов API, 0 для остальных
api_mask = torch.zeros_like(inputs["input_ids"])
# Допустим, токены [калькулятор(π * 5^2)] имеют индексы 5..12
api_mask[:, 5:13] = 1
# Forward pass
outputs = model(**inputs, labels=inputs["input_ids"])
logits = outputs.logits
# Loss только по API-токенам
loss_fct = torch.nn.CrossEntropyLoss(reduction='none')
loss_per_token = loss_fct(logits.view(-1, logits.size(-1)), inputs["input_ids"].view(-1))
masked_loss = (loss_per_token * api_mask.view(-1)).sum() / api_mask.sum()
masked_loss.backward()
optimizer.step()
На практике используется более сложная процедура с несколькими API и фильтрацией по perplexity.
7. Сравнение с другими подходами
| Подход | Разметка данных | Тип обучения | Гибкость | Примеры |
|---|---|---|---|---|
| Toolformer | Self-supervised (автоматическая генерация) | Fine-tuning с маскированным loss | Средняя (только предопределённые API) | Meta AI |
| ReAct | Ручные цепочки рассуждений + вызовы | Prompt engineering / few-shot | Высокая (любые API через текст) | Google, Self-Ask |
| Gorilla | Датасет API-документации | Fine-tuning на инструкциях | Высокая (поддержка тысяч API) | UC Berkeley |
| ToolLLM | Ручные траектории + DPO | Fine-tuning + RL | Высокая (многошаговые вызовы) | Tsinghua |
Toolformer выигрывает в автоматизации разметки, но проигрывает в поддержке сложных многошаговых сценариев (ReAct, ToolLLM).
8. Преимущества и ограничения
Преимущества
- Не требует ручной разметки — масштабируется на большие корпуса.
- Модель сама решает, когда вызывать API (не нужно жёстко прописывать триггеры).
- Легко добавить новый API — достаточно задать шаблон и выполнить фильтрацию.
Ограничения
- Работает только для одношаговых вызовов (нет цепочек).
- API должны быть детерминированными (калькулятор, поиск) — для стохастических (чат-бот) сложнее.
- Фильтр по perplexity может отбрасывать полезные, но редкие вызовы.
- Модель может научиться вызывать API там, где это не нужно (overuse).
9. Масштабирование и практические советы
- Выбор API: начинайте с простых (калькулятор, поиск по Wikipedia, переводчик). Для каждого API нужен чёткий шаблон и возможность выполнить вызов без побочных эффектов.
- Фильтрация: используйте порог снижения perplexity (например, >0.5). Можно также добавить проверку на корректность результата.
- Обучение: дообучайте модель на смеси обычных текстов и API-примеров (соотношение 9:1), чтобы не забыть генерацию естественного языка.
- Инференс: на этапе генерации модель сама вставляет API-вызовы; после генерации их нужно выполнить и подставить результат (возможно, несколько итераций).
10. Связь с Agentic RAG
Agentic RAG — это RAG-система, где агент (LLM) сам решает, когда обращаться к retrieval, а когда к другим инструментам. Toolformer даёт механизм обучения такому поведению:
- API поиска (retrieval) можно представить как один из инструментов.
- Модель учится вызывать поиск, когда не хватает знаний.
- Результат поиска вставляется в контекст, улучшая ответ.
Таким образом, Toolformer — это один из способов реализовать self-supervised обучение для Agentic RAG, где агент сам решает, когда выполнять retrieval.
Пет-проект для закрепления
Задача: Реализовать мини-Toolformer для двух API: калькулятор и поиск по Wikipedia (через простой API).
Инструменты:
- Python, transformers (GPT-2 small), torch.
- API:
eval()для калькулятора (осторожно, только для демо),wikipediaбиблиотека для поиска. - Датасет: небольшой корпус текстов с математическими выражениями и фактами (например, 1000 предложений из Wikipedia).
Шаги:
- Подготовить шаблоны:
[калькулятор(выражение)]и[поиск(запрос)]. - Для каждого текста сгенерировать кандидаты (использовать GPT-2 с промптом «вставь API-вызов»).
- Выполнить API, вычислить perplexity до и после, отфильтровать полезные примеры.
- Дообучить GPT-2 на отфильтрованных примерах с маскированным loss.
- Протестировать: дать модели запрос «сколько будет 2+2?» и проверить, вызовет ли она калькулятор.
Ожидаемый результат: Модель научится вставлять [калькулятор(2+2)] в ответ, а после выполнения подставлять 4. Для фактологических вопросов — вызывать поиск.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 567 | Что такое Agentic RAG и чем отличается от обычного RAG |
| 569 | Как работает ReAct (Reasoning + Acting) для агентов |
| 570 | Сравнение Toolformer и Gorilla |
| 571 | Как обучать агента с помощью RL (ToolLLM) |
| 572 | Что такое API-Bank и как он используется для оценки агентов |
| 573 | Как проектировать систему инструментов для агента |
Навигация
- Предыдущий: 567
- Следующий: 569
- Индекс: 00. Индекс разборов