Skip to content

Agent 详解 ​

1. Agent 核心概念 ​

Agent 是 CrewAI 的基本执行单元。每个 Agent 代表一个具有特定角色、目标和背景的自主智能体。Agent 的设计理念源自现实团队——就像公司里有产品经理、开发工程师、测试工程师一样,每个 Agent 专注于自己的领域。

Agent 的三大要素 ​

要素作用示例
roleAgent 的身份/职位"高级 Python 开发工程师"
goalAgent 追求的目标"编写高质量、可维护的代码"
backstory背景上下文,塑造行为模式"你有 10 年 Python 开发经验,精通设计模式..."

WARNING

这三个字段是 Agent 的"灵魂"。好的定义能让 Agent 表现出色,模糊的定义会导致输出质量下降。花时间写好这三个字段是值得的。

2. 创建 Agent ​

2.1 基础用法 ​

python
from crewai import Agent

researcher = Agent(
    role="高级 AI 研究员",
    goal="深入分析人工智能领域的最新技术突破和产业应用",
    backstory="""你是一位在顶级 AI 实验室工作了 15 年的资深研究员。
你的专长是计算机视觉和自然语言处理。
你善于从复杂的技术论文中提取关键信息,
并用通俗易懂的语言向非技术人员解释。""",
    verbose=True
)

2.2 完整参数配置 ​

python
from crewai import Agent
from crewai_tools import SerperDevTool, WebsiteSearchTool

agent = Agent(
    # === 核心三要素 ===
    role="数据分析师",
    goal="从数据中发现有价值的洞察并生成可视化报告",
    backstory="你是一位资深数据分析师,擅长统计分析和数据可视化。",

    # === LLM 配置 ===
    llm="gpt-4o",                          # 指定 LLM(默认 gpt-4o-mini)

    # === 工具 ===
    tools=[SerperDevTool(), WebsiteSearchTool()],

    # === 行为控制 ===
    verbose=True,                           # 打印详细执行日志
    allow_delegation=True,                  # 允许将任务委托给其他 Agent
    max_iter=15,                            # 单次任务最大迭代次数
    max_rpm=10,                             # 每分钟最大 API 请求数(限流)
    max_retry_limit=3,                      # 出错时最大重试次数

    # === 记忆 ===
    memory=True,                            # 启用记忆

    # === 回调 ===
    step_callback=my_step_callback,         # 每步执行后的回调函数

    # === 系统模板(高级) ===
    system_template=None,                   # 自定义系统提示词模板
    prompt_template=None,                   # 自定义用户提示词模板
    response_template=None,                 # 自定义响应模板

    # === 其他 ===
    use_system_prompt=True,                 # 是否使用系统提示词
)

2.3 参数详解 ​

参数类型默认值说明
rolestr必填Agent 的角色定义
goalstr必填Agent 的目标
backstorystr必填Agent 的背景故事
llmstr/LLM"gpt-4o-mini"使用的语言模型
toolslist[]可用工具列表
verboseboolFalse是否打印详细日志
allow_delegationboolTrue是否允许委托任务
max_iterint20最大迭代次数
max_rpmintNoneAPI 限流(请求/分钟)
max_retry_limitint2最大重试次数
memoryboolTrue是否启用记忆

3. Agent 设计最佳实践 ​

3.1 角色定义技巧 ​

原则:具体、专业、有区分度

python
# ❌ 太模糊
role = "开发者"

# ✅ 具体明确
role = "高级 Python 后端开发工程师,精通 FastAPI 和 PostgreSQL"

# ❌ 太宽泛
goal = "完成任务"

# ✅ 可衡量、有方向
goal = "编写符合 PEP 8 规范、包含完整类型注解和单元测试的 Python 代码"

3.2 背景故事的作用 ​

背景故事不仅仅是"装饰",它会显著影响 Agent 的行为模式:

python
# 背景故事影响写作风格
writer_formal = Agent(
    role="技术文档撰写者",
    goal="撰写技术文档",
    backstory="""你是一位严谨的技术文档工程师,有 15 年企业级软件文档经验。
你习惯使用正式的书面语,文档结构严格按照 Google 技术写作规范。"""
)

writer_casual = Agent(
    role="技术博客作者",
    goal="撰写技术博客",
    backstory="""你是一位活跃的技术博主,以深入浅出、风趣幽默的风格著称。
你擅长用类比和比喻解释复杂概念,文章经常使用表情符号和口语化表达。"""
)

3.3 避免角色重叠 ​

每个 Agent 应有清晰的职责边界,避免多个 Agent 做同样的事:

python
# ❌ 角色重叠
agent1 = Agent(role="Python 开发者", goal="写代码")
agent2 = Agent(role="程序员", goal="写 Python 代码")

