«Нам потрібен AI-агент» — один із найчастіших запитів, які ми чуємо. Часто бізнесу насправді потрібен надійний workflow з одним-двома викликами LLM у правильних місцях. Іноді — справді агент. Помилка коштує дорого в обидва боки: переускладнений агент повільний, дорогий і непередбачуваний; надто слабкий workflow ламається на кожному випадку, якого не передбачили. У гайді — будівельні блоки, патерни з них і як обирати.

Workflow проти агентів

Відома стаття Anthropic Building effective agents проводить корисну межу:

  • Workflow — системи, де LLM та інструменти оркеструються через заздалегідь визначені шляхи в коді. Кроки визначаєте ви; модель заповнює «розумні» частини.
  • Агенти — системи, де LLM динамічно керує власним процесом і використанням інструментів, вирішуючи, що робити далі, залежно від результатів.

Головна порада статті — починати з найпростішого рішення й додавати складність лише тоді, коли вона доведено покращує результат. Це збігається з нашим досвідом: більшість продакшен-систем, які ми будуємо, — це workflow з агентом усередині одного чітко обмеженого кроку.

Будівельний блок: доповнена LLM

Кожен патерн починається з одного виклику LLM, доповненого:

Багато задач розв'язуються одним добре побудованим доповненим викликом. Спробуйте спершу це і виміряйте результат за допомогою evals, перш ніж будувати щось більше.

Патерни workflow

Ланцюжок промптів (prompt chaining)

Розбийте задачу на послідовні кроки, кожен з яких — виклик LLM, що обробляє попередній результат. Між кроками додайте програмні перевірки («шлюзи»).

Приклад: згенерувати опис товару → перевірити довжину й заборонені твердження в коді → перекласти українською → звірити термінологію з глосарієм.

Коли використовувати: задача чисто розкладається на фіксовані підзадачі. Ви платите затримкою за точність, бо кожен виклик має простішу роботу.

Маршрутизація (routing)

Класифікуйте вхідні дані й відправте їх у спеціалізований промпт, модель або пайплайн.

Приклад: повідомлення підтримки маршрутизуються в потоки білінгу, технічних питань чи облікового запису; прості запитання — на малу дешеву модель, складні — на сильну. Це один із головних важелів економії, описаний у статті оптимізація витрат на LLM.

Коли використовувати: вхідні дані розпадаються на чіткі категорії, які краще обробляти окремо.

Паралелізація

Запустіть кілька викликів LLM одночасно й агрегуйте результати в коді. Два варіанти:

  • Секціонування: незалежні підзадачі паралельно, наприклад перевірка договору на п'ять типів ризиків одночасно.
  • Голосування: та сама задача кілька разів з вибором більшості або найобережнішого результату, наприклад відправка контенту на перевірку, якщо його позначила хоч одна з трьох перевірок.

Коли використовувати: підзадачі незалежні або потрібна вища впевненість.

Orchestrator-workers

Центральна LLM динамічно розбиває задачу на підзадачі, делегує їх викликам-виконавцям і синтезує результати. На відміну від паралелізації, підзадачі заздалегідь невідомі.

Приклад: зміна коду, що зачіпає невідому кількість файлів; дослідницьке запитання, що потребує кількох пошуків.

Evaluator-optimizer

Один виклик генерує, інший оцінює за критеріями й повертає відгук, і цикл повторюється, доки оцінювач не задоволений або не досягнуто ліміту.

Приклад: переклад із нюансами, резюме, що мусить містити певні факти, код, що має пройти тести.

Коли використовувати: є чіткі критерії оцінки, а ітерації вимірно покращують результат.

Автономні агенти

Агент — це цикл: модель обирає дію, середовище повертає результат, модель вирішує, що робити далі. Цей патерн формалізовано в ReAct. Агенти підходять для відкритих задач, де неможливо передбачити кількість кроків чи захардкодити шлях: вирішення звернення підтримки, що може потребувати кількох пошуків, виправлення бага в незнайомій кодовій базі, дослідження питання за багатьма джерелами.

def run_agent(task: str, tools: dict, max_steps: int = 20) -> str:
    messages = [{"role": "user", "content": task}]
    for step in range(max_steps):
        response = llm(messages=messages, tools=list(tools.values()))
        messages.append({"role": "assistant", "content": response.content})
        if response.stop_reason != "tool_use":
            return response.text  # модель вирішила, що закінчила
        results = []
        for call in response.tool_calls:
            try:
                output = tools[call.name].run(**call.input)
            except Exception as e:
                output = f"Error: {e}"  # нехай модель побачить і відновиться
            results.append(tool_result(call.id, output))
        messages.append({"role": "user", "content": results})
    raise StepLimitExceeded(task)

Сам цикл простий. Усе, що змушує агентів працювати в продакшені, — навколо нього: дизайн інструментів, керування контекстом, умови зупинки, дозволи, спостережуваність і контрольні точки з людиною.

Як обрати

