中文翻译暂不可用,显示俄语原文。

Как работает 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. Сравнение с другими подходами

ПодходРазметка данныхТип обученияГибкостьПримеры
ToolformerSelf-supervised (автоматическая генерация)Fine-tuning с маскированным lossСредняя (только предопределённые API)Meta AI
ReActРучные цепочки рассуждений + вызовыPrompt engineering / few-shotВысокая (любые API через текст)Google, Self-Ask
GorillaДатасет API-документацииFine-tuning на инструкцияхВысокая (поддержка тысяч API)UC Berkeley
ToolLLMРучные траектории + DPOFine-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).

Шаги:

  1. Подготовить шаблоны: [калькулятор(выражение)] и [поиск(запрос)].
  2. Для каждого текста сгенерировать кандидаты (использовать GPT-2 с промптом «вставь API-вызов»).
  3. Выполнить API, вычислить perplexity до и после, отфильтровать полезные примеры.
  4. Дообучить GPT-2 на отфильтрованных примерах с маскированным loss.
  5. Протестировать: дать модели запрос «сколько будет 2+2?» и проверить, вызовет ли она калькулятор.

Ожидаемый результат: Модель научится вставлять [калькулятор(2+2)] в ответ, а после выполнения подставлять 4. Для фактологических вопросов — вызывать поиск.


Связь с другими вопросами

ВопросТема
567Что такое Agentic RAG и чем отличается от обычного RAG
569Как работает ReAct (Reasoning + Acting) для агентов
570Сравнение Toolformer и Gorilla
571Как обучать агента с помощью RL (ToolLLM)
572Что такое API-Bank и как он используется для оценки агентов
573Как проектировать систему инструментов для агента

Навигация