Метафора: команда на проекте
CrewAI устроен вокруг того, как работает живая команда. Чтобы выполнить проект, нужны четыре вещи: люди с ролями, задачи, которые им поручают, сама команда как единое целое и порядок работы (последовательно или с руководителем). Ровно это и есть четыре сущности фреймворка.
Отличие от AutoGen — в стиле. Там ты задавал агентов и пускал их разговаривать, координацию выражал диалогом. Здесь ты декларативно описываешь роли и задачи, а «как именно агенты взаимодействуют» берёт на себя CrewAI. Это ближе к управлению проектом: ты — менеджер, который раздаёт роли и ставит задачи, а не режиссёр каждой реплики.
AutoGen императивен: ты описываешь поток («этот инициирует чат с тем»). CrewAI декларативен: ты описываешь что есть (роли, задачи, порядок), а как это исполнить — забота фреймворка. Декларативность делает систему читаемее («вот команда, вот её задачи»), но чуть меньше отдаёт контроля над деталями потока.
Четыре сущности
Запомни связку: Agent — кто, Task — что, Crew — все вместе, Process — в каком порядке.
Agent — кто работает
Agent — это исполнитель с личностью роли. CrewAI делает акцент на ролевом описании: у агента есть role (должность), goal (его цель) и backstory (предыстория/характер). Это не украшательство — богатое ролевое описание заметно влияет на то, как агент рассуждает (подробнее в следующем уроке про role-based агентов).
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). Это явный контракт выхода — то самое, о чём мы говорили в уроке про разделение ответственности: чёткий выход одной роли становится входом следующей.
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 конкретно. «Хороший текст» даёт расплывчатый результат; «маркированный список из 5–7 фактов с источниками» — предсказуемый. Чёткий ожидаемый результат и context (откуда брать вход) — то, что превращает набор агентов в работающий конвейер, где выход одной задачи питает следующую.
Crew и Process — команда и порядок
Crew собирает агентов и задачи в единое целое и запускается методом kickoff(). А Process определяет, как задачи выполняются:
Process.sequential— задачи идут строго по очереди, результат одной передаётся в следующую. Простой, предсказуемый конвейер (как Pipeline из будущего урока про координацию).Process.hierarchical— появляется агент-менеджер, который раздаёт задачи и координирует исполнителей (это CrewAI-версия Supervisor). Разберём отдельно в уроке про Sequential vs Hierarchical.
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)
Полный пример: команда из двух агентов
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 — когда нужны свободные диалоги и тесная работа с кодом. А базовые принципы (специализация, завершение, координация) — общие; меняется лишь способ их выразить.
Типичные ошибки
Без конкретного ожидаемого результата задача даёт непредсказуемый выход, и следующая задача получает мусор на вход. Описывай результат предметно (формат, объём, состав).
Если задаче нужен результат предыдущей, укажи его в context. Иначе агент будет работать «с нуля» и проигнорирует наработки коллеги.
Слабый role/backstory или пересекающиеся роли ухудшают качество и путают распределение задач. Роли должны быть содержательными и разными (привет специализации).
В sequential задачи идут в порядке списка. Если поставить «написать» раньше «исследовать», writer получит пустоту. Следи, чтобы порядок отражал реальные зависимости.
Шпаргалка
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:
Задание: команда «исследователь + писатель»
- Установи
crewai, настрой ключ модели. Создай двух агентов с разнымиrole/goal/backstory(например, аналитик и редактор). - Опиши две задачи: «собрать факты» и «написать обзор». У каждой задай конкретный
expected_output, у второй —context=[первая]. - Собери
CrewсProcess.sequentialи запусти черезkickoff(inputs={"topic": ...}). Проверь, что обзор опирается на собранные факты. - Сделай
expected_outputрасплывчатым («хороший текст») и сравни результат с конкретной формулировкой. Почувствуй разницу. - Поменяй задачи местами в списке (написать раньше исследовать) и посмотри, что получит writer без входных данных — это иллюстрация важности порядка и
context. - Со звёздочкой: добавь третьего агента-критика и третью задачу «проверить обзор» с
context=[write]— получишь мини-конвейер с ревью (привет уроку про проверку и критику).
Что дальше
Ты знаешь четыре кита CrewAI и собрал первую команду. Дальше углубимся в то, что делает CrewAI особенным, — role-based агентов: как роль, цель и предыстория формируют поведение и почему «аналитик», «писатель», «критик» работают лучше безликих агентов.