Почему роль меняет поведение
LLM обучена на текстах множества профессионалов. Когда ты говоришь модели «ты опытный финансовый аналитик», ты активируешь в ней соответствующий «режим»: она начинает рассуждать в терминах метрик, осторожнее относиться к цифрам, чаще ссылаться на источники. Это не магия — это role-prompting из урока про промпт-инжиниринг (модуль 01), только в CrewAI он возведён в основной строительный приём.
Практическая разница ощутима: «безликий ассистент» и «дотошный аналитик, который не верит цифре без источника» по одной и той же задаче выдадут разный результат. Чем конкретнее и правдоподобнее роль, тем устойчивее агент держится своей специализации и тем предсказуемее его поведение в команде.
Под капотом role + goal + backstory собираются в системный промпт агента. CrewAI просто структурирует то, что в чистом коде ты написал бы одним текстом. Преимущество структуры — читаемость и переносимость: роль легко понять, переиспользовать и сравнить с другой.
Триада: role, goal, backstory
Три поля играют разные роли в формировании поведения — путать их не стоит.
role— кто. Профессия/должность. Активирует у модели соответствующую экспертизу. «Финансовый аналитик», а не «помощник».goal— зачем. Личная цель агента в команде. Направляет его решения. «Дать точную оценку рисков по данным».backstory— какой. Опыт, характер, принципы. Задаёт тон и приоритеты. «10 лет в инвестбанкинге, никогда не доверяет цифре без источника».
Как проектировать роль
Хорошая роль — конкретная и «играбельная». Несколько правил, превращающих формальное описание в работающего специалиста:
role: "помощник" goal: "помогать" backstory: "ты ИИ-ассистент"
role: "Аналитик рынка EV"
goal: "точные факты с источниками
по теме {topic}"
backstory: "8 лет в отрасли,
не пишешь без ссылки на данные"
- Конкретная профессия, не «ассистент». Чем уже специализация, тем сильнее эффект (привет разделению ответственности).
- Цель, измеримая результатом.
goalдолжен перекликаться сexpected_outputзадачи. - Backstory задаёт принципы, а не биографию ради биографии. «Не доверяет цифре без источника» полезнее, чем «родился в Москве».
- Роли в команде — разные и непересекающиеся. Иначе агенты дублируют друг друга и путают распределение задач.
Классическая тройка: аналитик → писатель → критик
Соберём каноническую контент-команду. Три роли закрывают три разных класса работы: добыть, оформить, проверить. Это прямое воплощение урока про проверку и критику — критик здесь отдельный агент со своей ролью.
from crewai import Agent
analyst = Agent(
role="Аналитик рынка",
goal="Собрать точные факты и цифры по теме {topic} с источниками",
backstory=("Ты дотошный рыночный аналитик с 8-летним стажем. "
"Никогда не утверждаешь без подтверждения и всегда даёшь источник."),
tools=[search_tool],
allow_delegation=False,
)
writer = Agent(
role="Редактор-копирайтер",
goal="Превратить факты в ясный, структурированный текст",
backstory=("Ты опытный редактор. Ценишь простоту, режешь воду, "
"пишешь так, чтобы понял неспециалист."),
allow_delegation=False,
)
critic = Agent(
role="Главный редактор-критик",
goal="Найти слабые места и неточности в тексте до публикации",
backstory=("Ты придирчивый главред. Проверяешь факты на соответствие "
"источникам, ловишь логические дыры и расплывчатые формулировки."),
allow_delegation=False,
)
Обрати внимание: роли дополняют друг друга, а не соревнуются. Аналитик не пишет текст, писатель не проверяет факты, критик не добывает данные. Каждый силён в своём — ровно тот эффект специализации, ради которого собирают команду.
from crewai import Task, Crew, Process
research = Task(description="Собери факты по {topic}.",
expected_output="5–7 фактов с источниками.", agent=analyst)
draft = Task(description="Напиши обзор по фактам.",
expected_output="Текст на 2–3 абзаца.", agent=writer,
context=[research])
review = Task(description="Проверь обзор: факты, логика, ясность. "
"Верни исправленную версию или подтверди.",
expected_output="Финальный выверенный текст.", agent=critic,
context=[draft, research]) # критику нужны и текст, и факты
crew = Crew(agents=[analyst, writer, critic],
tasks=[research, draft, review], process=Process.sequential)
result = crew.kickoff(inputs={"topic": "рынок электромобилей 2025"})
Тонкость из урока про verifier: чтобы критик проверял факты, а не только стиль, дай ему в context и черновик писателя, и исходные факты аналитика. Тогда он сверит утверждения с данными, а не оценит «на глаз». Контекст определяет, что критик вообще способен проверить.
Делегирование между ролями
CrewAI умеет больше, чем линейный конвейер: при allow_delegation=True агент может перепоручить подзадачу коллеге или задать ему вопрос. Например, писатель, обнаружив нехватку факта, обращается к аналитику прямо в процессе. Это делает команду живее, но и менее предсказуемой.
allow_delegation=True разрешает агентам общаться между собой вне жёсткого порядка задач — это полезно, но усложняет поток, повышает число вызовов LLM и риск «болтовни». Начинай с allow_delegation=False и чёткого конвейера; включай делегирование, когда роли действительно должны переспрашивать друг друга. Это та же дилемма «контроль против гибкости», что и в выборе спикера в AutoGen GroupChat.
Типичные ошибки
«Помощник» с целью «помогать» не активирует экспертизу — результат посредственный. Давай конкретную профессию, цель и принципы.
Если два агента «и аналитики, и писатели», команда дублирует работу и путается. Роли должны быть разными и непересекающимися.
Предыстория должна задавать поведение (принципы, приоритеты), а не быть бесполезной биографией. «Не доверяет цифре без источника» работает; «любит кофе» — нет.
Если критику не дать в context исходные факты, он сможет оценить только стиль, но не корректность. Для проверки фактов нужен доступ к первоисточнику.
Шпаргалка
# ИДЕЯ: правдоподобная профессиональная роль → агент ведёт себя как спец
# (role-prompting из модуля 01, возведённый в основу архитектуры)
Agent(
role="...", # КТО — конкретная профессия (не «ассистент»)
goal="...", # ЗАЧЕМ — цель, перекликается с expected_output задачи
backstory="...", # КАКОЙ — опыт и ПРИНЦИПЫ (а не биография ради биографии)
tools=[...],
allow_delegation=False, # True → агенты могут перепоручать (гибче, но хаотичнее)
)
# КЛАССИЧЕСКАЯ ТРОЙКА (добыть → оформить → проверить):
# analyst — факты с источниками
# writer — ясный текст по фактам
# critic — проверка фактов и логики (context = [draft, research]!)
# Правила:
# • конкретная профессия > «помощник»
# • роли РАЗНЫЕ и непересекающиеся (специализация)
# • backstory задаёт ПОВЕДЕНИЕ, не украшения
# • критику — и текст, и первоисточник (иначе только стиль)
# • allow_delegation: начни с False, включай осознанно
Практическое задание
Спроектируй роли, которые реально работают:
Задание: команда «аналитик → писатель → критик»
- Напиши три агента с продуманной триадой
role/goal/backstory. Для каждогоbackstoryдобавь хотя бы один принцип поведения (например, «не пишет без источника»). - Собери конвейер из трёх задач (research → draft → review) с правильными
context. Критику дай и черновик, и исходные факты. - Запусти и оцени: видно ли по результату «характеры» ролей (дотошность аналитика, простота писателя, придирчивость критика)?
- Замени сильные роли на безликие («помощник 1/2/3») и сравни качество — почувствуй вклад ролевого описания.
- Намеренно сделай роли пересекающимися (два «аналитика-писателя») и посмотри, как это путает распределение и ухудшает результат.
- Со звёздочкой: включи
allow_delegation=Trueу писателя и понаблюдай, обратится ли он к аналитику за недостающим фактом. Что изменилось в потоке и стоимости?
Что дальше
Ты умеешь проектировать роли, которые задают поведение. Дальше — как команда из этих ролей организуется: два процесса CrewAI, Sequential (конвейер) и Hierarchical (с менеджером), и когда какой выбирать.