При подготовке статьи использовалась публикация «Crew AI agents».
Что такое агент в CrewAI
Агент в CrewAI — это автономный исполнитель, этакий цифровой специалист, который умеет:
- Выполнять конкретные задачи в рамках своей компетенции
- Принимать решения, опираясь на свою роль и поставленные цели
- Использовать доступные инструменты для достижения результата
- Общаться и взаимодействовать с другими агентами (и не устраивать офисные интриги)
- Хранить историю взаимодействий
- При необходимости делегировать задачи
Представьте агента как члена команды со своим уникальным набором навыков и зоной ответственности. Это как в реальной компании: у каждого специалиста своя роль, и каждый делает то, в чем действительно силен.
Атрибут | Параметр | Тип | Описание |
---|---|---|---|
Role | role | str | Определяет функцию и специализацию агента в команде. |
Goal | goal | str | Цель агента. |
Backstory | backstory |
| Контекст и индивидуальность агента |
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 поддерживает инструменты из:
Вот как добавить инструменты агенту:
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 для безопасного режима
- Проверьте разрешения на выполнение
- Просмотрите настройки песочницы кода
Проблемы с памятью. Если ответы агента кажутся непоследовательными:
- Убедитесь, что память включена
- Проверьте конфигурацию источников знаний
- Просмотрите управление историей разговоров
***
Содержание
- Что такое ИИ-агенты и где они применяются
- Агентный фреймворк CrewAI
- Установка CrewAI и создание нового проекта
- Агенты в CrewAI
- Создание задач для агентов в CrewAI