Agent 详解 #

Agent 概述 #

在 CrewAI 框架中,Agent 是一个自主单元,能够:

  • 执行特定任务
  • 根据角色和目标做出决策
  • 使用工具完成任务
  • 与其他 Agent 通信和协作
  • 维护交互记忆
  • 在允许时委托任务

Agent 属性 #

核心属性 #

属性 类型 描述
role str 定义 Agent 在团队中的角色和专业领域
goal str 指导 Agent 决策的个人目标
backstory str 为 Agent 提供背景和性格,丰富交互

能力属性 #

属性 类型 默认值 描述
llm Union[str, LLM, Any] “gpt-4” Agent 使用的语言模型
tools List[BaseTool] [] Agent 可用的工具列表
function_calling_llm Optional[Any] None 工具调用的 LLM,覆盖 Crew 的设置

执行属性 #

属性 类型 默认值 描述
max_iter int 20 提供最佳答案前的最大迭代次数
max_rpm Optional[int] None 每分钟最大请求数,避免限流
max_execution_time Optional[int] None 任务执行的最大时间(秒)
max_retry_limit int 2 发生错误时的最大重试次数
verbose bool False 是否启用详细执行日志

协作属性 #

属性 类型 默认值 描述
allow_delegation bool False 是否允许委托任务给其他 Agent
step_callback Optional[Any] None 每个 Agent 步骤后调用的函数

高级属性 #

属性 类型 默认值 描述
memory bool False 是否启用记忆功能
cache bool True 是否启用工具使用缓存
allow_code_execution bool False 是否允许代码执行
code_execution_mode Literal[“safe”, “unsafe”] “safe” 代码执行模式
multimodal bool False 是否支持多模态能力
reasoning bool False 是否在执行前进行推理和规划

创建 Agent #

方式一:直接代码定义 #

python
from crewai import Agent
from crewai_tools import SerperDevTool

search_tool = SerperDevTool()

agent = Agent(
    role="高级数据科学家",
    goal="分析和解释复杂数据集,提供可操作的洞察",
    backstory="""拥有 10 年数据科学和机器学习经验,
    你擅长在复杂数据集中发现模式。""",
    llm="gpt-4o",
    tools=[search_tool],
    verbose=True,
    max_iter=25,
    allow_delegation=False
)

方式二:YAML 配置(推荐) #

yaml
# config/agents.yaml
researcher:
  role: >
    {topic} 高级研究分析师
  goal: >
    发现 {topic} 的前沿趋势和发展
  backstory: >
    你是一位经验丰富的研究分析师,
    擅长发现最新的技术趋势。
    你以能够找到最相关的信息
    并以清晰简洁的方式呈现而闻名。

reporting_analyst:
  role: >
    {topic} 报告分析师
  goal: >
    根据数据分析创建详细报告
  backstory: >
    你是一位细致入微的分析师,
    具有敏锐的洞察力。
    你擅长将复杂数据转化为清晰的报告。
python
# crew.py
from crewai import Agent
from crewai.project import CrewBase, agent

@CrewBase
class MyCrew:
    agents_config = 'config/agents.yaml'

    @agent
    def researcher(self) -> Agent:
        return Agent(
            config=self.agents_config['researcher'],
            verbose=True
        )

    @agent
    def reporting_analyst(self) -> Agent:
        return Agent(
            config=self.agents_config['reporting_analyst'],
            verbose=True
        )

Agent 类型示例 #

研究分析 Agent #

python
from crewai import Agent
from crewai_tools import SerperDevTool, WebsiteSearchTool

search_tool = SerperDevTool()
web_rag_tool = WebsiteSearchTool()

researcher = Agent(
    role="市场研究分析师",
    goal="提供 AI 行业的最新市场分析",
    backstory="一位对市场趋势有敏锐眼光的专家分析师。",
    tools=[search_tool, web_rag_tool],
    verbose=True
)

代码开发 Agent #

python
from crewai import Agent

dev_agent = Agent(
    role="高级 Python 开发者",
    goal="编写和调试 Python 代码",
    backstory="拥有 10 年经验的 Python 开发专家",
    allow_code_execution=True,
    code_execution_mode="safe",
    max_execution_time=300,
    max_retry_limit=3
)

数据分析 Agent #

python
from crewai import Agent

analysis_agent = Agent(
    role="数据分析师",
    goal="对大型数据集进行深度分析",
    backstory="专注于大数据分析和模式识别",
    memory=True,
    respect_context_window=True,
    max_rpm=10,
    function_calling_llm="gpt-4o-mini"
)

