Что нужно чтобы создать ИИ-агента

Прежде чем писать код, давайте определимся с терминами. ИИ-агент - это не чат-бот и не скрипт с вызовом GPT. Это автономная программа, которая принимает решения, вызывает инструменты и доводит задачу до результата.

Минимальный набор для рабочего агента:

  • LLM с поддержкой tool calling (Claude, GPT-4, Gemini)
  • Набор инструментов (функций), которые агент может вызывать
  • Цикл: задача → размышление → действие → оценка → следующее действие
  • Условие остановки (чтобы агент не крутился вечно)

Всё остальное - память, планирование, мультиагентность - надстройки над этим ядром.

Минимальная архитектура ИИ-агента

Способ 1: no-code платформы

Самый быстрый старт и возможность создать ИИ-агента бесплатно. Платформы вроде Dify, n8n или Zapier AI позволяют собрать агента из блоков в визуальном интерфейсе. По сути это пошаговая инструкция в визуальном виде.

Что вы делаете:

  1. Выбираете LLM - GPT-4o, Claude, DeepSeek или другую модель (обычно через API-ключ)
  2. Описываете промпт
  3. Подключаете инструменты (HTTP-запросы, базы данных, почта)
  4. Настраиваете триггеры (расписание, вебхук, ручной запуск)

Плюсы: быстро, не нужен код, визуальная отладка. n8n бесплатен при self-hosted, Dify тоже имеет open-source версию.

Минусы: ограниченные возможности. Когда нужно нестандартное поведение, кастомная логика ошибок или сложный branching, вы упираетесь в потолок платформы. Для прототипа подходит, для прода - редко.

Способ 2: фреймворки

LangChain, CrewAI, AutoGen - Python-фреймворки, которые берут на себя рутину: цикл агента, парсинг tool calls, управление памятью.

Вот минимальный агент на LangChain:

Text
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_anthropic import ChatAnthropic
from langchain_core.tools import tool

@tool
def search_web(query: str) -> str:
    """Поиск в интернете"""
    # тут вызов поисковой API
    return f"Результаты по запросу: {query}"

@tool
def save_file(filename: str, content: str) -> str:
    """Сохранить файл"""
    with open(filename, 'w') as f:
        f.write(content)
    return f"Файл {filename} сохранён"

llm = ChatAnthropic(model="claude-sonnet-4-20250514")
tools = [search_web, save_file]
agent = create_tool_calling_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, max_iterations=10)

result = executor.invoke({"input": "Найди курс доллара и сохрани в файл"})

Фреймворк обрабатывает цикл за вас: LLM решает какой инструмент вызвать, фреймворк вызывает, передаёт результат обратно, повторяет пока задача не решена.

Плюсы: много готовых интеграций, быстрый старт, документация. Минусы: магия под капотом. Когда что-то ломается, приходится разбираться в абстракциях фреймворка, а не в своём коде.

Способ 3: свой runtime

Написать цикл агента самому. Звучит сложно, на деле - 50 строк Python.

Text
import anthropic

client = anthropic.Anthropic()

tools = [
    {
        "name": "search_web",
        "description": "Поиск в интернете",
        "input_schema": {
            "type": "object",
            "properties": {
                "query": {"type": "string", "description": "Поисковый запрос"}
            },
            "required": ["query"]
        }
    }
]

def run_tool(name, args):
    if name == "search_web":
        return f"Результаты: {args['query']}"
    return "Неизвестный инструмент"

def agent(task, max_steps=10):
    messages = [{"role": "user", "content": task}]

    for step in range(max_steps):
        response = client.messages.create(
            model="claude-sonnet-4-20250514",
            max_tokens=4096,
            tools=tools,
            messages=messages
        )

        # Агент решил что задача выполнена
        if response.stop_reason == "end_turn":
            return response.content[0].text

        # Агент хочет вызвать инструмент
        tool_results = []
        for block in response.content:
            if block.type == "tool_use":
                result = run_tool(block.name, block.input)
                tool_results.append({
                    "type": "tool_result",
                    "tool_use_id": block.id,
                    "content": result
                })

        messages.append({"role": "assistant", "content": response.content})
        messages.append({"role": "user", "content": tool_results})

    return "Превышен лимит шагов"

