[Meta AI] Toolformer: Language Models Can Teach Themselves to Use Tools
Timo Schick, Jane Dwivedi-Yu, Roberto Dessì, Roberta Raileanu, Maria Lomeli, Luke Zettlemoyer, Nicola Cancedda, Thomas Scialom
Статья: https://arxiv.org/abs/2302.04761
Интересная свежая работа про аугментацию моделей тулами. По мне так очень хорошее направление, ибо очевидно, что некоторые вещи гораздо более успешно можно делать специализированными тулами, нежели ждать пока модель сама их выучит.
Как например с вычислениями. Языковые модели демонстрируют такие возможности, но не очень стабильно, и если можно в нужные моменты подключить гарантированно работающий тул, то грех, конечно, так не сделать.
Или со свежими и точными фактами. Можно долго учить модель в надежде, что не будет врать и фантазировать, но всё равно гарантий нет, да и всегда есть отсечка по дате, новые факты, появившиеся после обучения модели, добавить в неё сложно. Поэтому хождение в поиск или во внешнюю knowledge base любого вида потенциально очень полезно.
Короче, берём лучшее из двух миров. Плохо формализуемые вещи обучаем, простые алгоритмические даём в виде готовых средств. Тема уже не новая, та же LaMDA (https://hottg.com/gonzo_ML/1229) внутри себя использовала тулсет с калькулятором, поиском и переводчиком. Или ещё был TALM (Tool Augmented Language Models, https://arxiv.org/abs/2205.12255).
В данной работе специальная модель, Toolformer, обучается дёргать внешние API, решая когда это делать, что именно дёргать, с какими параметрами и как встраивать результат. Причём учится она в self-supervised режиме без большого количества человеческих аннотаций. И потерять других своих полезный свойств от этого модель не должна.
Входы и выходы API представляются текстом и описываются кортежом (ac, ic), где ac это имя апишки, а ic входные данные. Результат вызова апишки r. Для оформления таких вызовов используются словарные токены [”, “]” и “->”, так что строка с вызовом выглядит как “[ac(ic)]”, а строка с результатом как “[ac(ic)->r]”.
Процедура обучения построена следующим образом. В качестве базовой модели используется GPT-J с 6.7B параметров (https://github.com/kingoflolz/mesh-transformer-jax#zero-shot-evaluations). На входе есть некий датасет текстов (подмножество CCNet). Он конвертится в датасет, аугментированный вызовами апишек. Это делается в три шага:
1. Модель сэмплит вызовы потенциальных апишек через примеры, заданные в in-context learning (внутри промпта).
Есть набор заранее заданных через промпты потенциальных апишек: Question Answering (файнтюненный на Natural Questions retrieval-augmented Atlas, https://arxiv.org/abs/2208.03299), Calculator (просто четыре базовые операции), Wikipedia Search (специальный поисковик, выдающий сниппеты по википедии через BM25 retriever), Machine Translation (NLLB 600M, https://arxiv.org/abs/2207.04672), Calendar (просто возвращает текущую дату для контексту). То есть не проблема добавить по своим примерам другие апишки.
Далее для каждой позиции текста на входе вычисляется вероятность генерации токена “[“, задающего начало API вызова. Оставляются все позиции, для которых такая вероятность выше заданного порога (в работе τs = 0.05) и только топовые k=5 из них.
Далее для каждой позиции сэмплятся возможные имена апишек (m = 5).
Кое-где применялись эвристики, чтобы быстрее понимать, нужно ли дёргать какую-то апишку. Например, калькулятор не рассматривается, если в тексте было меньше трёх цифр.
2. Выполняются вызовы апишек.
Тут ничего особенного, специальный внешний код на питоне делает что надо и возвращает результат.
3. Результат вызова фильтруется по критерию помощи в предсказании следующего токена (стандартная задача обучения языковой модели).
>>Click here to continue<<