Workflow или агент
Этот блок про первый выбор в любой функции на языковой модели: кто решает, какой шаг следующий, ваш код или модель. Заодно разберём пять паттернов workflow из руководства Anthropic, которые часто принимают за пять видов агентов.
В поддержку Northwind приходит около 3000 сообщений в день. 60% из них — это «Где мой заказ?», и ходы там всегда одни и те же: найти заказ, узнать статус доставки, написать ответ. А потом покупатель пишет: «Заказ 4417 пришёл разбитым, это был подарок, замена опоздала, а платил я купоном». Заранее перечислить ходы для такого сообщения никто не сможет.
Поезд и такси
Поезд идёт по рельсам, которые проложили ещё до того, как кто-то купил билет. На каждой станции бригада может делать сложную работу, но маршрут задан. Там, где путь разветвляется, стрелка отправляет поезд на один из уже существующих путей.
Таксист получает адрес и сам выбирает улицы, а если дорогу перекрыли, выбирает другие. Он доедет туда, куда рельсы не ведут. Но может и заблудиться, пока счётчик крутится.
В терминах Anthropic workflow — это поезд: модели и инструменты связаны путями в коде, написанными заранее. Агент — это такси: модель сама управляет своим процессом и использованием инструментов. И то и другое Anthropic называет «агентными системами» и оговаривается, что у слова «агент» несколько определений, поэтому спрашивайте, что человек под ним имеет в виду.
Коллега на телефоне из первого блока — это таксист: после каждого ответа он говорит, что делать дальше. В workflow сценарий держите вы, а ему звоните ради одной узкой работы за раз. «Вытащи номер заказа из этого письма». «Напиши ответ по этим фактам».
Один workflow, не торопясь
Ваш код отправляет сообщение покупателя модели и просит вернуть поля в JSON.
Модель возвращает их:
{
"order_id": "4417",
"intent": "where_is_my_order",
"language": "en"
}Ваш код проверяет результат обычными if. В руководстве Anthropic такая проверка называется gate.
Ваш код получает заказ и статус доставки. Модель здесь не участвует.
Ваш код отправляет факты модели, и она пишет ответ.
def where_is_my_order(message, session):
fields = extract_fields(message) # model call
if not fields.get("order_id"): # gate
return ASK_FOR_ORDER_NUMBER
order = orders.get(fields["order_id"], session.customer_id)
if order is None: # gate
return NO_SUCH_ORDER
status = shipping.status(order.tracking_id)
return write_reply(fields, status) # model callЭта функция делает не больше двух вызовов модели. Замените их заглушками, и все if тестируются как обычный код.
Цена каждого варианта
| Workflow | Агент |
|---|---|---|
Кто выбирает следующий шаг | Ваш код | Модель |
Вызовов модели на запрос | Обычно видно из кода | По-разному, в пределах вашего бюджета |
Непредвиденные случаи | Только те пути, что вы написали | Может сменить курс |
Тесты | Пути тестируются как обычный код | Anthropic советует обширные тесты в песочнице |
Ценой автономии агента руководство Anthropic называет более высокую стоимость и возможное накопление ошибок. Простая арифметика показывает, почему важна длина прогона. Допустим, каждый шаг верен в 95% случаев, шаги независимы, а одна ошибка портит весь прогон. Тогда десять шагов пройдут без ошибок примерно в 60% случаев.
Настоящие шаги зависят друг от друга, а агент может заметить ошибку и исправить её, так что кривая даёт лишь общее представление. Gate в workflow работает против той же кривой: плохой результат, который он поймал, останавливается на том шаге, где появился.
Anthropic советует искать самое простое решение и усложнять, только когда можно показать, что это улучшает результат. Иногда это значит, что агентная система вообще не нужна, хватит одного вызова модели с найденным контекстом и примерами. Northwind разбирает сообщения так:
Сообщение | Устройство | Почему |
|---|---|---|
«Вы доставляете в Норвегию?» | Один вызов модели с найденными правилами доставки | Между шагами нечего решать |
«Где мой заказ?» | Workflow | Шаги известны |
Разбитый подарок с купоном | Агент | Каждый ход зависит от того, что нашёл предыдущий запрос |
Эти варианты можно сочетать. Роутер на входе отправляет известные категории в их workflow, а всё остальное агенту. Anthropic называет поддержку покупателей подходящим местом для агентов с открытой задачей, так что агент остаётся, но только там, где он нужен.
Пять паттернов workflow
Пять паттернов руководство Anthropic описывает как workflow, а агентов разбирает в отдельном разделе. Поэтому «пять типов агентов» — это неверная цитата. Те же формы другие авторы называют иначе, самые частые названия на рисунке серым.
Паттерн | Что происходит | В Northwind |
|---|---|---|
Цепочка промптов | Каждый вызов читает предыдущий результат, между ними gate | Извлечь поля, проверить их, написать ответ |
Маршрутизация | Классификатор отправляет вход в специализированную ветку | У возвратов, доставки и вопросов об аккаунте свои промпты |
Параллельный запуск | Независимые подзадачи одновременно (sectioning) или одна задача несколько раз (voting) | Один вызов отвечает, другой ищет злоупотребления |
Оркестратор и исполнители | Центральная модель во время работы делит задачу, раздаёт части и собирает результаты | Проверить те сервисы, которые окажутся связаны с сообщением об ошибке |
Оценщик и оптимизатор | Один вызов пишет, другой даёт замечания, и так по кругу | Переписывать извинение, пока оно не совпадёт с руководством по тону |
Ближе всего к агенту оркестратор с исполнителями, ведь подзадачи решает модель. Но Anthropic всё равно относит его к workflow. К двум последним паттернам вернёмся в следующих блоках.
Вывод
- В workflow путь задаёт ваш код. В агенте его задаёт модель, пока не закончит или не сработает условие остановки.
- Начинайте с самого простого, что работает: один вызов, затем workflow, затем агент, и сочетайте их по типу сообщения.
- Workflow даёт предсказуемость и обычные тесты. Агент даёт гибкость, а платите за неё стоимостью, задержкой и ошибками, которые могут накапливаться.