Запитання Якщо так Якщо ні
Чи можна заздалегідь записати кроки? Workflow Розгляньте агента
Чи дорога або незворотна помилкова дія? Workflow або агент із погодженням людини Агент може підійти
Чи критична затримка (до 2–3 с)? Один виклик або короткий ланцюжок Агенти прийнятні
Чи великий обсяг і тонка маржа? Workflow з маршрутизацією на малі моделі Вартість агента може бути прийнятною
Чи можна автоматично перевірити успіх? Агент або evaluator-optimizer можуть самі виправлятися Залишайте людину в циклі

Практична евристика: спершу побудуйте workflow. Там, де він регулярно ламається, бо шлях неможливо передбачити, замініть саме цей крок агентом. Вийде гібрид — детермінований код для передбачуваних частин і агент для відкритої частини, — який легше тестувати й дешевше запускати, ніж наскрізного агента.

Продакшен-аспекти агентів

Умови зупинки

Агентам потрібні явні ліміти: максимум кроків, токенів, часу і витрат на задачу. Коли ліміт досягнуто, повертайте корисний частковий результат або ескалюйте людині — не падайте мовчки.

Контрольні точки з людиною

Для дій з реальними наслідками — надсилання листів, повернення коштів, зміна записів — вимагайте підтвердження. Це також найефективніший захист від prompt injection; див. безпека AI-агентів.

Зростання контексту

Кожен крок додає в контекст результати інструментів. Довготривалим агентам потрібні стиснення, підсумовування, зовнішня пам'ять або субагенти зі свіжим контекстом. Це тема контекстної інженерії.

Спостережуваність

Агента неможливо дебажити за фінальною відповіддю. Трасуйте кожен крок: рішення моделі, виклики інструментів з аргументами, результати, токени й затримку. Див. спостережуваність LLM.

Оцінювання

Оцінюйте і результат (чи правильно виконано задачу?), і траєкторію (скільки кроків, скільки помилок інструментів, чи були спроби небезпечних дій?). Агент, що дає правильну відповідь за 40 кроків замість 6, — це проблема вартості й затримки.

Фреймворки: використовувати чи ні?

Фреймворки на кшталт LangGraph, OpenAI Agents SDK, Claude Agent SDK, Spring AI чи LangChain4j пришвидшують прототипування й дають корисну інфраструктуру: виклик інструментів, керування станом, трасування. Водночас вони додають шари абстракції, що можуть приховувати, які саме промпти й виклики надсилаються. Наша порада:

  • Спершу зрозумійте «сирий» API — побудуйте один цикл агента вручну.
  • Беріть фреймворк, коли потрібні його можливості (персистентність, human-in-the-loop, трасування), а не за замовчуванням.
  • Переконайтеся, що бачите точні промпти й виклики інструментів, які надсилає фреймворк.

Для Java-команд природний вибір — Spring AI; для TypeScript більшість потреб покриває Vercel AI SDK. Якщо відкрити ваші бізнес-системи як інструменти через Model Context Protocol, їх можна буде повторно використовувати з різними фреймворками й клієнтами.

Розібраний приклад: обробка рахунків

Вимога: заносити вхідні рахунки постачальників в ERP.

  • Версія 1 (workflow): видобути поля через structured output → перевірити суми й податкові номери в коді → знайти постачальника в ERP за кодом ЄДРПОУ → створити чернетку рахунку. Винятки потрапляють у чергу до людини. Це покриває переважну більшість рахунків.
  • Версія 2 (гібрид): для винятків — невідомий постачальник, невідповідність замовленню, незвична валюта — агент з інструментами лише на читання (пошук постачальників, пошук замовлень, читання умов договору) розслідує і пропонує рішення, яке погоджує людина.

Агент запускається лише на складних випадках, з інструментами на читання і з погодженням людини. Саме таку форму мають більшість успішних бізнес-агентів. Детальніше про видобування — у статті обробка документів з LLM.

FAQ

Чат-бот з RAG — це агент? Зазвичай ні: це доповнена LLM у фіксованому workflow «знайти — відповісти». Агентом він стає, коли модель сама вирішує, коли й скільки разів шукати та які інструменти використовувати.

Чи потрібні нам кілька агентів? Спочатку — рідко. Мультиагентні системи допомагають у широких задачах, що добре паралеляться, і споживають значно більше токенів; див. мультиагентні системи.

Як протестувати агента до продакшену? Зберіть набір сценаріїв з очікуваними кінцевими станами, запускайте їх у пісочниці з моками чи staging-інструментами й оцінюйте і результати, і траєкторії.

Яку модель використовувати агенту? Агенти виграють від найсильнішої моделі, яку ви можете собі дозволити, для планування й вибору інструментів; підзадачі можна маршрутизувати на дешевші моделі.

Джерела

  1. Anthropic (2024). Building effective agents.
  2. Yao et al. (2022). ReAct: Synergizing Reasoning and Acting in Language Models.
  3. Schick et al. (2023). Toolformer: Language Models Can Teach Themselves to Use Tools.
  4. Anthropic. Tool use with Claude.
  5. OpenAI. A practical guide to building agents.