摘要本文介绍如何使用 CrewAI 多 Agent 协作框架搭建一个「技术媒体编辑部」实现从搜索资料、分析趋势、撰写文章到审校交付的完整自动化流程。文章涵盖 CrewAI 核心组件Agents、Tasks、Tools、Crews、Flows、Anaconda 环境配置与依赖安装并附完整可运行的 Python 代码示例帮助读者快速上手多 Agent 协作开发。内容参考于图灵AI大模型全栈CrewAI它依赖很多库与我们之前的uv项目存在冲突这里使用Anaconda创建了一个新项目注意Anaconda的版本和PyCharm版本要对应好它们俩存在兼容问题这里使用的Anaconda是Anaconda3-2026.07-1版本PyCharm是2026.2.3版本都是现在最新的版本也已经上传到网盘CrewAICrewAI也是一个多Agent协作框架它的核心组件1.Agents创建多个Agent2.Tasks任务每一个Agent负责一个Tasks3.Tool工具4.Crews它是团队的意思也就是用来整合Agent5.Flows工作方式也就是控制Agent之间的执行过程如下图可以看出CrewAI它提供了Memory上下文记忆Agent里可以设置模型Agent可以调用工具每个Agent对应一个Task它没有循环只会根据我设置的流程走一遍当流程中某个环节生成的内容不好它没办法重新单独生成比如让它生成文章然后审计文章审计不同让它重新生成文章这个它做不到环境配置conda环境需要使用Python3.12版本依次执行下方两个指令即可conda create -n crewai_env python3.12 activate crewai_envCrewAI依赖pip install crewai1.6.1 crewai-tools1.6.1 tavily-python0.7.13 dotenv langchain0.3.26 langchain-openai0.3.27 langchain-core0.3.74 langchain-community0.3.27 langchain-tavily0.2.10 dashscope1.25.2业务需求这次是让Agents根据我们输入的主题完成一个文章编写的事情1.搜索相关内容2.分析搜索到的内容3.编写文章4.审核文章5.交付文章效果图代码importosfromdatetimeimportdatetimefromcrewaiimportAgent,Task,Crew,Process,LLMfromcrewai_toolsimportTavilySearchToolfromdotenvimportload_dotenv# 加载配置load_dotenv()classTechMediaCrew:简化版技术媒体编辑部def__init__(self):self.setup_qwen_model()self.search_toolTavilySearchTool(max_results2)self.setup_agents()# 设置模型defsetup_qwen_model(self):设置千问模型llmLLM(api_keyos.getenv(DASHSCOPE_API_KEY),base_urlos.getenv(DASHSCOPE_BASE_URL),modelqwen3.7-flash,temperature0.7)self.llmllm# 创建团队的人员defsetup_agents(self):设置智能体团队# 情报员 - 负责搜索和收集信息self.researcherAgent(# 人员名或者说Agent角色role技术情报员,# 任务描述也就是当前Agent要做的事情goal搜索并收集最新的技术资讯,# 系统提示词backstory你是专业的技术记者擅长找到最新最有价值的科技新闻,# 可以调用的工具tools[self.search_tool],# 大模型llmself.llm,verboseTrue,max_iter1)# 分析师 - 负责分析和总结self.analystAgent(# 人员名或者说Agent角色role数据分析师,# 任务描述也就是当前Agent要做的事情goal分析技术趋势提取关键洞察,# 系统提示词backstory你是经验丰富的数据分析师能从信息中发现重要趋势,# 大模型llmself.llm,# verboseTrue开启详细日志终端打印 Agent 思考过程verboseTrue,# max_iter1代表 Agent 最多尝试 1 次就结束遇到思考、纠错、重试场景会直接终止。# 如果文章写得不满意、需要修改就不会重试建议改成 max_iter3~5。max_iter1)# 作者 - 负责写文章self.writerAgent(# 人员名或者说Agent角色role科技作者,# 任务描述也就是当前Agent要做的事情goal写出高质量的技术文章,# 系统提示词backstory你是资深科技记者文笔优秀能把复杂技术写得通俗易懂,# 大模型llmself.llm,# verboseTrue开启详细日志终端打印 Agent 思考过程verboseTrue,# max_iter1代表 Agent 最多尝试 1 次就结束遇到思考、纠错、重试场景会直接终止。# 如果文章写得不满意、需要修改就不会重试建议改成 max_iter3~5。max_iter1)# 编辑 - 负责审校self.editorAgent(# 人员名或者说Agent角色role主编,# 任务描述也就是当前Agent要做的事情goal审校文章确保质量,# 系统提示词backstory你是严谨的主编会仔细检查文章质量和准确性,# 大模型llmself.llm,# verboseTrue开启详细日志终端打印 Agent 思考过程verboseTrue,# max_iter1代表 Agent 最多尝试 1 次就结束遇到思考、纠错、重试场景会直接终止。# 如果文章写得不满意、需要修改就不会重试建议改成 max_iter3~5。max_iter1)# 创建任务defcreate_tasks(self,topic:str):创建工作任务# 任务1: 搜索资料research_taskTask(# 任务描述# 也就是告诉Agent要搜索什么内容descriptionf搜索关于{topic}的最新信息包括 重要指令 1. 只进行 1 次全面搜索。 2. 即使搜索结果包含 Unicode 编码如 \\u4e91也直接读取不要因此重新搜索。 3. 获取到结果后立即停止并输出摘要。,# 执行任务的Agent任务和Agent做绑定每一个Agent对应一个任务agentself.researcher,# 期望返回内容告诉Agent最终应该返回 expected_output 的内容expected_output搜索到的原始信息和资料)# 任务2: 分析总结analysis_taskTask(# 任务描述# 也就是告诉Agent要从什么方面分析descriptionf分析搜索到的{topic}相关信息提供 1. 关键趋势分析 2. 重要事件总结 3. 技术影响评估 4. 未来发展预测,# 执行任务的Agent任务和Agent做绑定每一个Agent对应一个任务agentself.analyst,# 期望返回内容告诉Agent最终应该返回 expected_output 的内容expected_output详细的分析报告和关键洞察,# 上下文依赖把 research_task 作为前置任务# CrewAI 会把 research_task 的输出传给当前 analysis_task# 让 analyst 基于搜索到的原始信息进行分析context[research_task])# 任务3: 写文章writing_taskTask(# 任务描述告诉 writer 代理要写什么文章以及写作要求# 使用 f-string 动态插入 topic运行时替换成实际主题descriptionf基于分析结果写一篇关于{topic}的文章 1. 标题要吸引人 2. 内容要有逻辑性 3. 语言要通俗易懂 4. 长度800-1200字 5. 包含数据和例子,# 执行该任务的 Agent这里绑定到 self.writer# 也就是由 writer 这个代理负责撰写文章每一个Agent对应一个任务agentself.writer,# 期望输出告诉 Agent 最终应该返回“完整的技术文章”expected_output完整的技术文章,# 上下文依赖把 research_task 和 analysis_task 作为前置任务# CrewAI 会先执行这两个任务再把它们的输出作为当前 writing_task 的上下文# 让 writer 基于搜索到的原始信息和分析结果来撰写文章context[research_task,analysis_task])# 任务4: 编辑审校editing_taskTask(# 任务描述告诉 editor 代理需要从哪些方面审校文章# 这里是普通字符串不是 f-string因为不需要动态插入变量description审校文章检查 1. 事实准确性 2. 逻辑清晰度 3. 语言流畅性 4. 结构合理性 5. 标题和内容匹配度 如有问题请修改完善。,# 执行该任务的 Agent绑定到 self.editor每一个Agent对应一个任务# 也就是由 editor 这个代理负责审校、修改和润色文章agentself.editor,# 期望输出最终审校后的高质量文章# 约束 editor 最终返回的内容应该是审校完成的文章expected_output最终审校后的高质量文章,# 上下文依赖把 writing_task 作为前置任务# CrewAI 会先执行 writing_task再把 writer 写好的文章传给 editor# 让 editor 基于这篇文章进行事实、逻辑、语言、结构等方面的审校context[writing_task])# 它会根据下方从左到右的顺序来执行# research_task第一个执行# analysis_task第二个执行# writing_task第三个执行# editing_task第四个执行return[research_task,analysis_task,writing_task,editing_task]defrun_process(self,topic:str):运行完整流程print(f开始处理主题:{topic})print(-*50)# 初始化任务tasksself.create_tasks(topic)# 组建团队crewCrew(# 参与本次协作的所有 Agent# 顺序为研究员 → 分析师 → 撰稿人 → 编辑# 虽然每个 Task 已单独绑定了 Agent但 Crew 仍需知道有哪些可用 Agentagents[self.researcher,self.analyst,self.writer,self.editor],# 要执行的任务列表# tasks 通常是一个包含 research_task、analysis_task、writing_task、editing_task 的列表taskstasks,# 开启详细日志输出# 运行时会在控制台打印各 Agent 的思考、工具调用、任务进度等信息便于调试verboseTrue,# 设置任务执行流程为“顺序执行”# Process.sequential 表示按 tasks 列表中的顺序依次执行# research_task → analysis_task → writing_task → editing_task# 前一个任务完成后才会开始下一个任务确保上下文依赖正确传递processProcess.sequential,# 开启执行追踪# 用于记录整个 Crew 的运行过程如 Agent 决策、任务耗时、调用链等# 便于后续监控、调试或集成到可观测性平台如 Langfuse 等tracingTrue)# 执行任务start_timedatetime.now()try:# # 让您的团队开始工作resultcrew.kickoff()end_timedatetime.now()duration(end_time-start_time).total_seconds()print(f\n任务完成用时:{duration:.1f}秒)print(-*50)returnresultexceptExceptionase:print(f任务失败:{e})returnNonedefmain():主函数importjson# 创建编辑部media_crewTechMediaCrew()# 运行示例topics[阿里云千问模型发布qwen3,苹果Vision Pro,特斯拉自动驾驶]fortopicintopics[:1]:# 只运行一个示例print(f技术媒体编辑部 -{topic})print(*60)resultmedia_crew.run_process(topic)ifresult:print(f\n最终文章:\n{result})if__name____main__:main()