# ✅ 职责分明
agent1 = Agent(role="架构师", goal="设计系统架构和技术方案")
agent2 = Agent(role="Python 开发者", goal="根据架构设计实现代码")
agent3 = Agent(role="代码审查员", goal="审查代码质量和规范")

4. 委托机制(Delegation) ​

当 allow_delegation=True 时,Agent 可以将任务委托给 Crew 中的其他 Agent。这模拟了真实团队中的协作模式。

python
from crewai import Agent, Task, Crew, Process

planner = Agent(
    role="项目经理",
    goal="制定项目计划并协调团队",
    backstory="你是一位经验丰富的项目经理,善于任务分配和进度管理。",
    allow_delegation=True  # 允许委托
)

developer = Agent(
    role="Python 开发者",
    goal="实现项目功能",
    backstory="你是一位资深 Python 开发者。",
    allow_delegation=False  # 不委托,专注执行
)

task = Task(
    description="设计并实现一个 REST API 服务",
    expected_output="完整的 API 设计文档和实现代码",
    agent=planner  # 项目经理可能会将实现部分委托给 developer
)

crew = Crew(
    agents=[planner, developer],
    tasks=[task],
    process=Process.sequential
)

何时使用委托

  • 层级模式:项目经理 → 开发者,适合 hierarchical 流程
  • 协作模式:研究员发现需要数据分析,委托给数据分析师
  • 审核模式:写手完成初稿后,委托给审稿员检查

5. 自定义 LLM ​

5.1 使用不同提供商 ​

python
from crewai import Agent, LLM

# 使用 Claude
claude_agent = Agent(
    role="分析师",
    goal="深度分析",
    backstory="资深分析师",
    llm=LLM(model="anthropic/claude-sonnet-4-20250514")
)

# 使用本地 Ollama
local_agent = Agent(
    role="代码助手",
    goal="辅助编程",
    backstory="编程助手",
    llm=LLM(model="ollama/llama3.1", base_url="http://localhost:11434")
)

# 使用 Azure OpenAI
azure_agent = Agent(
    role="助手",
    goal="完成任务",
    backstory="AI 助手",
    llm=LLM(
        model="azure/gpt-4o",
        base_url="https://my-resource.openai.azure.com/",
        api_key="your-azure-key"
    )
)

5.2 混合使用 LLM ​

不同 Agent 可以使用不同的 LLM,按任务复杂度分配资源:

python
# 复杂推理用强模型
architect = Agent(
    role="系统架构师",
    goal="设计高可用架构",
    backstory="资深架构师",
    llm=LLM(model="openai/gpt-4o")  # 强模型
)

# 简单任务用轻量模型
note_taker = Agent(
    role="会议记录员",
    goal="记录会议要点",
    backstory="高效的记录员",
    llm=LLM(model="openai/gpt-4o-mini")  # 轻量模型,成本低
)

6. 回调函数 ​

6.1 Step Callback ​

在 Agent 每执行一步(思考/行动)后触发:

python
def step_callback(step_output):
    """每次 Agent 执行一步后调用"""
    print(f"--- Step 完成 ---")
    print(f"Agent 思考: {step_output}")
    print(f"------------------")

agent = Agent(
    role="研究员",
    goal="调研",
    backstory="研究员",
    step_callback=step_callback
)

6.2 Task Callback ​

在 Task 完成后触发:

python
def task_callback(output):
    """Task 完成后调用"""
    print(f"Task 完成,输出长度: {len(str(output))} 字符")

crew = Crew(
    agents=[agent],
    tasks=[task],
    task_callback=task_callback
)

7. Human-in-the-Loop ​

通过 Task 的 human_input 参数,可以在 Agent 执行前请求人类输入:

python
from crewai import Agent, Task, Crew

agent = Agent(
    role="分析师",
    goal="分析数据并提供建议",
    backstory="资深数据分析师"
)

task = Task(
    description="分析数据并生成报告",
    expected_output="分析报告",
    agent=agent,
    human_input=True  # 执行前会暂停,等待人类输入反馈
)

crew = Crew(agents=[agent], tasks=[task])
result = crew.kickoff()

WARNING

human_input=True 会在终端中暂停并等待输入。在 Web 应用或自动化场景中需要谨慎使用。

总结 ​

知识点要点
Agent 三要素role(角色)、goal(目标)、backstory(背景)
角色设计具体、专业、有区分度
委托机制allow_delegation=True 允许 Agent 间协作
LLM 配置不同 Agent 可用不同 LLM,按需分配资源
回调机制step_callback 监控执行过程,task_callback 监控任务完成
人机协作human_input=True 在任务执行前请求人类反馈