Учебник

CrewAI: команда из AI-агентов - исследователь, аналитик, писатель

У ваших менеджеров уходит полдня на сбор информации и подготовку отчётов. CrewAI позволяет создать команду AI-агентов с ролями - исследователь, аналитик, редактор - которые делают это за минуту. Разбираем, как собрать такую команду без единого программиста: какие роли давать, как настроить задачи и запустить процесс. Получите готовый шаблон для еженедельного отчёта по рынку.

Макс Космов··9 мин чтения

У ваших менеджеров уходит по 3-4 часа на сбор информации и подготовку еженедельного отчёта по рынку. Половина времени - на поиск источников, копирование данных, оформление. Результат всё равно сырой. А если нужно сделать это для трёх разных направлений? День пропал.

Можно собрать команду AI-агентов, которые сделают это за минуту. Без программиста. Без найма. За вечер.

Разберём на примере стройфирмы (это пример, не реальный кейс автора): вы хотите еженедельно отслеживать цены на материалы и новые технологии в строительстве. Раньше это делал аналитик - 4 часа. Теперь это делает команда из трёх AI-агентов: один ищет, второй анализирует, третий пишет отчёт. Время - 90 секунд. Стоимость - копейки.

CrewAI - это фреймворк (набор готовых инструментов для разработчиков), который позволяет описать роли агентов, задачи и процесс. В отличие от LangGraph, где нужно явно управлять каждым шагом, CrewAI работает как найм команды: вы говорите «ты - исследователь, твоя цель - найти данные», и агент сам решает, как это сделать.

Философия CrewAI: Agent = роль + цель + backstory, почему это работает

CrewAI строится на простом наблюдении: AI-модели (GPT-4, Claude) работают намного лучше, когда им дана чёткая роль с мотивацией. Это не просто инструкция - это три поля, которые формируют личность агента:

  • role - должность: «Старший аналитик рынка», «Технический писатель»
  • goal - цель: что агент хочет достичь
  • backstory - контекст: откуда он знает то, что знает

Зачем это бизнесу? Агент с ролью «Джуниор» будет задавать уточняющие вопросы. Агент с ролью «Тимлид» - отвечать за качество. Модель генерирует текст, опираясь на миллионы примеров профессиональной деятельности: чёткая роль активирует нужный паттерн. Это не магия - это настройка промпта.

from crewai import Agent
from crewai_tools import SerperDevTool

researcher = Agent(
 role="Senior Research Analyst",
 goal="Найти актуальную и достоверную информацию по заданной теме",
 backstory=(
 "Ты опытный аналитик с 10-летним стажем в области технических исследований. "
 "Работал в ведущих аналитических агентствах, специализируешься на AI и технологиях. "
 "Умеешь отличать достоверные источники от шумовых."
 ),
 tools=[SerperDevTool()],
 llm="gpt-4o",
 verbose=True
)

Для предпринимателя: не нужно писать код самому. Достаточно описать роли на русском - менеджер или фрилансер-копирайтер справится за час. Код выше - пример, который можно скопировать и заменить «Senior Research Analyst» на «Аналитик рынка стройматериалов».

Crew, Agent, Task, Tool - четыре кита фреймворка, сборка минимального примера

Agent - исполнитель с ролью, целью и инструментами.

Task - конкретное задание с описанием и ожидаемым результатом. Task отделён от Agent намеренно: один агент может выполнять разные задачи. Поле expected_output - не просто подсказка: CrewAI использует его как критерий оценки.

from crewai import Task

research_task = Task(
 description=(
 "Исследуй тему: {topic}. "
 "Найди 5 актуальных источников, опубликованных не ранее 2024 года. "
 "Особое внимание: технические детали и конкретные данные."
 ),
 expected_output="Структурированный список из 5 источников с кратким резюме каждого",
 agent=researcher,
 output_file="research_output.md" # опционально сохранить в файл
)

Tool - инструмент, который агент может использовать: поиск в Google, парсинг сайтов, чтение файлов.

from crewai_tools import SerperDevTool, ScrapeWebsiteTool, FileReadTool

tools = [
 SerperDevTool(), # поиск Google через Serper API
 ScrapeWebsiteTool(), # парсинг веб-страниц
 FileReadTool(file_path="./docs") # чтение файлов
]