自定义模板 Agent #

python
from crewai import Agent

custom_agent = Agent(
    role="客户服务代表",
    goal="协助客户处理咨询",
    backstory="专注于客户满意度的客服专家",
    system_template="""<|start_header_id|>system<|end_header_id|>
                        {{ .System }}<|eot_id|>""",
    prompt_template="""<|start_header_id|>user<|end_header_id|>
                        {{ .Prompt }}<|eot_id|>""",
    response_template="""<|start_header_id|>assistant<|end_header_id|>
                        {{ .Response }}<|eot_id|>"""
)

推理规划 Agent #

python
from crewai import Agent

reasoning_agent = Agent(
    role="战略规划师",
    goal="分析复杂问题并创建详细执行计划",
    backstory="擅长系统分解复杂挑战的战略规划专家",
    reasoning=True,
    max_reasoning_attempts=3,
    max_iter=30,
    verbose=True
)

多模态 Agent #

python
from crewai import Agent

multimodal_agent = Agent(
    role="视觉内容分析师",
    goal="分析和处理文本及视觉内容",
    backstory="专注于结合文本和图像理解的多模态分析专家",
    multimodal=True,
    verbose=True
)

日期感知 Agent #

python
from crewai import Agent

strategic_agent = Agent(
    role="市场分析师",
    goal="跟踪市场动态并提供精确的日期参考和战略规划",
    backstory="时间敏感的金融分析和战略报告专家",
    inject_date=True,
    date_format="%B %d, %Y",
    reasoning=True,
    max_reasoning_attempts=2,
    verbose=True
)

Agent 工具 #

添加工具 #

python
from crewai import Agent
from crewai_tools import SerperDevTool, WikipediaTools

search_tool = SerperDevTool()
wiki_tool = WikipediaTools()

researcher = Agent(
    role="AI 技术研究员",
    goal="研究最新的 AI 发展",
    tools=[search_tool, wiki_tool],
    verbose=True
)

工具类型 #

text
┌─────────────────────────────────────────────────────────────┐
│                    Agent 工具类型                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  搜索工具:                                                   │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ SerperDevTool     - 网络搜索                         │   │
│  │ WebsiteSearchTool - 网站内容搜索                     │   │
│  │ EXASearchTool     - 高级搜索                         │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  文件工具:                                                   │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ FileReadTool      - 文件读取                         │   │
│  │ DirectoryReadTool - 目录读取                         │   │
│  │ PDFSearchTool     - PDF 搜索                         │   │
│  │ CSVSearchTool     - CSV 搜索                         │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  代码工具:                                                   │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ CodeInterpreterTool - 代码解释执行                   │   │
│  │ CodeDocsSearchTool  - 代码文档搜索                   │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  自定义工具:                                                 │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ 使用 @tool 装饰器创建                                │   │
│  │ 继承 BaseTool 类创建                                 │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

Agent 记忆与上下文 #

启用记忆 #

python
from crewai import Agent

analyst = Agent(
    role="数据分析师",
    goal="分析和记住复杂数据模式",
    memory=True,
    verbose=True
)

上下文窗口管理 #

python
# 自动处理上下文限制(推荐)
smart_agent = Agent(
    role="研究分析师",
    goal="分析大型文档和数据集",
    backstory="处理大量信息的专家",
    respect_context_window=True,
    verbose=True
)

# 严格上下文限制
strict_agent = Agent(
    role="法律文档审查员",
    goal="提供精确的法律分析",
    backstory="需要完整上下文的法律专家",
    respect_context_window=False,
    verbose=True
)

知识源 #

python
from crewai import Agent
from crewai.knowledge.source.string_knowledge_source import StringKnowledgeSource

knowledge = StringKnowledgeSource(
    content="你的知识库内容..."
)

agent = Agent(
    role="知识专家",
    goal="使用知识库回答问题",
    backstory="专注于利用结构化知识源",
    knowledge_sources=[knowledge],
    verbose=True
)

Agent 代码执行 #

安全模式(推荐) #

python
from crewai import Agent

safe_agent = Agent(
    role="代码分析师",
    goal="分析和执行代码",
    backstory="安全代码执行专家",
    allow_code_execution=True,
    code_execution_mode="safe",
    max_execution_time=300
)

不安全模式 #

python
from crewai import Agent

unsafe_agent = Agent(
    role="代码执行器",
    goal="直接执行代码",
    backstory="受信任环境中的代码执行",
    allow_code_execution=True,
    code_execution_mode="unsafe"
)

