Multi-agent система на CrewAI за 10 минут

Создайте команду из трёх AI-агентов: Researcher ищет данные, Analyst обрабатывает, Writer пишет статью.

📊 Начинающий⏱ 10 мин

# 1. УСТАНОВКА И ПЕРВЫЕ АГЕНТЫ

# Установка CrewAI и инструментов
pip install crewai crewai-tools

# Настройка API ключей (добавьте в .env)
# OPENAI_API_KEY=sk-...
# SERPER_API_KEY=...  (для поискового инструмента)

from crewai import Agent, Task, Crew, Process

# Создание агента — минимум: role, goal, backstory
my_first_agent = Agent(
    role="Senior Data Analyst",
    goal="Проанализировать данные и найти инсайты",
    backstory="Опытный аналитик с 10-летним стажем в FinTech",
    verbose=True,
    allow_delegation=False
)

print(f"Агент создан: {my_first_agent.role}")

# 2. RESEARCHER AGENT — ПОИСК ИНФОРМАЦИИ

from crewai_tools import SerperDevTool, WebsiteSearchTool

# Инструменты для поиска
search_tool = SerperDevTool()
web_tool = WebsiteSearchTool()

# Researcher Agent — ищет актуальную информацию
researcher = Agent(
    role="Senior Research Analyst",
    goal="Найти самую актуальную информацию по заданной теме",
    backstory=(
        "Вы — ведущий исследователь с доступом к поисковым системам. "
        "Ваша специализация: быстрый сбор и верификация данных. "
        "Вы умеете отличать надёжные источники от недостоверных."
    ),
    tools=[search_tool, web_tool],
    verbose=True,
    allow_delegation=True
)

# Задача для Researcher
research_task = Task(
    description=(
        "Проведи исследование на тему: '{topic}'. "
        "Найди 5-7 ключевых фактов, трендов и статистику. "
        "Оформи результат в виде структурированного отчёта "
        "с подзаголовками и ссылками на источники."
    ),
    expected_output="Структурированный отчёт на 500+ слов с источниками",
    agent=researcher
)

# 3. ANALYST AGENT — ОБРАБОТКА ДАННЫХ

# Analyst Agent — анализирует и структурирует данные
analyst = Agent(
    role="Data & Strategy Analyst",
    goal="Проанализировать исследование и выделить ключевые инсайты",
    backstory=(
        "Вы — аналитик-стратег. Ваша сильная сторона — "
        "выделять главное из большого объёма информации. "
        "Вы превращаете сырые данные в actionable рекомендации."
    ),
    verbose=True,
    allow_delegation=False
)

# Задача для Analyst
analysis_task = Task(
    description=(
        "Проанализируй отчёт исследователя по теме '{topic}'. "
        "Выдели ТОП-3 ключевых тренда. "
        "Для каждого тренда укажи: почему это важно, "
        "потенциальное влияние на индустрию, "
        "и рекомендации для бизнеса."
    ),
    expected_output="Аналитическая записка: 3 тренда + рекомендации",
    agent=analyst,
    context=[research_task]  # Получает вывод research_task
)

# 4. WRITER AGENT — ФИНАЛЬНЫЙ ТЕКСТ

# Writer Agent — создаёт финальную статью
writer = Agent(
    role="Senior Content Writer",
    goal="Написать увлекательную статью на русском языке",
    backstory=(
        "Вы — профессиональный копирайтер и технический писатель. "
        "Вы умеете объяснять сложные концепции простым языком. "
        "Ваши статьи всегда структурированы, информативны "
        "и оптимизированы для чтения."
    ),
    verbose=True,
    allow_delegation=False
)

# Задача для Writer
writing_task = Task(
    description=(
        "Напиши статью на русском языке на тему '{topic}', "
        "используя аналитическую записку аналитика. "
        "Структура статьи:\n"
        "1. Заголовок (H1) — цепляющий, с ключевым словом\n"
        "2. Введение — почему тема важна (2-3 абзаца)\n"
        "3. Три ключевых тренда (H2 для каждого)\n"
        "4. Заключение и прогноз\n"
        "Общий объём: 800-1000 слов."
    ),
    expected_output="Готовая статья 800-1000 слов на русском языке",
    agent=writer,
    context=[analysis_task],
    output_file="article_output.md"  # Автосохранение
)

# 5. CREW + TASK ЗАПУСК

# Сборка Crew — команды агентов
crew = Crew(
    agents=[researcher, analyst, writer],
    tasks=[research_task, analysis_task, writing_task],
    process=Process.sequential,  # Последовательное выполнение
    verbose=True,
    memory=True,  # Включаем память между задачами
    planning=True  # Авто-планирование шагов
)

# Запуск!
inputs = {"topic": "Искусственный интеллект в ритейле 2026"}
result = crew.kickoff(inputs=inputs)

# Результат выполнения
print("="*60")
print("🎯 ФИНАЛЬНЫЙ РЕЗУЛЬТАТ:")
print("="*60")
print(result)

# Метрики выполнения
print(f"\n📊 Использовано токенов: {crew.usage_metrics}")

# 6. КАСТОМНЫЕ ИНСТРУМЕНТЫ

# Создание своего Tool: Python функция → BaseTool
from crewai_tools import BaseTool

class SentimentAnalyzer(BaseTool):
    name: str = "Sentiment Analyzer"
    description: str = "Анализирует тональность текста: positive, negative, neutral"

    def _run(self, text: str) -> str:
        """Анализ тональности через OpenAI"""
        from openai import OpenAI
        client = OpenAI()
        response = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[{
                "role": "system",
                "content": "Определи тональность: positive/negative/neutral. Только одно слово."
            }, {
                "role": "user",
                "content": text
            }],
            temperature=0
        )
        return response.choices[0].message.content.strip()

# Использование кастомного инструмента
sentiment_tool = SentimentAnalyzer()
analyst_with_sentiment = Agent(
    role="Analyst",
    goal="Анализировать данные с учётом тональности",
    backstory="Эксперт-аналитик",
    tools=[sentiment_tool, search_tool],
    verbose=True
)

🔗 Полезные ссылки

📖 CrewAI Documentation📖 CrewAI GitHub📖 CrewAI Tools