Crew - команда агентов + список задач + процесс выполнения:

from crewai import Crew, Process

crew = Crew(
 agents=[researcher, analyst, writer],
 tasks=[research_task, analysis_task, writing_task],
 process=Process.sequential,
 verbose=True
)

result = crew.kickoff(inputs={"topic": "LangGraph vs AutoGen в 2026 году"})

Для бизнеса: аналог конвейера. Сначала исследование, потом анализ, потом написание. Каждый этап знает, что сделал предыдущий. Это как нанять трёх фрилансеров, но они работают без перерывов и не просят зарплату.

Процессы выполнения: sequential, hierarchical (Manager LLM), consensual

Process.sequential - задачи выполняются строго по порядку. Результат каждой задачи передаётся в контекст следующей. Простой, предсказуемый, подходит для большинства задач.

Researcher -> (результат) -> Analyst -> (результат) -> Writer -> финальный отчёт

Process.hierarchical - вводится Manager Agent, который координирует команду. Manager LLM (отдельная языковая модель, обычно GPT-4o) получает общую задачу, решает кому и что поручить, проверяет результаты:

crew = Crew(
 agents=[researcher, analyst, writer],
 tasks=[complex_task],
 process=Process.hierarchical,
 manager_llm="gpt-4o", # отдельная мощная модель для менеджера
 verbose=True
)

Manager Agent не описывается явно - CrewAI создаёт его автоматически. Стоимость прогона выше на 30-50% из-за дополнительных вызовов Manager LLM.

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

CrewAI Flows: event-driven оркестрация с @start, @listen, @router декораторами

Flows - механизм CrewAI для управления сложными пайплайнами с ветвлением. Декоратор (decorator) - это метка над функцией, которая говорит системе: «эта функция играет особую роль». @start запускает поток, @listen реагирует на завершение другого шага, @router принимает решение о дальнейшем пути.

from crewai.flow.flow import Flow, listen, router, start
from pydantic import BaseModel

class ContentState(BaseModel):
 topic: str = ""
 research: str = ""
 quality_score: int = 0
 final_content: str = ""

class ContentCreationFlow(Flow[ContentState]):

 @start()
 def gather_topic(self):
 self.state.topic = "Квантовые вычисления 2026"

 @listen(gather_topic)
 def research_phase(self):
 result = research_crew.kickoff(inputs={"topic": self.state.topic})
 self.state.research = result.raw

 @router(research_phase)
 def quality_check(self):
 # Оцениваем качество исследования
 score = evaluate_research(self.state.research)
 self.state.quality_score = score
 if score >= 7:
 return "write_content" # хорошее исследование - пишем
 return "redo_research" # плохое - переделываем

 @listen("redo_research")
 def research_phase_retry(self):
 result = deep_research_crew.kickoff(inputs={"topic": self.state.topic})
 self.state.research = result.raw

 @listen("write_content", research_phase_retry)
 def write_final(self):
 result = writing_crew.kickoff(inputs={"research": self.state.research})
 self.state.final_content = result.raw

flow = ContentCreationFlow()
result = flow.kickoff()

State во Flows - Pydantic-модель (библиотека для строгой типизации данных). Это даёт валидацию: если агент попытался записать в поле quality_score строку вместо числа, система немедленно поймает ошибку.

Для бизнеса: Flows позволяют строить сложные сценарии с проверкой качества. Например, если отчёт получился плохим - агент переделывает его автоматически.

Практика: исследовательский экипаж (Researcher -> Analyst -> Writer) для создания отчёта

Реальный сценарий для компании: еженедельный отчёт по рынку конкурентов. Раньше - 3-4 часа работы аналитика. С CrewAI - 45-90 секунд и $0.15-0.35 на модель. Аналитик освобождается для задач, требующих реального суждения: интерпретации данных, стратегических выводов, переговоров.

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

from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool, ScrapeWebsiteTool

# Агенты
researcher = Agent(
 role="Research Specialist",
 goal="Собрать достоверные данные и факты по теме",
 backstory="Специализируешься на технических исследованиях, умеешь находить первичные источники",
 tools=[SerperDevTool(), ScrapeWebsiteTool()],
 llm="gpt-4o-mini"
)