直接与 Agent 交互 #

使用 kickoff() #

python
from crewai import Agent
from crewai_tools import SerperDevTool

researcher = Agent(
    role="AI 技术研究员",
    goal="研究最新的 AI 发展",
    tools=[SerperDevTool()],
    verbose=True
)

result = researcher.kickoff("语言模型的最新发展是什么?")
print(result.raw)

结构化输出 #

python
from pydantic import BaseModel
from typing import List

class ResearchFindings(BaseModel):
    main_points: List[str]
    key_technologies: List[str]
    future_predictions: str

result = researcher.kickoff(
    "总结 2025 年 AI 的最新发展",
    response_format=ResearchFindings
)

print(result.pydantic.main_points)
print(result.pydantic.future_predictions)

多轮对话 #

python
messages = [
    {"role": "user", "content": "我需要关于大语言模型的信息"},
    {"role": "assistant", "content": "我很乐意帮助!您想了解什么?"},
    {"role": "user", "content": "2025 年的最新发展是什么?"}
]

result = researcher.kickoff(messages)

异步执行 #

python
import asyncio

async def main():
    result = await researcher.kickoff_async("AI 的最新发展是什么?")
    print(result.raw)

asyncio.run(main())

Agent 协作 #

允许委托 #

python
from crewai import Agent

manager = Agent(
    role="项目经理",
    goal="协调团队完成任务",
    backstory="经验丰富的项目经理",
    allow_delegation=True,
    verbose=True
)

specialist = Agent(
    role="技术专家",
    goal="解决技术问题",
    backstory="资深技术专家",
    verbose=True
)

协作模式 #

text
┌─────────────────────────────────────────────────────────────┐
│                    Agent 协作模式                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  顺序协作:                                                   │
│  Agent1 -> Agent2 -> Agent3                                 │
│                                                             │
│  层级协作:                                                   │
│       Manager Agent                                          │
│       /     |     \                                         │
│   Agent1  Agent2  Agent3                                    │
│                                                             │
│  委托协作:                                                   │
│  Agent1 --委托--> Agent2                                    │
│       \              |                                      │
│        \            /                                       │
│         <--结果返回--                                        │
│                                                             │
└─────────────────────────────────────────────────────────────┘

Agent 最佳实践 #

1. 角色设计 #

python
# 好的设计:具体、专业
good_agent = Agent(
    role="医疗数据分析师",
    goal="分析医疗数据,发现疾病模式",
    backstory="""你是一位拥有 15 年经验的医疗数据分析师,
    专注于流行病学和疾病预测。你擅长从复杂的医疗数据中
    发现隐藏的模式和趋势。"""
)

# 不好的设计:模糊、通用
bad_agent = Agent(
    role="分析师",
    goal="分析数据",
    backstory="我是一个分析师"
)

2. 工具选择 #

python
# 根据任务选择合适的工具
research_agent = Agent(
    role="研究员",
    tools=[SerperDevTool(), WikipediaTools()],
    verbose=True
)

file_agent = Agent(
    role="文档分析师",
    tools=[FileReadTool(), PDFSearchTool(), DirectoryReadTool()],
    verbose=True
)

code_agent = Agent(
    role="开发者",
    tools=[CodeInterpreterTool()],
    allow_code_execution=True,
    verbose=True
)

3. 性能优化 #

python
# 限制迭代次数
agent = Agent(
    role="分析师",
    goal="快速分析",
    max_iter=15,
    max_rpm=30,
    cache=True
)

# 使用更便宜的模型进行工具调用
agent = Agent(
    role="分析师",
    llm="gpt-4o",
    function_calling_llm="gpt-4o-mini"
)

4. 错误处理 #

python
agent = Agent(
    role="分析师",
    goal="分析数据",
    max_retry_limit=3,
    max_execution_time=300,
    verbose=True
)

常见问题排查 #

速率限制 #

python
# 设置速率限制
agent = Agent(
    role="分析师",
    max_rpm=10,
    cache=True
)

上下文限制 #

python
# 启用上下文窗口管理
agent = Agent(
    role="分析师",
    respect_context_window=True
)

代码执行问题 #

python
# 确保 Docker 已安装(安全模式)
agent = Agent(
    role="开发者",
    allow_code_execution=True,
    code_execution_mode="safe"
)

下一步 #

现在你已经深入了解了 Agent,接下来学习 Task 详解,掌握任务的定义和执行!

最后更新:2026-04-04