Почему роль меняет поведение

LLM обучена на текстах множества профессионалов. Когда ты говоришь модели «ты опытный финансовый аналитик», ты активируешь в ней соответствующий «режим»: она начинает рассуждать в терминах метрик, осторожнее относиться к цифрам, чаще ссылаться на источники. Это не магия — это role-prompting из урока про промпт-инжиниринг (модуль 01), только в CrewAI он возведён в основной строительный приём.

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

ℹ️ Роль — это структурированный системный промпт

Под капотом role + goal + backstory собираются в системный промпт агента. CrewAI просто структурирует то, что в чистом коде ты написал бы одним текстом. Преимущество структуры — читаемость и переносимость: роль легко понять, переиспользовать и сравнить с другой.

Триада: role, goal, backstory

Три поля играют разные роли в формировании поведения — путать их не стоит.

100%
колёсико — масштаб  ·  зажать и тянуть — перемещение
role КТО он по профессии «Финансовый аналитик» задаёт экспертный «режим» goal ЗАЧЕМ он работает «дать точную оценку рисков» направляет действия к цели backstory КАКОЙ он, опыт/характер «10 лет, дотошен к цифрам» задаёт тон и стиль поведение агента как этот специалист рассуждал бы и действовал
  • role — кто. Профессия/должность. Активирует у модели соответствующую экспертизу. «Финансовый аналитик», а не «помощник».
  • goal — зачем. Личная цель агента в команде. Направляет его решения. «Дать точную оценку рисков по данным».
  • backstory — какой. Опыт, характер, принципы. Задаёт тон и приоритеты. «10 лет в инвестбанкинге, никогда не доверяет цифре без источника».

Как проектировать роль

Хорошая роль — конкретная и «играбельная». Несколько правил, превращающих формальное описание в работающего специалиста:

❌ Слабая роль
role: "помощник"
goal: "помогать"
backstory: "ты ИИ-ассистент"
безлико → посредственно и непредсказуемо
✅ Сильная роль
role: "Аналитик рынка EV"
goal: "точные факты с источниками
       по теме {topic}"
backstory: "8 лет в отрасли,
   не пишешь без ссылки на данные"
конкретно → стабильное экспертное поведение
  • Конкретная профессия, не «ассистент». Чем уже специализация, тем сильнее эффект (привет разделению ответственности).
  • Цель, измеримая результатом. goal должен перекликаться с expected_output задачи.
  • Backstory задаёт принципы, а не биографию ради биографии. «Не доверяет цифре без источника» полезнее, чем «родился в Москве».
  • Роли в команде — разные и непересекающиеся. Иначе агенты дублируют друг друга и путают распределение задач.

Классическая тройка: аналитик → писатель → критик

Соберём каноническую контент-команду. Три роли закрывают три разных класса работы: добыть, оформить, проверить. Это прямое воплощение урока про проверку и критику — критик здесь отдельный агент со своей ролью.

Три role-based агента
python
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,
)

Обрати внимание: роли дополняют друг друга, а не соревнуются. Аналитик не пишет текст, писатель не проверяет факты, критик не добывает данные. Каждый силён в своём — ровно тот эффект специализации, ради которого собирают команду.

Связываем ролями задачи в конвейер
python
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.

Типичные ошибки

Ошибка 1: безликие роли

«Помощник» с целью «помогать» не активирует экспертизу — результат посредственный. Давай конкретную профессию, цель и принципы.

Ошибка 2: пересекающиеся роли

Если два агента «и аналитики, и писатели», команда дублирует работу и путается. Роли должны быть разными и непересекающимися.

Ошибка 3: backstory ради красоты

Предыстория должна задавать поведение (принципы, приоритеты), а не быть бесполезной биографией. «Не доверяет цифре без источника» работает; «любит кофе» — нет.

Ошибка 4: критик без доступа к источнику

Если критику не дать в context исходные факты, он сможет оценить только стиль, но не корректность. Для проверки фактов нужен доступ к первоисточнику.

Шпаргалка

Role-based агенты — всё в одном месте
python
# ИДЕЯ: правдоподобная профессиональная роль → агент ведёт себя как спец
#   (role-prompting из модуля 01, возведённый в основу архитектуры)

Agent(
    role="...",       # КТО — конкретная профессия (не «ассистент»)
    goal="...",       # ЗАЧЕМ — цель, перекликается с expected_output задачи
    backstory="...",  # КАКОЙ — опыт и ПРИНЦИПЫ (а не биография ради биографии)
    tools=[...],
    allow_delegation=False,   # True → агенты могут перепоручать (гибче, но хаотичнее)
)

# КЛАССИЧЕСКАЯ ТРОЙКА (добыть → оформить → проверить):
#   analyst  — факты с источниками
#   writer   — ясный текст по фактам
#   critic   — проверка фактов и логики   (context = [draft, research]!)

# Правила:
#  • конкретная профессия > «помощник»
#  • роли РАЗНЫЕ и непересекающиеся (специализация)
#  • backstory задаёт ПОВЕДЕНИЕ, не украшения
#  • критику — и текст, и первоисточник (иначе только стиль)
#  • allow_delegation: начни с False, включай осознанно

Практическое задание

Спроектируй роли, которые реально работают:

Задание: команда «аналитик → писатель → критик»

  1. Напиши три агента с продуманной триадой role/goal/backstory. Для каждого backstory добавь хотя бы один принцип поведения (например, «не пишет без источника»).
  2. Собери конвейер из трёх задач (research → draft → review) с правильными context. Критику дай и черновик, и исходные факты.
  3. Запусти и оцени: видно ли по результату «характеры» ролей (дотошность аналитика, простота писателя, придирчивость критика)?
  4. Замени сильные роли на безликие («помощник 1/2/3») и сравни качество — почувствуй вклад ролевого описания.
  5. Намеренно сделай роли пересекающимися (два «аналитика-писателя») и посмотри, как это путает распределение и ухудшает результат.
  6. Со звёздочкой: включи allow_delegation=True у писателя и понаблюдай, обратится ли он к аналитику за недостающим фактом. Что изменилось в потоке и стоимости?

Что дальше

Ты умеешь проектировать роли, которые задают поведение. Дальше — как команда из этих ролей организуется: два процесса CrewAI, Sequential (конвейер) и Hierarchical (с менеджером), и когда какой выбирать.