analyst = Agent(
 role="Data Analyst",
 goal="Структурировать и проанализировать собранные данные",
 backstory="Аналитик данных с опытом в технологической отрасли, умеешь видеть паттерны",
 llm="gpt-4o-mini"
)

writer = Agent(
 role="Technical Writer",
 goal="Создать чёткий, структурированный отчёт на основе анализа",
 backstory="Технический писатель, специализируешься на отчётах для бизнеса и IT",
 llm="gpt-4o"
)

# Задачи
research_task = Task(
 description="Исследуй тему '{topic}'. Найди минимум 5 источников, сфокусируйся на данных 2025-2026 года.",
 expected_output="Список источников с URL и ключевыми данными из каждого",
 agent=researcher
)

analysis_task = Task(
 description="Проанализируй данные из исследования. Выдели 3-5 ключевых инсайта, найди паттерны.",
 expected_output="Структурированный анализ с инсайтами и выводами",
 agent=analyst,
 context=[research_task] # получает контекст от research_task
)

writing_task = Task(
 description="Напиши отчёт 800-1200 слов на основе исследования и анализа.",
 expected_output="Готовый отчёт в markdown с разделами: введение, ключевые находки, выводы",
 agent=writer,
 context=[research_task, analysis_task],
 output_file="report.md"
)

# Запуск
crew = Crew(
 agents=[researcher, analyst, writer],
 tasks=[research_task, analysis_task, writing_task],
 process=Process.sequential,
 verbose=True
)

result = crew.kickoff(inputs={"topic": "Состояние рынка LLM в 2026 году"})

Типичное время: 45-90 секунд, стоимость около $0.15-0.35 на GPT-4o-mini + GPT-4o для writer.

Межагентная коммуникация: A2A нативный протокол, poll/stream/push handlers

CrewAI 0.80+ поддерживает A2A-протокол (Agent-to-Agent - стандарт межагентного взаимодействия от Google и Microsoft) для взаимодействия с агентами из других фреймворков:

from crewai.utilities.agents.agent_builder.a2a import A2AAgentWrapper

# Подключить внешний A2A-агент как участника Crew
external_agent = A2AAgentWrapper(
 agent_card_url="https://external-service.example.com/.well-known/agent.json"
)

crew = Crew(
 agents=[researcher, analyst, external_agent],
 tasks=tasks
)

Push/poll/stream - три режима получения ответов от агентов. Push - агент отправляет результат когда готов. Poll - периодически проверяем статус. Stream - получаем части ответа по мере генерации. CrewAI по умолчанию использует push для синхронных задач.

Для бизнеса: если у вас есть внешний сервис (например, ваш партнёр предоставляет API с данными), вы можете подключить его агента как участника команды. Это как нанять внешнего эксперта на проект.

Кастомные инструменты: BaseTool, интеграция с внешними API и локальными скриптами

Стандартных инструментов часто не хватает. Нужно подключить вашу базу данных, внутренний API или корпоративную систему. Без кастомных инструментов агент может только искать в интернете и читать файлы. С кастомными инструментами он обращается к вашей CRM, смотрит данные в ERP, записывает результаты в таблицы. Для этого CrewAI предоставляет BaseTool - базовый класс для создания собственных инструментов.

from crewai.tools import BaseTool
from pydantic import BaseModel, Field
from typing import Type

class DatabaseQueryInput(BaseModel):
 query: str = Field(description="SQL-запрос к базе данных")
 database: str = Field(default="analytics", description="Имя базы данных")

class DatabaseTool(BaseTool):
 name: str = "database_query"
 description: str = "Выполняет SQL-запрос к базе данных и возвращает результаты"
 args_schema: Type[BaseModel] = DatabaseQueryInput

 def _run(self, query: str, database: str = "analytics") -> str:
 conn = get_db_connection(database)
 result = conn.execute(query).fetchall()
 return str(result[:50]) # ограничиваем вывод

 async def _arun(self, query: str, database: str = "analytics") -> str:
 return self._run(query, database)

Для бизнеса: если у вас есть своя CRM (например, amoCRM или Bitrix24), можно написать инструмент, который агент будет вызывать для получения данных о клиентах. Но для этого понадобится фрилансер-программист на пару часов. Без этого - используйте готовые инструменты.

