三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

AI Agent白手起家74: CrewAI 核心组件详解——从智能体到知识库

AI Agent白手起家74: CrewAI 核心组件详解——从智能体到知识库

纲要

  • 组件概览:AgentTaskCrewFlowKnowledgeMemory
  • Agent:团队中的最小执行单元
    • YAML 配置化定义
    • 纯代码定义
    • 运行代码与工具集成
  • Task:智能体的工作任务
    • 配置与依赖关系
    • 结构化输出
  • Crew:组建专业团队
    • 配置式与代码式两种风格
    • 启动与输出
  • Flow:编排多个团队
    • 基于修饰符的事件驱动
    • 状态管理
  • 知识库与记忆
    • 文本和 URL 加载
    • 嵌入模型切换
    • 短期、长期、实体、情境记忆
  • 完整可运行示例:一个带搜索和报告的团队
  • 总结与相关度说明

组件概览

CrewAI的整个框架围绕六个核心组件展开,它们的分工和层级关系如下表所示:

组件角色类比
Agent执行具体工作的个体员工
Task分配给 Agent 的工作项任务单
Crew管理 Agent 和 Task 的团队小组
Flow编排多个 Crew 的流水线部门协作流程
Knowledge外挂知识库(RAG)参考资料库
Memory短期/长期/实体/情境记忆工作笔记

理解这些组件后,你就能像搭积木一样组装出复杂的多智能体应用。

Agent:团队中的最小执行单元

AgentCrewAI的原子单元,每个Agent拥有独立的角色、目标、背景故事,可以绑定工具、记忆和特定的大语言模型。CrewAI提供了两种定义方式:YAML 配置和纯代码。

YAML 配置式定义

src/config/agents.yaml中声明:

researcher:role:"高级数据研究员"goal:"发掘某一话题领域的前沿发展"backstory:"你是一名经验丰富的研究员,擅长发现最新信息并以清晰简洁的方式呈现。"reporting_analyst:role:"报告分析师"goal:"基于数据分析和研究发现创建详细报告"backstory:"你是一位一丝不苟的分析师,能够将复杂数据转化为清晰简洁的报告。"

代码中通过@agent修饰符引用:

