ИИ-агенты для начинающих. Часть 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.yam
l.
# 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 поддерживает инструменты из:
Вот как добавить инструменты агенту:
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
)
Когда память активирована, агент будет сохранять контекст на протяжении нескольких взаимодействий, улучшая свою способность справляться со сложными многоэтапными задачами.
Лучшие практики
Безопасность и выполнение кода
-
При использовании 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 для безопасного режима
-
Проверьте разрешения на выполнение
-
Просмотрите настройки песочницы кода
Проблемы с памятью. Если ответы агента кажутся непоследовательными:
-
Убедитесь, что память включена
-
Проверьте конфигурацию источников знаний
-
Просмотрите управление историей разговоров