多Agent的AI应用一直是个有意思的研究方向,之前试过用LangGraph构建一组Agent的执行流程,用于自动产出研究报告。但是流程都是针对任务固化的,如果要执行别的任务就需要修改代码。CrewAI相对来说自动化程度就要高一些,你只需要定义好Agent和Task,剩下的就交给CrewAI。CrewAI(https://github.com/joaomdmoura/crewAI)专注于协调角色扮演的自主AIAgent。通过使用LLM作为协调器促进协作,使得多个Agent像一支默契十足的团队一样工作,每个Agent扮演不同的角色,共同完成一项大的任务。Agent被视为团队的成员,具有特定的技能和特定的工作要做,执行任务、做出决策并与其他Agent进行通信。此外,CrewAI还支持LangChain引入的可扩展功能,包括工具集成和支持开源大语言模型。下面我们介绍一下CrewAI的核心概念,只有稍微懂一点Python的知识,就可以在本地运行多Agent的AI应用。顺便试一下百度最近免费的大模型服务。
包括Agent、Task、Tool、Process、Crew、Collaboration、Memory。对大部分目标来说,我们需要定义的是Agent、Task。有点类似成立了一个团队,第一要有队员,第二设置好要完成的任务,剩下的就交给CrewAI这个职业经理人管理了,我们作为老板就等收结果就好了。Agent:可以视为团队的一员,拥有特定技能,并承担特定工作。Agent可以担任不同的角色,例如“研究员”、“作家”或“客户支持”,每个角色都为团队的总体目标做出贡献。有几个主要的属性。
agent = Agent(
role="数据分析师",
goal="分析总结出可进行下一步行动的建议",
backstory="""你是一家大公司的数据分析师。您负责分析数据并提供公司下一步行动的建议。
您当前正在进行一个项目,以分析我们营销活动的表现。""",
tools=[my_tool1,my_tool2]
)
- Role,定义Agent在团队中的职能角色,决定了Agent最适合执行的任务类型。
- Goal,想要实现的个体目标,指导Agent的决策过程。
- Backstory,为Agent的角色和目标提供背景,丰富互动和驱动协作。
- Tool,工具是可用于执行任务的一组能力或功能,使得Agent能和外部环境交互,比如搜索网络信息,执行特定的计算等。虽然不是必须的,但使用工具能给Agent提供更多的可能性。
- Task:由Agent完成的特定任务。任务提供执行所需的所有详细信息,例如描述、负责的Agent、所需的工具、指定期望输出等,从而促进各种行动的复杂性。任务可以是协作的,需要多个Agent一起工作。这是通过任务属性进行管理并由 Crew 流程进行编排,从而增强团队合作和效率。Task是使用时最重要的概念,是驱动Agent执行和协作的动力。因此CrewAI也提供了多种任务的定义形式,支持异步执行、任务依赖关系、任务回调等。
task = Task(
description='查找并总结最新的AI新闻',
expected_output="输出前5大最重要AI新闻的摘要",
agent=research_agent,
tools=[search_tool]
)
Tool:工具为Agent提供了多种功能,从网络搜索和数据分析到协作和在同事之间委派任务。CrewAI是基于LangChain框架实现的,也继承了LangChain的Tool实现方式,这就意味着我们可以自定义工具。除此之外,CrewAI也提供了一套额外的工具包,有很多,这里列举几个:
- YoutubeVideoSearchTool:RAG 工具旨在在 YouTube 视频中进行搜索,非常适合视频数据提取。
- ScrapeWebsiteTool:方便抓取整个网站,非常适合全面的数据收集。
- GithubSearchTool:用于在 GitHub 存储库内进行搜索的 RAG 工具,可用于代码和文档搜索。
- CodeDocsSearchTool:一款针对搜索代码文档和相关技术文档而优化的 RAG 工具。
Process:流程协调Agent执行任务,类似于人类团队中的项目管理。这些流程确保任务按照预定义的策略有效地分配和执行。主要有两种流程,顺序和分层,默认是顺序执行。
- 顺序,按顺序执行任务,一个任务的输出作为下一个任务的背景。
- 分层,模拟企业层级结构,自动创建经理Agent,需要为经理Agent指定manager_llm(一个LLM的实例)。此经理Agent负责监督任务执行,包括规划、委派和验证。任务不是编程分配的,经理Agent根据其他Agent的能力分配任务,审查输出并评估任务完成情况。这个就会比较灵活,也有点像AutoGen。
- 共识(开发中),在Agent之间引入了一种民主的任务管理方法,在任务执行时进行协作决策,从而不需要经理Agent。
- Crew:相当于一个团队,定义有哪些Agent、Task,以及以什么样的流程执行。团队组建完毕,就用
kickoff()
方法启动工作流程。
- Collaboration:这是个基础概念,并没有可以实例化的对象。这个是CrewAI最主要的核心能力,对于我们来说,定义Agent、定义Task并不是什么难事,并且这肯定是使用者应该输入的。但让Agent协作完成目标就是比较麻烦了,当然你可以自己去编写流程,智能化自动化才是更优方案。
- Memory:CrewAI引入了复杂的记忆系统,旨在增强人工智能代理的能力。包括短期记忆、长期记忆、实体记忆和新识别的情境记忆,每个记忆都有一个独特的目的,帮助Agent记忆、推理并从过去的交互中学习。默认情况下,记忆系统处于禁用状态,可以通过
memory=True
开启,这个需要Embedding模型的支持。
自从Deepseek的大模型把价格打下来之后,各家卷价格也是相当拼了,百度直接免费了几个大模型的调用,刚好给大家试试效果。注册百度智能云账号后,进入千帆大模型平台-》模型服务-〉应用接入,就可以创建一个用来调用API的Access key 和 Secret key。
创建一个Project目录,用pip安装需要的python包
pip install crewai qianfan
接下来在python文件中创建百度千帆的LangChain对象
import os
from langchain_community.chat_models.baidu_qianfan_endpoint import QianfanChatEndpoint
os.environ["QIANFAN_AK"] = '上面创建应用Access key'
os.environ["QIANFAN_SK"] = '上面创建应用Secret key'
baidu_chat = QianfanChatEndpoint(
model="ERNIE-SPEED-8K",
verbose=True
)
要写技术博客,少不了要上网搜索资料,定义一个搜索工具Tool,这里换成LangChain的Tools是可以的,只不过输入输出可能要做一些特殊处理
from crewai_tools import SerperDevTool
os.environ["SERPER_API_KEY"] = "Your Key"
search_tool = SerperDevTool()
接下来定义Agent和Task,把Agent的llm设置成baidu_chat
researcher = Agent(
role="高级研究分析师",
goal="揭示人工智能和数据科学的前沿发展",
backstory="""你在一家领先的科技智库工作。您的专业技能在于识别新兴趋势。
你有分析复杂数据和提出可行见解的诀窍。""",
verbose=True,
allow_delegation=False,
tools=[search_tool],
llm=baidu_chat
)
writer = Agent(
role="技术内容策略师",
goal="创造关于技术进步的引人注目的内容",
backstory="""你是一位著名的内容策略师,以其富有洞察力和引人入胜的文章而闻名。
你将复杂的概念转化为引人入胜的叙述。""",
verbose=True,
allow_delegation=True,
llm=baidu_chat
)
task1 = Task(
description="""在2024年对人工智能的最新进展进行全面分析。
确定关键趋势、突破性技术和潜在的行业影响。""",
expected_output="要点中的完整分析报告",
agent=researcher
)
task2 = Task(
description="""利用所提供的见解,开发一个引人入胜的博客
文章强调了人工智能的最重大进步。
你的帖子应该内容丰富,易于访问,迎合精通技术的受众。
让它听起来很酷,避免使用复杂的单词,这样听起来就不像人工智能。""",
expected_output="至少4段的完整博客文章",
agent=writer
)
crew = Crew(
agents=[researcher, writer],
tasks=[task1, task2],
verbose=2,
)
result = crew.kickoff()
Crew的verbose设置了打印日志的级别,我们看看输出的效果
只能说一般吧,如果要解决某一专业的问题,我觉得写技术博客也需要专业,还需要不少优化的,定制化Prompt、执行流程等,但实际效果还不得而知,但这也是大多数AI应用的现状。