Деплой CrewAI: crewai deploy на платформе CrewAI Cloud vs self-hosted

Когда прототип проверен и нужно запустить агента в боевых условиях, встаёт вопрос развёртывания. CrewAI Cloud - самый быстрый путь. Self-hosted - путь для тех, кто не может выпускать данные за периметр компании.

CrewAI предоставляет управляемую платформу для развёртывания через CLI (инструмент командной строки):

crewai install
crewai deploy push # деплой на CrewAI Cloud
crewai deploy status # статус деплоя

Для self-hosted (когда данные нельзя отправлять во внешние сервисы): CrewAI Crew - обычный Python-скрипт, легко запускается через FastAPI (лёгкий веб-фреймворк для Python):

from fastapi import FastAPI
from crewai import Crew

app = FastAPI()

@app.post("/run")
async def run_crew(topic: str):
 crew = build_research_crew() # фабрика crew
 result = crew.kickoff(inputs={"topic": topic})
 return {"result": result.raw}

Для бизнеса: если у вас нет данных, которые нельзя отправлять вовне - используйте CrewAI Cloud. Это как SaaS - платите и пользуетесь. Если данные чувствительные - разворачивайте на своём сервере, но понадобится DevOps-инженер.

Частые вопросы

CrewAI vs LangGraph: что проще для старта, что мощнее в продакшне?

CrewAI проще для старта: декларативное описание ролей, меньше бойлерплейта (технического кода-обвязки), понятная структура. Команда из трёх агентов пишется за 30-50 строк кода. LangGraph мощнее в продакшне: тонкий контроль над состоянием, явное ветвление, лучшая отладка через LangSmith. Типичный выбор: CrewAI для прототипа и задач с понятными ролями, LangGraph если прототип вырос и нужен полный контроль над каждым шагом.

Как передать результат одного агента как входные данные другому?

Через параметр context в Task. Task с context=[task1, task2] получает результаты этих задач автоматически - CrewAI добавляет их в промпт агента. Для явной передачи через состояние - используйте Flows с Pydantic-моделью.

Можно ли использовать CrewAI с open-source моделями (Ollama, Mistral)?

Да. CrewAI использует LiteLLM под капотом (библиотека-унификатор для разных LLM-провайдеров), поэтому поддерживает любой совместимый провайдер:

agent = Agent(role="...", llm="ollama/llama3.2", base_url="http://localhost:11434")

Качество работы зависит от способности модели следовать структурированным инструкциям. Небольшие открытые модели иногда путаются с форматом вывода.

Что такое Manager Agent и когда его использовать вместо sequential?

Manager Agent - автоматически создаваемый координатор в Process.hierarchical. Его роль: принять задачу, декомпозировать на подзадачи, назначить исполнителей, проверить результаты. Нужен когда заранее неизвестно, какой порядок задач оптимален, или когда задачи могут выполняться параллельно по решению менеджера.

Как ограничить доступ агента только к нужным инструментам?

Инструменты задаются на уровне агента, а не Crew. Агент может вызывать только те инструменты, которые переданы в его tools=[...]. Это основной механизм изоляции - принцип минимальных привилегий применяется на уровне конфигурации.

Что дальше

CrewAI - хороший выбор для задач, где роли участников понятны заранее: аналитик, редактор, разработчик. Если задача требует сложного ветвления или жёсткого контроля каждого шага - смотрите в сторону LangGraph. Если нужен официальный SDK с поддержкой от провайдера - OpenAI Agents SDK.

Следующий шаг для предпринимателя: возьмите задачу, которая отнимает у вас или вашего менеджера больше всего времени на сбор информации. Опишите её как последовательность: сбор данных -> анализ -> оформление. Скопируйте код из раздела «Практика», замените роли на свои, вставьте свой API-ключ Serper (бесплатно 2500 запросов) и запустите. Это займёт 2-3 часа с помощью любого фрилансера, знакомого с Python. Результат - готовый черновик отчёта за минуту вместо 4 часов.

AI Компас (t.me/kosmoslab_ai) - канал для предпринимателей в РФ и СНГ, которые применяют AI в своём бизнесе без программиста. Разбираем инструменты и схемы - без курсов и теории.