ИИ-агенты для начинающих. Часть 4. Агенты в CrewAI

При подготовке статьи использовалась публикация «Crew AI agents».

Что такое агент в CrewAI

Агент в CrewAI — это автономный исполнитель, этакий цифровой специалист, который умеет:

  • Выполнять конкретные задачи в рамках своей компетенции
  • Принимать решения, опираясь на свою роль и поставленные цели
  • Использовать доступные инструменты для достижения результата
  • Общаться и взаимодействовать с другими агентами (и не устраивать офисные интриги)
  • Хранить историю взаимодействий
  • При необходимости делегировать задачи

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

АтрибутПараметрТипОписание
RolerolestrОпределяет функцию и специализацию агента в команде.
GoalgoalstrЦель агента.
Backstorybackstory
str
Контекст и индивидуальность агента
LLM*llmUnion[str, LLM, Any]Языковая модель, которая управляет агентом. По умолчанию использует модель, указанную в OPENAI_MODEL_NAME или "gpt-4".
Tools*
toolsList[BaseTool]Инструменты доступные агенту. По умолчанию – пустой список.
Function Calling LLM*function_calling_llmOptional[Any]Языковая модель для вызова инструментов, переопределяет LLM команды, если указана.
Max Iterations*max_iterintМаксимальное количество итераций, прежде чем агент должен предоставить свой лучший ответ. По умолчанию 20.
Max RPM*max_rpmOptional[int]Максимальное количество запросов в минуту во избежание ограничений.
Max Execution Time*max_execution_timeOptional[int]Максимальное время (в секундах) для выполнения задачи.
Memory*memoryboolДолжен ли агент сохранять память о взаимодействиях. По умолчанию True.
Verbose*verboseboolВключить подробные журналы выполнения для отладки. По умолчанию False.
Allow Delegation*allow_delegationboolРазрешить агенту делегировать задачи другим агентам. По умолчанию False.
Step Callback*step_callbackOptional[Any]Функция, вызываемая после каждого шага агента, переопределяет обратный вызов команды.
Cache*cacheboolВключить кэширование для использования инструментов. По умолчанию True.
System Template*system_templateOptional[str]Системный шаблон определяет основное поведение агента
Prompt Template*prompt_templateOptional[str]Структурирует формат входных данных
Response Template*response_templateOptional[str]Форматирует ответы агента
Allow Code Execution*allow_code_executionOptional[bool]Включить выполнение кода для агента. По умолчанию False.
Max Retry Limit*max_retry_limitintМаксимальное количество повторных попыток при возникновении ошибки. По умолчанию 2.
Respect Context Window*respect_context_windowboolПоддерживать сообщения в пределах размера контекстного окна путем обобщения. По умолчанию True.
Code Execution Mode*code_execution_modeLiteral["safe", "unsafe"]Режим выполнения кода: safe (использование Docker) или unsafe (прямое выполнение). По умолчанию safe.
Embedder*embedderOptional[Dict[str, Any]]Конфигурация для эмбендера, используемого агентом.
Knowledge Sources*knowledge_sourcesOptional[List[BaseKnowledgeSource]]Источники знаний, доступные агенту.
Use System Prompt*use_system_promptOptional[bool]Использовать ли системный промт (для модели o1). По умолчанию True.
*опционально

Создание агентов в CrewAI: настройка через YAML или код

В CrewAI есть два способа создания агентов: через YAML-конфигурацию (рекомендуемый метод) или напрямую через код. Давайте разберем первый и самый удобный способ — через YAML.

YAML-конфигурация

Использование YAML-конфигурации — это не просто дань моде. Такой подход дает нам несколько серьезных преимуществ:

  • Код становится чище и понятнее
  • Настройки легче поддерживать и обновлять
  • Меньше шансов допустить ошибку
  • И да, ваши коллеги скажут спасибо

Заглянем в файл src/hmhm_project/config/agents.yaml.

YAML
# src/hmhm_project/config/agents.yaml
researcher:
  role: >
    Старший исследователь данных по теме {topic}
  goal: >
    Искать новые разработки в {topic}
  backstory: >
    Вы опытный исследователь с особым талантом к выявлению последних
    достижений в области {topic}. Известны своей способностью находить
    наиболее релевантную информацию и представлять ее ясно и лаконично.

reporting_analyst:
  role: >
    Аналитик по теме {topic}
  goal: >
    Создавать подробные отчеты на основе анализа данных и результатов исследований в области {topic}
  backstory: >
    Вы педантичный аналитик с острым вниманием к деталям. Известны своей
    способностью превращать сложные данные в четкие и лаконичные отчеты,
    что позволяет другим легко понимать информацию и действовать на ее основе.

Чтобы использовать эту YAML-конфигурацию в коде, создадим класс crew, который наследуется от CrewBase:

Python
# src/hmhm_project/crew.py
from crewai import Agent, Crew, Process
from crewai.project import CrewBase, agent, crew
from crewai_tools import SerperDevTool

@CrewBase
class HmHmCrew():

  agents_config = "config/agents.yaml"

  @agent
  def researcher(self) -> Agent:
    return Agent(
      config=self.agents_config['researcher'],
      verbose=True,
      tools=[SerperDevTool()]
    )

  @agent
  def reporting_analyst(self) -> Agent:
    return Agent(
      config=self.agents_config['reporting_analyst'],
      verbose=True
    )

Имена, которые мы используем в YAML-файлах (agents.yaml), должны соответствовать названиям методов в Python-коде.

