角色驱动 Agent 设计
学习目标
理解 CrewAI 如何通过 role/goal/backstory 三元组定义 Agent 人格,以及这种设计如何影响提示词组装、多 Agent 路由和委派决策。
前置知识
- Agent 核心循环设计 — Session/Turn 模型与执行循环
- Agent 人格与提示词设计模式 — 结构化人格定义
下文假设你已理解上述概念,直接聚焦 CrewAI 的具体实现。
项目实践
role/goal/backstory 三元组
CrewAI 的 Agent 定义要求三个必需字段:
# 伪代码Agent( role="高级数据分析师", goal="从数据中提取可操作的洞察", backstory="你拥有10年数据分析经验,擅长从复杂数据集中发现模式",)这三个字段在 Agent 初始化时通过 model_validator(mode="before") 合并配置,然后通过 post_init_setup 初始化 LLM、执行器和技能。
提示词组装
CrewAI 使用 i18n 多语言模板将三元组组装为系统提示词:
You are {role}.Your personal goal is: {goal}Your backstory: {backstory}
Tools you have access to:{tools_description}
You have a maximum of {max_iter} iterations.模板可通过 system_template、prompt_template、response_template 参数自定义。
三元组在多 Agent 路由中的作用
在 Hierarchical 模式下,Manager Agent 根据 role 描述决定任务分配:
DelegateWorkTool使用role + goal生成同事 Agent 的描述列表- Manager 的提示词包含教导如何根据 role 选择合适 Agent 的指令
- 委派时,目标 Agent 的 backstory 影响其输出的风格和视角
Agent 适配器
CrewAI 的 Agent Adapter 系统允许将第三方框架的 Agent 桥接到 CrewAI 接口:
BaseAgentAdapter├── LangGraphAgentAdapter → 创建 LangGraph ReAct Agent 图└── OpenAIAgentAdapter → 配置 OpenAI Assistants API每个适配器负责工具转换、结构化输出转换和执行桥接,使得 Crew 中可以混合使用原生 Agent 和第三方 Agent。
问题与规避
过于泛化的 role 描述导致行为不可预测
- 如果 role 描述太宽泛(如 “助手”),LLM 的输出风格和质量不可预测
- 对策:role 应具体到领域和职责,如 “Python 后端性能优化专家” 而非 “程序员”
三元组缺乏行为约束和输出格式控制
- 相比完整的 Agent 人格模板(身份 + 使命 + 规则 + 工作流 + 通信风格),三元组缺乏对行为约束的控制
- 对策:通过自定义
system_template和prompt_template添加行为约束和输出格式要求
backstory 过长导致 Token 浪费
- backstory 每次调用 LLM 都会包含在系统提示中
- 对策:backstory 保持 1-2 句,专注于经验背景和视角,而非详细简历
设计取舍
三元组 vs 完整人格模板
| 维度 | 三元组 | 完整模板 |
|---|---|---|
| 简洁性 | 高(3 个字段) | 低(6+ 个段落) |
| 行为控制 | 弱 | 强 |
| 多 Agent 路由 | 直接支持(Manager 根据 role 分配) | 需要额外解析 |
| 适用场景 | 快速原型、角色分工清晰的场景 | 需要精确行为约束的场景 |
CrewAI 选择三元组作为核心接口,但允许通过模板自定义扩展。
参考来源
- CrewAI Agent 文档 — Agent 参数详解