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

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

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

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

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

Атрибут Параметр Тип Описание
Role role str Определяет функцию и специализацию агента в команде.
Goal goal str Цель агента.
Backstory backstory str Контекст и индивидуальность агента
LLM* llm Union[str, LLM, Any] Языковая модель, которая управляет агентом. По умолчанию использует модель, указанную в OPENAI_MODEL_NAME или "gpt-4".
Tools* tools List[BaseTool] Инструменты доступные агенту. По умолчанию — пустой список.
Function Calling LLM* function_calling_llm Optional[Any] Языковая модель для вызова инструментов, переопределяет LLM команды, если указана.
Max Iterations* max_iter int Максимальное количество итераций, прежде чем агент должен предоставить свой лучший ответ. По умолчанию 20.
Max RPM* max_rpm Optional[int] Максимальное количество запросов в минуту во избежание ограничений.
Max Execution Time* max_execution_time Optional[int] Максимальное время (в секундах) для выполнения задачи.
Memory* memory bool Должен ли агент сохранять память о взаимодействиях. По умолчанию True.
Verbose* verbose bool Включить подробные журналы выполнения для отладки. По умолчанию False.
Allow Delegation* allow_delegation bool Разрешить агенту делегировать задачи другим агентам. По умолчанию False.
Step Callback* step_callback Optional[Any] Функция, вызываемая после каждого шага агента, переопределяет обратный вызов команды.
Cache* cache bool Включить кэширование для использования инструментов. По умолчанию True.
System Template* system_template Optional[str] Системный шаблон определяет основное поведение агента
Prompt Template* prompt_template Optional[str] Структурирует формат входных данных
Response Template* response_template Optional[str] Форматирует ответы агента
Allow Code Execution* allow_code_execution Optional[bool] Включить выполнение кода для агента. По умолчанию False.
Max Retry Limit* max_retry_limit int Максимальное количество повторных попыток при возникновении ошибки. По умолчанию 2.
Respect Context Window* respect_context_window bool Поддерживать сообщения в пределах размера контекстного окна путем обобщения. По умолчанию True.
Code Execution Mode* code_execution_mode Literal["safe", "unsafe"] Режим выполнения кода: safe (использование Docker) или unsafe (прямое выполнение). По умолчанию safe.
Embedder* embedder Optional[Dict[str, Any]] Конфигурация для эмбендера, используемого агентом.
Knowledge Sources* knowledge_sources Optional[List[BaseKnowledgeSource]] Источники знаний, доступные агенту.
Use System Prompt* use_system_prompt Optional[bool] Использовать ли системный промт (для модели o1). По умолчанию True.
*опционально

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

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

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

Использование YAML-конфигурации — это не просто дань моде. Такой подход дает нам несколько серьезных преимуществ:
- Код становится чище и понятнее
- Настройки легче поддерживать и обновлять
- Меньше шансов допустить ошибку
- И да, ваши коллеги скажут спасибо
Заглянем в файл src/hmhm_project/config/agents.yaml.

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

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

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

# 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. Вот подробный пример, показывающий все доступные параметры:

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 поддерживает инструменты из:
- CrewAI Toolkit
- LangChain Tools
Вот как добавить инструменты агенту:

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
)

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

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

from crewai import Agent

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

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

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

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

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

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

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

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

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

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

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

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


Содержание

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

Практикум

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