crewAI Flows 企业级编排:事件驱动、状态持久与精确控制
本文基于 crewAI v1.11.0,深度解析 Flows 框架的事件驱动机制、状态持久化能力和与 Crews 的协同模式。
一、为什么需要 Flows:当 Crews 不够用的时候
Crews 模式非常适合"给一个问题,让 AI 团队自己解决"的场景——探索性强、结果开放、过程动态。但在企业级生产环境中,这种自主性有时反而是问题:
- 不可预测性:Agent 自主决策会产生结果的不确定性
- 无法处理复杂业务逻辑:条件分支、循环、错误处理很难通过 Agent 对话实现
- 状态管理困难:长时间运行的工作流需要在步骤之间持久化状态
- 缺少精细控制点:无法在特定步骤前后插入人工审核、外部系统调用等
Flows 就是为了解决这些问题而生。它的定位是:
用代码控制工作流的骨架,用 AI(Crews)填充智能的血肉。
二、Flows 的核心概念
2.1 基础结构
一个 Flow 是一个继承Flow基类的 Python 类,每个方法代表一个工作流步骤:
fromcrewai.flow.flowimportFlow,listen,start,routerclassContentProductionFlow(Flow):@start()defresearch_phase(self):"""工作流入口:研究阶段"""# 执行研究 Crew 或其他逻辑return"research_complete"@listen(research_phase)defwriting_phase(self,research_result):"""监听 research_phase 完成事件,触发写作阶段"""return"draft_complete"@listen(writing_phase)defreview_phase(self,draft):"""监听写作完成,触发审核"""return"final_article"2.2 三大核心装饰器
@start():工作流入口
@start()definitialize(self):"""Flow 的起始点,可以有多个 @start 方法(并行启动)"""self.state.topic="crewAI 企业级应用"returnself.state.topic@listen():事件订阅
# 监听单个方法完成@listen(initialize)defstep_a(self,input):return"a_done"# 使用 OR 逻辑:任意一个完成即触发fromcrewai.flow.flowimportor_@listen(or_(step_a,step_b))defstep_c(self):return"c_done"# 使用 AND 逻辑:所有完成才触发fromcrewai.flow.flowimportand_@listen(and_(step_a,step_b))defstep_d(self):return"d_done"@router():条件路由
@router(analyze_step)defdecide_direction(self):"""根据分析结果决定执行哪条分支"""ifself.state.quality_score>0.8:return"high_quality"elifself.state.quality_score>0.5:return"medium_quality"else:return"low_quality"@listen("high_quality")defpublish_immediately(self):print("质量优秀,直接发布")@listen("medium_quality")defreview_and_publish(self):print("需要人工审核")@listen("low_quality")defreject_and_retry(self):print("质量不达标,重新生成")三、状态管理:跨步骤的数据共享
Flow 中的所有方法共享同一个state对象,这是跨步骤传递数据的核心机制。
3.1 非结构化状态(快速原型)
fromcrewai.flow.flowimportFlow,start,listenclassSimpleFlow(Flow):@start()defstep_one(self):# state 是一个字典,可以动态添加任意键self.state['topic']="crewAI"self.state['research_results']=[]self.state['word_count']=0@listen(step_one)defstep_two(self):# 读取上一步存储的状态topic=self.state['topic']# 更新状态self.state['word_count']=15003.2 结构化状态(生产推荐)
frompydanticimportBaseModelfromtypingimportList,Optionalfromcrewai.flow.flowimportFlow,start,listenclassArticleState(BaseModel):"""工作流状态定义,Pydantic 提供类型安全"""topic:str=""keywords:List[str]=[]research_summary:str=""draft_content:str=""quality_score:float=0.0is_published:bool=Falserevision_count:int=0classArticleProductionFlow(Flow[ArticleState]):# 泛型参数指定状态类型@start()definitialize(self):# IDE 有类型提示,self.state.topic 是 str 类型self.state.topic="crewAI 企业级部署最佳实践"print(f"开始处理主题:{self.state.topic}")@listen(initialize)defresearch(self):# 调用研究 Crew(后面详细介绍)results=research_crew.kickoff(inputs={"topic":self.state.topic})self.state.research_summary=results.raw self.state.keywords=extract_keywords(results.raw)@listen(research)defwrite(self):draft=writing_crew.kickoff(inputs={"topic":self.state.topic,"keywords":self.state.keywords,"research":self.state.research_summary})self.state.draft_content=draft.raw@listen(write)defevaluate_quality(self):score=quality_checker.check(self.state.draft_content)self.state.quality_score=score@router(evaluate_quality)defroute_by_quality(self):ifself.state.quality_score>=0.85:return"publish"elifself.state.revision_count<3:return"revise"else:return"escalate"@listen("publish")defpublish(self):publish_to_cms(self.state.draft_content)self.state.is_published=Trueprint(f"文章已发布!质量评分:{self.state.quality_score}")@listen("revise")defrevise(self):self.state.revision_count+=1print(f"第{self.state.revision_count}次修订...")# 重新进入写作步骤(循环)self.write()@listen("escalate")defescalate_to_human(self):send_alert(f"文章质量持续不达标,需要人工介入。当前评分:{self.state.quality_score}")# 启动 Flowflow=ArticleProductionFlow()flow.kickoff()四、状态持久化与断点恢复
企业级工作流的一个关键需求是:长时间运行的工作流在中途失败后能够从断点继续,而不是从头重做。
4.1 启用状态持久化
fromcrewai.flow.flowimportFlow,start,listen,persistclassLongRunningFlow(Flow[MyState]):@start()@persist# 该步骤完成后自动持久化状态defexpensive_research(self):# 这个步骤可能需要几分钟,持久化后即使崩溃也不用重做result=long_research_process()self.state.research_data=result@listen(expensive_research)@persistdefexpensive_analysis(self):result=long_analysis_process(self.state.research_data)self.state.analysis_result=result4.2 从指定状态恢复
# 首次运行flow=LongRunningFlow()result=flow.kickoff()# 如果 expensive_research 已完成但 expensive_analysis 崩溃了# 可以从保存的状态恢复,跳过已完成的步骤flow_id=flow.state.id# 每个 Flow 实例有唯一 ID# 恢复运行flow=LongRunningFlow()flow.kickoff(state_id=flow_id)# 自动从上次中断点继续五、在 Flow 中嵌套 Crew:混合模式的精髓
这是 crewAI 最强大的设计之一:Flow 提供确定性的业务流程骨架,Crew 在需要 AI 智能的节点填充自主执行能力。
fromcrewaiimportCrew,Agent,Task,Processfromcrewai.flow.flowimportFlow,start,listen,routerfrompydanticimportBaseModel# ─── 定义各阶段 Crew ───────────────────────────────defcreate_research_crew(topic:str)->Crew:researcher=Agent(role="研究员",goal=f"深度研究{topic}的最新发展",backstory="...",tools=[SerperDevTool()])task=Task(description=f"全面研究{topic},输出结构化报告",expected_output="包含关键发现的研究报告(Markdown格式)",agent=researcher)returnCrew(agents=[researcher],tasks=[task],process=Process.sequential)defcreate_writing_crew(topic:str,research:str)->Crew:writer=Agent(role="技术写作者",goal="...",backstory="...")editor=Agent(role="技术编辑",goal="...",backstory="...")write_task=Task(description="基于研究成果撰写技术文章",agent=writer)edit_task=Task(description="审核并优化文章质量",agent=editor,context=[write_task])returnCrew(agents=[writer,editor],tasks=[write_task,edit_task],process=Process.sequential)# ─── Flow 骨架 ─────────────────────────────────────classContentState(BaseModel):topic:str=""research:str=""article:str=""approved:bool=FalseclassContentFlow(Flow[ContentState]):@start()defset_topic(self):self.state.topic="crewAI v1.11.0 新特性"@listen(set_topic)defdo_research(self):"""在 Flow 步骤中调用 Crew"""crew=create_research_crew(self.state.topic)result=crew.kickoff()self.state.research=result.raw@listen(do_research)defdo_writing(self):"""另一个 Crew 处理写作"""crew=create_writing_crew(self.state.topic,self.state.research)result=crew.kickoff()self.state.article=result.raw@listen(do_writing)defhuman_review(self):"""人机回环:等待人工审核"""print("\n=== 文章已生成,等待人工审核 ===")print(f"主题:{self.state.topic}")print(f"摘要:{self.state.article[:200]}...")# 在实际系统中,这里可能是发送到审核系统并等待回调approval=input("是否批准发布?(y/n): ")self.state.approved=approval.lower()=='y'@router(human_review)defroute_after_review(self):return"approved"ifself.state.approvedelse"rejected"@listen("approved")defpublish(self):publish_to_platform(self.state.article)print("✅ 发布成功!")@listen("rejected")defhandle_rejection(self):print("❌ 审核未通过,需要重新生成")# 可以重新触发写作流程self.do_writing()# 运行flow=ContentFlow()flow.kickoff()六、Flow 的可视化:理解执行图
crewAI 提供了 Flow 可视化功能,将执行图渲染为 HTML:
flow=ContentFlow()flow.plot("content_flow_diagram")# 生成 content_flow_diagram.html,在浏览器中可视化查看执行图执行图会展示:
- 每个步骤(节点)
- 依赖关系(边)
- 条件路由分支
- 并行执行路径
七、实际选择:何时用 Flow,何时用 Crew
需要确定性业务流程? ├── 是 ──► Flow │ │ │ ▼ │ 某些步骤需要AI自主处理? │ ├── 是 ──► Flow + Crew(混合模式) │ └── 否 ──► 纯 Flow(Python 逻辑) │ └── 否 ──► Crew 即可 │ ▼ 需要质量监控和动态分配? ├── 是 ──► Crew(Hierarchical) └── 否 ──► Crew(Sequential)八、小结
Flows 是 crewAI 从"AI 工具"进化为"企业级平台"的关键一步。它不是 Crews 的替代品,而是互补品:
- Crews处理"如何思考"——给 AI 足够的自主权去解决复杂问题
- Flows处理"如何控制"——给工程师足够的确定性来管理业务流程
在生产环境中,最有价值的通常是两者的混合:Flow 定义业务流程的确定性骨架,在需要 AI 智能的节点嵌入 Crew,在需要人工决策的节点设置 HITL 回路。
系列导航
- 上一篇:crewAI 顺序与层级流程:Sequential vs Hierarchical 决策矩阵
- 下一篇:crewAI 流程可视化与调试:执行链路追踪与性能剖析
基于 crewAI v1.11.0 官方文档,撰写于 2026 年 3 月