print(agent("Найди курс доллара к рублю"))

Вот и весь агент. Цикл: отправил задачу → LLM вернул tool call → выполнили → отправили результат → повторили. Никаких абстракций, полный контроль.

Именно этот подход мы используем в продакшне и описали как Jarvis Pattern. Когда вы понимаете каждую строчку, отлаживать и развивать систему в разы проще.

Какой способ выбрать

Критерий No-code Фреймворк Свой runtime
Скорость старта Минуты Часы Дни
Гибкость Низкая Средняя Максимальная
Контроль Минимальный Частичный Полный
Для прода Редко Иногда Да
Нужен код Нет Python Python/JS/любой

Для прототипа и проверки идеи - no-code или фреймворк. Для прода - свой runtime. Почти все серьёзные продакшн-системы приходят к собственному решению, потому что фреймворки не покрывают edge cases конкретной задачи.

Ошибки при создании ИИ-агента: грабли на пути к проду

Бесконечные циклы. Агент может зациклиться: вызвал инструмент, получил ошибку, вызвал снова, опять ошибка. Обязательно ставьте max_steps и считайте бюджет в токенах. Подробнее про это - в статье про метрики агента.

Галлюцинации в tool calls. LLM может придумать аргумент для инструмента. Например, вызвать search_web(query="...") с несуществующим URL. Валидируйте входные параметры каждого инструмента.

Промпт-инженерия. Системный промпт - это 80% качества агента. Не "ты полезный ассистент", а конкретные инструкции: когда использовать какой инструмент, в каком формате отдавать результат, когда останавливаться.

Стоимость. Каждый шаг агента - вызов LLM. 10 шагов с Claude Sonnet - примерно $0.10-0.50 в зависимости от контекста. На 1000 запросов в день это $100-500/мес. Считайте заранее.

Безопасность. Агент с доступом к файлам может удалить что угодно. Агент с доступом к API может потратить бюджет. Применяйте принцип минимальных привилегий: агент получает только те инструменты, которые нужны для конкретной задачи.

Память ИИ-агента

Для простых задач хватит контекста текущего разговора. Для сложных - нужна многослойная память:

  • Рабочая память - что агент делает прямо сейчас
  • Эпизодическая - что он делал раньше (логи прошлых запусков)
  • Долгосрочная - что он знает всегда (инструкции, факты)

Без памяти агент каждый раз начинает с нуля. С памятью - учится на ошибках и накапливает контекст.

Что реально влияет на качество ИИ-агента

Мы построили десятки агентов за последний год и пришли к неочевидным выводам:

80% качества - это промпт, не код. Можно написать идеальный runtime, но если системный промпт плохой, агент будет ошибаться. Хороший промпт содержит: роль агента, доступные инструменты с примерами, формат выхода, ограничения и edge cases.

Описание инструмента важнее кода инструмента. LLM решает когда вызвать инструмент на основе его описания. "Поиск в интернете" - плохо. "Поиск актуальной информации. Используй когда нужны данные после 2024 года, текущие цены, новости или факты которых нет в обучающих данных" - хорошо. На практике качественное описание инструментов даёт заметно больший рост точности, чем усложнение логики вызова.

Temperature 0 не означает детерминизм. Даже при temperature=0 модель может дать разные результаты. Для критических агентов нужны retry + валидация результата, а не надежда на воспроизводимость.

Стоимость ошибки растёт экспоненциально. Ошибка на 3-м шаге стоит $0.10. Ошибка на 15-м шаге (после 14 успешных) стоит $2.00, потому что агент потратил бюджет на правильные шаги, а потом всё отбросил. Ставьте checkpoints: если агент сделал 5 шагов, сохраните промежуточный результат.

Следующие шаги после создания ИИ-агента

Создание ИИ-агента - это не rocket science. Минимальный работающий агент - 50 строк кода. Сложность начинается когда вы идёте в прод: обработка ошибок, fallback-стратегии для ИИ-агентов, мониторинг, безопасность.

Начните с простого: один агент, два-три инструмента, конкретная задача. Попробуйте Claude Code - терминальный ИИ-агент для разработки чтобы увидеть как работает готовый агент. А потом соберите своего.

Полезные материалы: