Метафора: команда на проекте

CrewAI устроен вокруг того, как работает живая команда. Чтобы выполнить проект, нужны четыре вещи: люди с ролями, задачи, которые им поручают, сама команда как единое целое и порядок работы (последовательно или с руководителем). Ровно это и есть четыре сущности фреймворка.

Отличие от AutoGen — в стиле. Там ты задавал агентов и пускал их разговаривать, координацию выражал диалогом. Здесь ты декларативно описываешь роли и задачи, а «как именно агенты взаимодействуют» берёт на себя CrewAI. Это ближе к управлению проектом: ты — менеджер, который раздаёт роли и ставит задачи, а не режиссёр каждой реплики.

ℹ️ Декларативно vs императивно

AutoGen императивен: ты описываешь поток («этот инициирует чат с тем»). CrewAI декларативен: ты описываешь что есть (роли, задачи, порядок), а как это исполнить — забота фреймворка. Декларативность делает систему читаемее («вот команда, вот её задачи»), но чуть меньше отдаёт контроля над деталями потока.

Четыре сущности

Запомни связку: Agent — кто, Task — что, Crew — все вместе, Process — в каком порядке.

100%
колёсико — масштаб  ·  зажать и тянуть — перемещение
Crew · команда объединяет агентов и задачи, запускается kickoff() Agent КТО: роль, цель, backstory, инструменты researcher · writer Task ЧТО: описание + expected_output назначается агенту Process В КАКОМ ПОРЯДКЕ: sequential / hierarchical выполняет Process связывает: задачи идут по очереди или под управлением менеджера результат crew.kickoff() Agent (кто) + Task (что) + Process (порядок) → Crew → kickoff() → результат

Agent — кто работает

Agent — это исполнитель с личностью роли. CrewAI делает акцент на ролевом описании: у агента есть role (должность), goal (его цель) и backstory (предыстория/характер). Это не украшательство — богатое ролевое описание заметно влияет на то, как агент рассуждает (подробнее в следующем уроке про role-based агентов).

Agent: роль, цель, предыстория, инструменты
python
from crewai import Agent

researcher = Agent(
    role="Аналитик рынка",
    goal="Находить точные и свежие данные по теме {topic}",
    backstory="Ты опытный рыночный аналитик, дотошный к фактам и источникам.",
    tools=[search_tool],          # инструменты, доступные агенту (опционально)
    verbose=True,                 # подробный лог рассуждений
    allow_delegation=False,       # может ли передавать работу другим агентам
)
  • role / goal / backstory — ролевая «триада», задающая поведение (это и есть system-промпт, но структурированный).
  • tools — что агент умеет вызывать (поиск, код, API).
  • allow_delegation — может ли агент перепоручать подзадачи коллегам (важно для иерархического процесса).

Task — что нужно сделать

Task — единица работы. Ключевое отличие CrewAI: задача описывается не только что сделать (description), но и каким должен быть результат (expected_output). Это явный контракт выхода — то самое, о чём мы говорили в уроке про разделение ответственности: чёткий выход одной роли становится входом следующей.

Task: описание + ожидаемый результат + исполнитель
python
from crewai import Task

research_task = Task(
    description="Собери ключевые факты и цифры по теме {topic}.",
    expected_output="Маркированный список из 5–7 фактов с источниками.",
    agent=researcher,             # КТО выполняет эту задачу
)

write_task = Task(
    description="Напиши короткий обзор по собранным фактам.",
    expected_output="Связный текст на 2–3 абзаца.",
    agent=writer,
    context=[research_task],      # вход: результат предыдущей задачи
)
expected_output — это половина успеха

Не ленись описывать expected_output конкретно. «Хороший текст» даёт расплывчатый результат; «маркированный список из 5–7 фактов с источниками» — предсказуемый. Чёткий ожидаемый результат и context (откуда брать вход) — то, что превращает набор агентов в работающий конвейер, где выход одной задачи питает следующую.

Crew и Process — команда и порядок

Crew собирает агентов и задачи в единое целое и запускается методом kickoff(). А Process определяет, как задачи выполняются:

  • Process.sequential — задачи идут строго по очереди, результат одной передаётся в следующую. Простой, предсказуемый конвейер (как Pipeline из будущего урока про координацию).
  • Process.hierarchical — появляется агент-менеджер, который раздаёт задачи и координирует исполнителей (это CrewAI-версия Supervisor). Разберём отдельно в уроке про Sequential vs Hierarchical.
Crew: собрать команду и запустить
python
from crewai import Crew, Process

crew = Crew(
    agents=[researcher, writer],          # кто в команде
    tasks=[research_task, write_task],    # что делаем (в порядке)
    process=Process.sequential,           # как: по очереди
    verbose=True,
)

result = crew.kickoff(inputs={"topic": "рынок электромобилей 2025"})
print(result)

Полный пример: команда из двух агентов

Минимальный Crew целиком
python
from crewai import Agent, Task, Crew, Process

# --- 1. Агенты (КТО) ---
researcher = Agent(
    role="Аналитик рынка",
    goal="Находить точные факты по теме {topic}",
    backstory="Дотошный аналитик, помешанный на источниках.",
    verbose=True, allow_delegation=False,
)
writer = Agent(
    role="Редактор",
    goal="Писать ясные обзоры по фактам",
    backstory="Опытный редактор, ценящий простоту изложения.",
    verbose=True, allow_delegation=False,
)

# --- 2. Задачи (ЧТО) ---
research = Task(
    description="Собери ключевые факты по теме {topic}.",
    expected_output="Список из 5–7 фактов с источниками.",
    agent=researcher,
)
write = Task(
    description="Напиши обзор по собранным фактам.",
    expected_output="Текст на 2–3 абзаца.",
    agent=writer, context=[research],   # вход = результат research
)

# --- 3. Команда + порядок (Crew + Process) ---
crew = Crew(
    agents=[researcher, writer],
    tasks=[research, write],
    process=Process.sequential,
)

# --- 4. Запуск ---
result = crew.kickoff(inputs={"topic": "рынок электромобилей 2025"})
print(result)            # финальный обзор от writer

Обрати внимание, насколько это декларативно: нигде нет «отправь сообщение тому-то» — есть только описание ролей, задач и порядка. CrewAI сам прогонит research, передаст результат в write и вернёт финал. Та же команда, что мы собирали в AutoGen через диалог, но выражена как «проект с задачами».

CrewAI против AutoGen

Аспект AutoGen CrewAI
Метафора разговор агентов команда на проекте
Стиль императивный (поток диалога) декларативный (роли + задачи)
Единица работы сообщение в чате Task с expected_output
Координация менеджер чата / реплики Process (sequential / hierarchical)
Сильная сторона гибкие диалоги, code execution читаемые ролевые пайплайны
ℹ️ Не «лучше», а «иначе»

CrewAI и AutoGen решают одну задачу разными метафорами. CrewAI приятен, когда работа естественно ложится на «роли и задачи с чётким результатом» (контент-пайплайны, ресёрч-отчёты). AutoGen — когда нужны свободные диалоги и тесная работа с кодом. А базовые принципы (специализация, завершение, координация) — общие; меняется лишь способ их выразить.

Типичные ошибки

Ошибка 1: расплывчатый expected_output

Без конкретного ожидаемого результата задача даёт непредсказуемый выход, и следующая задача получает мусор на вход. Описывай результат предметно (формат, объём, состав).

Ошибка 2: задача без context, но зависимая

Если задаче нужен результат предыдущей, укажи его в context. Иначе агент будет работать «с нуля» и проигнорирует наработки коллеги.

Ошибка 3: пустые/одинаковые роли

Слабый role/backstory или пересекающиеся роли ухудшают качество и путают распределение задач. Роли должны быть содержательными и разными (привет специализации).

Ошибка 4: порядок задач не соответствует зависимостям

В sequential задачи идут в порядке списка. Если поставить «написать» раньше «исследовать», writer получит пустоту. Следи, чтобы порядок отражал реальные зависимости.

Шпаргалка

CrewAI основы — всё в одном месте
python
from crewai import Agent, Task, Crew, Process

# 4 СУЩНОСТИ:
#   Agent   — КТО:  role + goal + backstory + tools
#   Task    — ЧТО:  description + expected_output + agent + context
#   Crew    — ВСЕ:  agents + tasks, запуск через kickoff()
#   Process — ПОРЯДОК: sequential | hierarchical

agent = Agent(role="...", goal="...", backstory="...", tools=[...],
              allow_delegation=False)

task = Task(description="...", expected_output="...",   # ЧЁТКИЙ выход!
            agent=agent, context=[prev_task])           # вход от предыдущей

crew = Crew(agents=[...], tasks=[...], process=Process.sequential)
result = crew.kickoff(inputs={"topic": "..."})          # {placeholders}

# Правила:
#  • expected_output — предметно (формат/объём/состав)
#  • зависимая задача → укажи context
#  • роли содержательные и РАЗНЫЕ (специализация)
#  • порядок задач = реальные зависимости
#  • стиль декларативный: описываешь ЧТО, а не КАК переписываются агенты

Практическое задание

Собери первый Crew:

Задание: команда «исследователь + писатель»

  1. Установи crewai, настрой ключ модели. Создай двух агентов с разными role/goal/backstory (например, аналитик и редактор).
  2. Опиши две задачи: «собрать факты» и «написать обзор». У каждой задай конкретный expected_output, у второй — context=[первая].
  3. Собери Crew с Process.sequential и запусти через kickoff(inputs={"topic": ...}). Проверь, что обзор опирается на собранные факты.
  4. Сделай expected_output расплывчатым («хороший текст») и сравни результат с конкретной формулировкой. Почувствуй разницу.
  5. Поменяй задачи местами в списке (написать раньше исследовать) и посмотри, что получит writer без входных данных — это иллюстрация важности порядка и context.
  6. Со звёздочкой: добавь третьего агента-критика и третью задачу «проверить обзор» с context=[write] — получишь мини-конвейер с ревью (привет уроку про проверку и критику).

Что дальше

Ты знаешь четыре кита CrewAI и собрал первую команду. Дальше углубимся в то, что делает CrewAI особенным, — role-based агентов: как роль, цель и предыстория формируют поведение и почему «аналитик», «писатель», «критик» работают лучше безликих агентов.