Agentic Workflow: AI智能体工作流的 4 大机制, crewAI源码案例解析
吴恩达几个月前那场关于Agentic Workflow的演讲,在圈子里掀起了不小的波澜。国内解读的文章不少,但大多只抓了皮毛,读起来总觉得差了那么一口气。正好最近 crewAI 这个项目在海外社区热度很高,就借着源码和它官方的设计思路,把这场演讲的精华重新捋一遍——当然,也参考了国外博主 squareofdai 那篇更全面的转述。
Agentic Workflow:不只是“一条线”
“在工作流的每一个步骤,会涉及到不同的执行任务,每个执行任务对应的不同模型(有些是大语言模型,有些是垂直应用模型)和工具来完成。每一步的模型和工具可能都不一样,最终把这一系列的步骤串联起来,形成一条整合了多个工具和步骤的端到端工作流。”
我们过去用大模型,大多是“zero-shot”模式——输入一句话,直接等输出。比如让模型“写一篇关于X主题的文章大纲”,它啪一下就给出来了,背后全靠模型自身的推理能力。但有了Workflow之后,逻辑就变了。输入的内容会进入一个循环:模型可能会先反问一句“需要联网搜索吗?”,然后把用户指令拆成“写草稿→检查→润色”几个步骤,每一步的结果再作为下一步的输入,形成一个不断“修正→迭代”的闭环。
吴恩达专门总结了Agent设计的四种模式。严格来说,这是针对Agent的模式,但把它们串联起来,就构成了一个完整的Workflow:
- Reflection - 自我反思
- Tool Use - 工具调用
- Planning - 规划设计
- Multi-agent collaboration - 多智能体协同
效果如何?Andrew Ng的团队做过一个测试。针对“给定一个非空的整数列表,返回所有偶数位置元素的和”这个问题,GPT-4 和 GPT-3.5 在 zero-shot 模式下,准确率分别是 67% 和 48%。但给 GPT-3.5 加上一个“intervenor”的多智能体机制,再配合一个ANPL交互编程系统的Tool Use,结果直接飙到了 70% 以上——比 zero-shot 的 GPT-4 还好。
所以吴恩达自己也在演讲里说了大实话:在 GPT-5 或 Claude 4 出来之前,你完全可以通过 Agentic Workflow,让手头的 GPT-4、GPT-3.5 这些“老将”也能达到接近新模型的效果。
四种模式的深度拆解
Reflection:自我纠错
让模型自己反思自己纠正,听起来有点玄学。一般的做法是再加一个Agent专门负责“挑刺”。比如左边一个Agent负责写代码,右边再安排一个Agent负责检查,它的提示词可以设置为:“仔细检查代码的正确性、风格和效率,并给出建设性的批评意见,以改进代码。” 这个审查Agent的输入,就是写代码Agent的输出。一攻一守,配合默契。
Tool Use:最核心的能力扩展
这个概念最好理解,就是给大模型装“外设”——接入谷歌搜索API、邮箱API、画图API等等。就像之前梳理过的16个AI Workflow自动化平台,每个产品支持的Tool类型都不太一样。有的支持用户自己接入API,灵活性很高;有的只能使用平台预置的工具。国外产品因为生态完善,支持的API种类非常全。相比之下,国内这块还处在初期阶段,缺少真正好用的实用工具。
Planning:让AI自己写工作流
这一步其实就是训练大模型根据用户需求,把任务拆解成多个子步骤,再根据各个模型和工具的特点,为每个子步骤指定最合适的模型。举个例子:给AI一张样例照片,让它生成一个穿着类似姿势的女孩在看书的图片,并用语音描述出来。拆解的步骤就变成了:姿势判断(用OpenPose模型)→ 根据姿势生成图像(用Google/ViT模型)→ 图像转文字描述(ViT-GPT2模型)→ 最后把文本朗读出来(FastSpeech模型)。整个链条里,每一步用的模型都不一样。
Multi-agent collaboration:多角色协作
安排多个Agent一起工作,每个承担不同的角色。就像Reflection模式里提到的“Coder”和“Critic”,一个负责生成,一个负责检查改进。当然,这个模式有一个核心难点:必须清晰划分每个Agent的角色和职责,让协作有序、不冲突。一旦角色定义模糊,就会出现互相干扰的情况。
另外,吴恩达在演讲中也提到了一个趋势:更大的上下文窗口(Token数)、更快的Token处理速度、以及更长的文本处理质量,这些都会直接提升Agent的表现。最近看了月之暗面创始人的访谈,他们在2023年3、4月时就已经押注在长文本能力上了,今年Kimi确实成了国产LLM里最好用的产品之一。
个人常用的AI写作Workflow
- 网络搜索所有相关主题素材 —— Perplexity、Metaso
- 整理、筛选,根据自身认知补充内容 —— ChatGPT-4、Llama 3
- SEO优化标题、优化表达、剔除错别字 —— ChatGPT-4
crewAI:从理论到代码的实践
之所以选择crewAI,是因为在之前调研的11个最受欢迎的开源Agent项目中(包括AutoGPT、MetaGPT、AutoGen等),它的上手门槛最低。更重要的是,它的设计机制刚好和吴恩达提出的四个Pattern一一对应。从代码层面实操一遍,很多抽象概念一下就清晰了。
有人说蚂蚁金融的agentUniverse也不错,但实际看下来,它的学习曲线并不友好:一个Agent既要写YAML配置文件,又要建一个Python文件,多几个Agent就得建一堆文件。相比之下,crewAI的设计思路要简洁得多。
目前crewAI的Star数已经达到了14.6k,是国外最近一两个月最火的开源项目之一。下面就用它创建一个支持人工干预的调查Agent组——专门负责搜集AI资料并整理成文档。
pip install crewai
from crewai import Agent, Task, Crew
from crewai_tools import SerperDevTool
从上面的代码可以看出,crewAI的基本模块包括Agent、Task、Crew和Tools。Agent可以使用工具,多个Agent组合在一起,每个被定义了角色和任务(Task),最终形成一个团队(Crew)。调用Crew来回答问题,本质上就是Task对用户指令进行拆分(类似Planning模式),然后分配给不同的Agent去执行。
首先配置工具和LLM:
os.environ["SERPER_API_KEY"] = "Your Key"
os.environ["OPENAI_API_KEY"] = "Your Key"
search_tool = SerperDevTool()
这里设置两个Agent:一个负责研究(Researcher),一个负责撰写(Writer)。当然也可以再加一个专门做SEO优化的Agent。每个Agent都有 role(角色)、goal(目标)、backstory(背景知识)三个核心参数。verbose 参数控制回复的详细程度,设为True则回复更详尽,设为False则更简洁。allow_delegation 控制是否允许该Agent把任务授权给其他Agent执行。tools 指定可用的工具,这里使用了Serper。max_rpm 限制每分钟的最大请求次数,cache 控制是否启用缓存。
researcher = Agent(
role='Senior Research Analyst',
goal='Uncover cutting-edge developments in AI and data science',
backstory=(
"You are a Senior Research Analyst at a leading tech think tank."
"Your expertise lies in identifying emerging trends and technologies in AI and data science."
"You ha ve a knack for dissecting complex data and presenting actionable insights."
),
verbose=True,
allow_delegation=False,
tools=[search_tool],
max_rpm=100
)
writer = Agent(
role='Tech Content Strategist',
goal='Craft compelling content on tech advancements',
backstory=(
"You are a renowned Tech Content Strategist, known for your insightful and engaging articles on technology and innovation."
"With a deep understanding of the tech industry, you transform complex concepts into compelling narratives."
),
verbose=True,
allow_delegation=True,
tools=[search_tool],
cache=False,
)
Agent创建好之后,就需要定义Task了。每个Task包含 description(任务描述)、expected_output(期望输出)、agent(负责的Agent)等参数。其中 human_input 是一个关键参数,设为True时,需要人工确认之后才能继续执行下一个Task。例如在下面这个例子中,任务要求必须让人类检查草稿是否通过,确认后再进行下一步操作。
task1 = Task(
description=(
"Conduct a comprehensive analysis of the latest advancements in AI in 2024."
"Identify key trends, breakthrough technologies, and potential industry impacts."
"Compile your findings in a detailed report."
"Make sure to check with a human if the draft is good before finalizing your answer."
),
expected_output='A comprehensive full report on the latest AI advancements in 2024, lea ve nothing out',
agent=researcher,
human_input=True,
)
task2 = Task(
description=(
"Using the insights from the researcher's report, develop an engaging blog post that highlights the most significant AI advancements."
"Your post should be informative yet accessible, catering to a tech-sa vvy audience."
"Aim for a narrative that captures the essence of these breakthroughs and their implications for the future."
),
expected_output='A compelling 3 paragraphs blog post formatted as markdown about the latest AI advancements in 2024',
agent=writer
)
最后一步,把Agent、Task和Tools组装成一个Crew:
crew = Crew(
agents=[researcher, writer],
tasks=[task1, task2],
verbose=2
)
result = crew.kickoff()
print("######################")
print(result)
这个项目最近准备手动部署跑一遍,看看实际效果。最后附上官方的CrewAI功能总结:
- :为Agent自定义特定的角色、目标和工具。
角色驱动的Agent设计
- :Agent之间可以自主委派任务并相互查询,效率更高。
自主的任务委派
- :使用可自定义的工具定义任务,并动态分配给Agent。
灵活的任务管理
- :目前支持顺序执行和层次化流程,更复杂的模式(如共识机制和全自主流程)正在开发中。
流程驱动
- :各任务的输出可直接保存到文件,方便后续使用。
输出保存为文件
- :支持将结果解析为结构化数据。
输出解析为Pydantic或JSON
- :既支持OpenAI,也支持开源模型,甚至可以连接本地部署的模型。
兼容开源模型
再看一眼crewAI的官方文档,支持的RAG工具列表确实相当丰富,这也是它吸引人的地方之一。
本期照片 2024.05.02 拍摄于北京温榆河公园
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名