Объявление агента, его роли, цели и легенды в коде

Мы можем создавать агентов напрямую в коде путем создания экземпляра класса Agent. Вот подробный пример, показывающий все доступные параметры:

Python
from crewai import Agent
from crewai_tools import SerperDevTool

# Создание агента с параметрами
agent = Agent(
    role="Senior Data Scientist",
    goal="Анализировать и интерпретировать сложные наборы данных для получения практически применимых выводов",
    backstory="Имея более 10 лет опыта в области науки о данных и машинного обучения, вы превосходно справляетесь с поиском закономерностей в сложных наборах данных.",
    llm="gpt-4",  # По умолчанию: OPENAI_MODEL_NAME or "gpt-4"
    function_calling_llm=None,  # Опционально: Языковая модель для вызова инструментов
    memory=True,  # По умолчанию: True
    verbose=False,  # По умолчанию: False
    allow_delegation=False,  # По умолчаниюt: False
    max_iter=20,  # По умолчанию: 20 итераций
    max_rpm=None,  # Опционально: Максимальное количество запросов в минуту во избежание ограничений.
    max_execution_time=None,  # Опционально: Максимальное время (в секундах) для выполнения задачи.
    max_retry_limit=2,  # По умолчанию: Максимальное количество повторных попыток при возникновении ошибки. По умолчанию 2.
    allow_code_execution=False,  # По умолчанию: False
    code_execution_mode="safe",  # По умолчанию: Режим выполнения кода: safe (использование Docker) или unsafe (прямое выполнение). По умолчанию safe.
    respect_context_window=True,  # По умолчанию: True
    use_system_prompt=True,  # По умолчанию: True
    tools=[SerperDevTool()],  # Опционально: Инструменты доступные агенту. По умолчанию - пустой список.
    knowledge_sources=None,  # Опционально: Источники знаний, доступные агенту.
    embedder=None,  # Опционально: Конфигурация для эмбендера, используемого агентом.
    system_template=None,  # Опционально: Системный шаблон для агента.
    prompt_template=None,  # Опционально: Пользовательский шаблон для агента.
    response_template=None,  # Опционально: Пользовательский шаблон ответа для агента.
    step_callback=None,  # Опционально: Функция, вызываемая после каждого шага агента, переопределяет обратный вызов команды.
)

Инструменты для агентов

Агенты могут быть оснащены различными инструментами для расширения их возможностей. CrewAI поддерживает инструменты из:

Вот как добавить инструменты агенту:

Python
from crewai import Agent
from crewai_tools import SerperDevTool, WikipediaTools

# Объявляем интсрументы
search_tool = SerperDevTool()
wiki_tool = WikipediaTools()

# Добавляем инструменты агенту
researcher = Agent(
    role="Исследователь ИИ",
    goal="Исследовать последние разработки в области ИИ",
    tools=[search_tool, wiki_tool],
    verbose=True
)

Память и контекст агентов

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

Python
from crewai import Agent

analyst = Agent(
    role="Дата-аналитик",
    goal="Анализировать и запоминать сложные шаблоны данных",
    memory=True,  # Активируем память
    verbose=True
)

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

Лучшие практики

Безопасность и выполнение кода

  • При использовании allow_code_execution будьте осторожны с пользовательским вводом и всегда проверяйте его
  • Используйте code_execution_mode: “safe” (Docker) в продакшене
  • Рассмотрите установку подходящих ограничений max_execution_time для предотвращения бесконечных циклов

Оптимизация производительности

  • Используйте respect_context_window: true для предотвращения проблем с лимитом токенов
  • Установите соответствующий max_rpm чтобы избежать ограничений частоты запросов
  • Включите cache: true для улучшения производительности при повторяющихся задачах
  • Настройте max_iter и max_retry_limit в зависимости от сложности задачи

Управление памятью и контекстом

  • Используйте memory: true для задач, требующих исторического контекста
  • Используйте knowledge_sources для информации, специфичной для предметной области
  • Используйте шаблоны (system_template, prompt_template, response_template) для точного контроля поведения агента

Взаимодействие агентов

  • Включите allow_delegation: true когда агентам нужно работать вместе
  • Используйте step_callback для мониторинга и логирования взаимодействий агентов
  • Рассмотрите использование разных LLM для разных целей:
    • Основная llm для сложных рассуждений
    • function_calling_llm для эффективного использования инструментов

Совместимость моделей

  • Установите use_system_prompt: false для старых моделей, не поддерживающих системные сообщения
  • Убедитесь, что выбранная llm поддерживает нужные вам функции

Устранение распространенных проблем

Ошибки окна контекста: Если вы превышаете ограничения контекста:

  • Включите respect_context_window
  • Используйте более эффективные промпты
  • Периодически очищайте память агента

Проблемы с выполнением кода: Если выполнение кода не удается:

  • Проверьте установку Docker для безопасного режима
  • Проверьте разрешения на выполнение
  • Просмотрите настройки песочницы кода

Проблемы с памятью. Если ответы агента кажутся непоследовательными:

  • Убедитесь, что память включена
  • Проверьте конфигурацию источников знаний
  • Просмотрите управление историей разговоров

***

Содержание

  1. Что такое ИИ-агенты и где они применяются
  2. Агентный фреймворк CrewAI
  3. Установка CrewAI и создание нового проекта
  4. Агенты в CrewAI
  5. Создание задач для агентов в CrewAI

Практикум

  1. Создание системы автоматического перевода и редактирования текстов