fromcrewaiimportAgent,Crew,Task,Processfromcrewai.projectimportCrewBase,agent,task,crew@CrewBaseclassMyCrew:@agentdefresearcher(self)->Agent:returnAgent(config=self.agents_config['researcher'],verbose=True,tools=[search_tool]# 可选:绑定搜索工具)@agentdefreporting_analyst(self)->Agent:returnAgent(config=self.agents_config['reporting_analyst'],verbose=True)

纯代码定义

不使用配置文件,直接在代码中传参:

agent=Agent(role="资深Python开发者",goal="编写高质量、安全的Python代码",backstory="你有十年Python开发经验,熟悉安全编码规范。",allow_code_execution=True,# 允许执行代码code_execution_mode="safe",# 安全沙箱模式tools=[my_tool],memory=True,verbose=True)

两种方式等价,配置式更适合规范化项目,代码式更灵活。

Task:智能体的工作任务

每个Task描述一个具体的工作项,支持依赖关系和结构化输出。

YAML 配置式定义

tasks.yaml中声明:

research_task:description:"对{topic}进行深入研究,找出有趣且相关的信息。当前年份是2025年。"expected_output:"包含10个要点的列表,列出关于{topic}的相关信息"agent:researcherreporting_task:description:"基于研究结果创建一份详细报告。"expected_output:"一份完整的Markdown报告"agent:reporting_analystoutput_file:"report.md"context:[research_task]# 依赖 research_task 完成后执行

代码中引用:

@taskdefresearch_task(self)->Task:returnTask(config=self.tasks_config['research_task'])@taskdefreporting_task(self)->Task:returnTask(config=self.tasks_config['reporting_task'])

结构化输出

Task支持output_pydanticoutput_json来强制指定输出格式:

frompydanticimportBaseModelclassBlogPost(BaseModel):title:strcontent:strblog_task=Task(description="写一篇关于多智能体架构的博客",agent=writer,expected_output="结构化的博客文章",output_pydantic=BlogPost)

执行后,task.output.pydantic将返回一个BlogPost实例。

Crew:组建专业团队

CrewAgentTask组合成一个可执行的工作单元,并指定执行策略(顺序或层次化)。

配置式组合

@crewdefcrew(self)->Crew:returnCrew(agents=[self.researcher(),self.reporting_analyst()],tasks=[self.research_task(),self.reporting_task()],process=Process.sequential,# 顺序执行verbose=True,memory=True,# 开启记忆knowledge_sources=[...]# 挂载知识库)

代码式组合

不依赖配置文件:

crew=Crew(agents=[agent1,agent2],tasks=[task1,task2],process=Process.sequential,verbose=True)result=crew.kickoff()print(result)

Flow:编排多个团队

Flow用于串联多个Crew,形成更复杂的业务流程。它基于事件和修饰符驱动,类似LangGraph的图结构。

fromcrewai.flowimportFlow,start,listenclassCityFactFlow(Flow):@start()defgenerate_city(self):city="北京"# 模拟随机生成self.state["city"]=cityreturncity@listen(generate_city)defgenerate_fact(self,city):# 根据城市生成有趣事实returnf"{city}是中国的首都,拥有超过3000年的历史。"flow=CityFactFlow()result=flow.kickoff()

@start标记入口节点,@listen标记监听其他节点的输出,自动建立依赖。

知识库与记忆

知识库

CrewAI将 RAG 封装为高级接口,支持文本字符串和 URL 两种源。

fromcrewai.knowledge.source.string_knowledge_sourceimportStringKnowledgeSource content="Tommy住在北京,今年25岁。"source=StringKnowledgeSource(content=content)crew=Crew(agents=[qa_agent],tasks=[qa_task],knowledge_sources=[source],embedder={"provider":"openai","config":{"model":"text-embedding-3-small","api_key":"your-api-key"}})result=crew.kickoff()

URL 源类似,使用CrewDoclingSource并传入 URL 列表。注意默认嵌入模型为 OpenAI,如需使用其他模型(如 Ollama),须修改embedder配置。

记忆

Crew中开启memory=True即可激活四种记忆类型:

记忆类型作用
短期记忆当前对话上下文
长期记忆跨会话持久化存储
实体记忆自动抽取人物、地点等实体
情境记忆维护交互的连贯性

底层存储可通过memory_config配置,例如使用 SQLite 存储长期记忆。

完整可运行示例:带搜索的研究团队

下面构建一个完整的“新闻研究助手”团队,它先搜索最新动态,再生成分析报告。

环境准备

pipinstallcrewai crewai-tools python-dotenv

.env配置

OPENAI_API_KEY=sk-xxxx SERPAPI_API_KEY=your-serpapi-key

代码research_crew.py

importosfromdotenvimportload_dotenvfromcrewaiimportAgent,Task,Crew,Processfromcrewai_toolsimportSerperDevTool load_dotenv()# 1. 搜索工具search_tool=SerperDevTool()# 2. 定义 Agentresearcher=Agent(role="信息检索专家",goal="查找关于指定主题的最新新闻和信息",backstory="你擅长使用搜索引擎,能快速找到高质量的信息来源。",tools=[search_tool],verbose=True,allow_delegation=False)analyst=Agent(role="分析报告撰写人",goal="基于搜索到的信息,撰写一份专业分析报告",backstory="你善于提炼关键信息,并用清晰的结构呈现。",verbose=True,allow_delegation=False)# 3. 定义 Tasksearch_task=Task(description="搜索关于'{topic}'的最新动态,找到至少5条相关信息。",agent=researcher,expected_output="包含5条以上新闻标题和摘要的列表")write_task=Task(description="根据搜索到的信息,写一份关于'{topic}'的300字分析报告。",agent=analyst,expected_output="一份结构完整的分析报告",context=[search_task])# 4. 组建团队crew=Crew(agents=[researcher,analyst],tasks=[search_task,write_task],process=Process.sequential,verbose=True)# 5. 执行result=crew.kickoff(inputs={"topic":"2024人工智能发展趋势"})print("\n===== 最终输出 =====\n")print(result)

执行python research_crew.py,控制台会依次展示搜索和报告生成的过程,最终输出一份分析报告。

总结

CrewAI通过高度封装的组件体系,将多智能体开发简化为“配置角色、分配任务、组建团队、编排流程”四个步骤。与LangGraph相比,它的学习曲线更平滑,特别适合快速构建原型和业务流程自动化。但当需要深度定制底层行为时,LangGraph的细粒度控制仍是不可替代的。两者可以互补使用。

本文覆盖了 CrewAI 的 Agent、Task、Crew、Flow、知识库、记忆等所有核心组件,包括 YAML 配置与代码定义两种方式、结构化输出、依赖关系、嵌入模型切换等技术要点,并提供了示例代码。

← 返回列表