为了账号安全,请及时绑定邮箱和手机立即绑定

使用CrewAI构建多智能体系统指南

AI代理通过独立分析数据、做出预测并推荐最佳行动,正在改变各行各业。这些智能程序不仅擅长独自完成任务,还擅长与其他代理合作,在销售、市场推广和教育等领域成为宝贵的资产。

例如,在市场推广中,AI助手可以评估客户偏好,识别个人兴趣,并制定个性化的营销策略,以促进客户参与度和满意度。在教育领域,这些助手同样可用于个性化学习路径,根据学生的需求和目标来调整课程,从而增强教育体验。

CrewAI 是一个开源框架,它让开发人员能够组建具有协作能力的 AI 代理团队来处理复杂任务。它提供了一个 Python 库,用于配置具有明确角色的专用代理、分配任务并通过结构化的协作流程来管理。CrewAI 在角色代理设计方面表现出色,灵活的任务分配和团队协作,非常适合用来构建高级多代理系统。

这篇文章,我们将探讨CrewAI框架,看看它是如何运作的,解释它是如何通过专门的角色和结构化的流程来促进多智能体系统的协作。接下来,我们将使用CrewAI构建一个网页搜索工具和推荐系统工具。

开始吧
内容提要
  • CrewAI是什么
  • CrewAI的组件
  • 尝试CrewAI
  • 安装所需的依赖包
  • 设置环境
  • 1. 构建一个网络搜索程序
  • 导入依赖
  • 爬取网页
  • 将提取的文本保存到文件
  • 设置文本搜索
  • 为任务创建代理程序
  • 2. 生成推荐活动
  • 导入依赖
  • 定义LLM模型参数
  • 准备数据
  • 创建代理程序
  • 为代理分配任务
  • 执行团队
  • 运行程序
  • 资料参考
啥是CrewAI?

CrewAI 是一个开源的 Python 框架,用于开发和管理多代理 AI 系统,使用户能够构建协作的 AI 代理团队,就像人类团队一样。这些代理可以通信、协调并共同实现特定目标。CrewAI 通过为代理分配专业角色、支持自主决策并促进代理间的通信,增强了这些系统,使它们能比单个代理更高效地应对复杂问题。

来源:(简介 — CrewAI)(https://docs.crewai.com/introduction

CrewAI的组成部分
  • 代理: 代理就像系统里独立工作的小伙伴,设计用于执行特定任务、做出决策并与其他代理互动。它们分析环境并响应输入,并使用各种工具,从简单的搜索功能到与API或区块链网络集成。
  • 任务: 任务指分配给代理的具体职责,范围从数据分析到控制外部系统。每个任务可以分解为子任务,可能需要专门的工具或资源。任务管理包括明确哪些代理负责,需要哪些工具以及涉及的流程,确保代理系统中高效的工作流程和准确的结果。
  • 团队: 团队是由具有特定角色和技能的代理组成的协调小组,旨在实现共同目标。团队构建包括根据角色和技能选择代理、分配任务并管理依赖关系,确保任务有序执行。这种有组织的协作使团队能够应对复杂挑战,利用每个代理的优势,提高性能并实现同步执行。
  • 工具: 工具指代理可以使用以执行各种行动的技能或功能。这包括来自《CrewAI Toolkit》和《LangChain Tools》的资源,从基本搜索到复杂交互,促进代理之间的有效协作。
  • 流程: 流程负责协调代理执行任务的方式,类似于我们在做项目时的管理方式。这些流程确保任务按计划顺利进行。

尝试CrewAI

在这一节中,我们将仔细研究CrewAI。重点将放在测试其组件,并利用这个框架开发两个应用(一个是网络搜索程序,另一个是推荐系统)。

安装依赖:
  • 创建并激活一个虚拟环境,运行以下命令。
    python -m venv venv  
    source venv/bin/activate, # 适用于 Ubuntu 系统
    venv/Scripts/activate, # 适用于 Windows 系统
  • 使用 pip 安装 crewai-toolscrewailangchain_openaipython-dotenv 库。
    pip install crewai-tools crewai langchain_openai python-dotenv

使用pip安装上述包。这些命令用于安装必要的工具和库,以确保您的环境配置正确。请在安装完成后继续按照指南操作。

搭建环境
  • 从创建一个新文件夹开始,用于存放你的项目文件夹。给它取一个能够反映项目目的的名字。
  • 创建一个名为 .env 的文件,这个文件用来存放环境变量。这个文件用来存放环境变量,包括 OpenAI 的密钥。
  • 打开 .env 文件,添加以下代码来指定你的 OpenAI API 密钥:
# 这里是一个示例的开放AI API密钥 sk-proj-7XyPjkdaG_gDl0_...

一、做一个网上搜索工具

在这个例子中,我们将使用CrewAI创建一个网络抓取工具。我们将使用CrewAI的三个工具:ScrapeWebsiteTool 用于抓取网站内容,FileWriterTool 用于将内容保存到文件,以及 TXTSearchTool 用于内容中的信息检索和生成(RAG)检索。

导入依赖
  • 创建一个名为 app.py 的文件
  • 然后,在其中添加以下代码,导入依赖项,并设置项目的环境变量
从 crewai_tools 导入 ScrapeWebsiteTool, FileWriterTool, TXTSearchTool
从 crewai 导入 Agent, Task, Crew
导入 os
从 dotenv 文件导入 load_dotenv 函数

# 导入环境变量来自 .env 文件
load_dotenv()
os.environ['OPENAI_API_KEY'] = os.getenv('OPENAI_API_KEY')  # 设置 OPENAI_API_KEY
爬一个网站 

初始化名为 ScrapeWebsiteTool 的工具,这是一个用于从网站提取内容的工具。这里,该工具被配置为从维基百科的“人工智能”词条抓取内容。

    # 初始化工具,可能需要传入会话
    tool = 网页抓取器(website_url='https://en.wikipedia.org/wiki/Artificial_intelligence')

    # 我们来看看,获取文本
    text = tool.run()
    # 打印提取的文本
    print(text)

将提取的文本内容写到文件里

使用文件写入工具(FileWriterTool)将提取的内容保存为 ai.txt 文件。

    # 初始化文件写入工具
    file_writer_tool = FileWriterTool()
    text = text.encode("ascii", "ignore").decode()
    # 将内容写入指定文件
    result = file_writer_tool._run(filename='ai.txt', content=text, overwrite=True)
    print(result)
    # 将非ASCII字符过滤掉

设置文本搜索功能

使用 TXTSearchTool 搜索 ai.txt 文件中的内容。

    # 初始化工具以特定文本文件,使代理能在该文件的内容中进行搜索。
    # 设置文本文件路径为 'ai.txt'
    tool = TXTSearchTool(txt='ai.txt')
创建任务代理

请创建一个任务代理。

创建了一个数据分析师代理,它的角色是教育者。它的任务是根据文件搜索中找到的文本回答问题“自然语言处理是什么?”

    context = tool.run('什么是自然语言处理?')  

    data_analyst = Agent(  
        role='教育者',  
        goal=f'基于提供的上下文回答问题 - 什么是自然语言处理?上下文 - {context}',  
        backstory='你是一位数据处理专家',  
        verbose='详细输出',  
        allow_delegation=False,  
        tools=[tool]  
    )  

    test_task = Task(  
        description="任务描述:理解主题并提供正确的回答",  
        tools=[tool],  
        agent=data_analyst,  
        expected_output='预期输出:提供正确的回答'  
    )  

    crew = Crew(  
        agents=[data_analyst],  
        tasks=[test_task]  
    )  

    output = crew.开始()  
    print(output)

2. 推荐活动生成

想象经营一家教育咨询公司,公司旨在根据学生的学位、学术目标、爱好和计算机技能为他们推荐最合适的课程。难题在于向每个学生推荐哪些课程。

在这个例子中,我们将使用CrewAI建立一个推荐系统,推荐最适合学生的课程。

导入依赖
  • 创建一个名为 app.py 的文件
  • 在文件中添加以下代码来实现导入依赖项,并在项目中设置环境变量
    from crewai import Agent, Task, Crew, Process  # 导入 crewai 模块中的 Agent, Task, Crew, Process 类
    from textwrap import dedent  # 导入 textwrap 模块中的 dedent 函数
    import pandas as pd  # 导入 pandas 库,并将其命名为 pd

    import os  # 导入操作系统相关的操作
    from langchain_openai import ChatOpenAI  # 导入 ChatOpenAI 类
    from dotenv import load_dotenv  # 从 dotenv 模块导入 load_dotenv 函数,用于加载环境变量
    load_dotenv()  # 加载环境变量配置文件
    os.environ['OPENAI_API_KEY'] = os.getenv('OPENAI_API_KEY')  # 设置环境变量 OPENAI_API_KEY

我们来定义 LLM 模型

接下来定义要使用的LLM模型以及其对应的API密钥,可以使用任何可用的LLM模型;这里使用了gpt-3.5-turbo-16k

    llm = 模型("gpt-3.5-turbo-16k",  
        温度=0.1,  
        最大token数=8000  
    )
数据集准备环节

创建一个包含学生档案和推荐给学生的课程列表的 csv 文件。

    csv = '''学术目标,专业,爱好,计算机技能,对语言的兴趣,GPA  
    成为软件工程师,计算机科学,游戏,高级,西班牙语,3.7  
    研究环境科学,环境科学,远足,中级,法语,3.5  
    从事医学事业,医学,弹钢琴,高级,西班牙语,3.9  
    主修心理学,心理学,阅读,中级,德语,3.6  
    从事国际关系工作,政治学,旅行,初级,普通话,3.8  
    成为教师,教育学,绘画,高级,西班牙语,3.4  
    研究文学,英语文学,写作,中级,法语,3.9  
    从事商业事业,工商管理,踢足球,初级,普通话,3.5  
    成为生物学家,生物学,摄影,高级,德语,3.7  
    从事数据分析工作,统计学,烹饪,中级,日语,3.6  
    '''  

    from io import StringIO  
    csvStringIO = StringIO(csv)  
    df_customers = pd.read_csv(csvStringIO, sep=",")  

    courses = '''  
    "计算机科学入门" - 哈佛大学在edX上提供  
    "生物学:地球生命" - 在Coursera上提供  
    "心理学入门" - 耶鲁大学在Coursera上提供  
    "环境科学" - 利兹大学在FutureLearn上提供  
    "文学入门" - 麻省理工学院在edX上提供  
    "医学术语" - 匹兹堡大学在Coursera上提供  
    "数据科学与机器学习" - 斯坦福大学在Coursera上提供  
    "细胞生物学" - 麻省理工学院在edX上提供  
    "积极心理学" - 北卡罗来纳教堂山大学在Coursera上提供  
    "环境法律与政策" - 维蒙特法学院在Coursera上提供  
    "编程入门:Python" - 密歇根大学在Coursera上提供  
    "人体神经解剖学" - 密歇根大学在Coursera上提供  
    "认知心理学入门" - 杜克大学在Coursera上提供  
    "气候变化与健康:从科学到行动" - 哈佛大学在edX上提供  
    "科学、技术、工程和数学英语" - 宾夕法尼亚大学在Coursera上提供  
    "美国法律导论" - 宾夕法尼亚大学在Coursera上提供  
    "化学入门:反应与比例" - 杜克大学在Coursera上提供  
    "流行病学:公共卫生的基础科学" - 北卡罗来纳教堂山大学在Coursera上提供  
    "计算机科学:编程的目的" - 普林斯顿大学在Coursera上提供  
    "统计学与数据分析入门" - 稻米大学在Coursera上提供  
    "基因与人类条件:从行为到生物科技" - 马里兰大学在Coursera上提供  
    "医学伦理与技术的未来" - 乔治敦大学在edX上提供  
    "免疫学基础" - 哈佛大学提供  
    '''
创建智能代理

下面我们将创建智能代理。

为第一个团队定义各个AI代理人,每个AI代理人需要一个角色、一个目标和一段背景故事。第二个团队将用于生成推荐给学生的课程推荐文本。

    # 第一支队伍的代理
    student_profiler = Agent(
      role='student_profiler',
      goal='''从有限的数据中,你逻辑地推断出关于学生的结论。''',
      backstory='你是一位有着数十年经验的心理学专家。',
      llm = llm,allow_delegation=False,verbose=True)

    course_specialist = Agent(
         role='课程顾问',
         goal='''将合适的课程与学生匹配起来。''',
         backstory='你精通各种课程,可以评估它们对学生的价值。',
         llm = llm,allow_delegation=False,verbose=True)

    Chief_Recommendation_Director = Agent(
         role="首席推荐主任",
         goal=dedent("""负责监督您的团队的工作,确保它是最好的,符合课程目标,审查批准,提出澄清问题或分配后续任务,以便做出决定"""),
         backstory=dedent("""您是某大型教育科技公司的首席推广官。您正在推出一个个性化的广告活动,确保您的团队为客户打造最佳内容。"""),
         llm = llm,tools=[],allow_delegation=False, verbose=True)

    # 第二支队伍的代理
    campaign_agent = Agent(
         role="广告活动代理",
         goal=dedent("""为广告活动创造引人注目且创新的内容,重点关注特定客户的广告文案创意。"""),
         backstory=dedent("""您是一家顶级数字营销公司的创意专家。您在制作与潜在客户共鸣的广告方面表现出色。  
       您的专长在于将营销策略转化为能吸引注意力并激发购买行为的引人入胜的故事。"""),
         llm = llm,allow_delegation=False, verbose=True)
给代理人分配任务:

让我们给每个代理人分配的任务下定义。

    # 存在任务
    def get_ad_campaign_task(agent, customer_description, courses):  
      return Task(description=dedent(f"""\  
        您正在为我们的学生客户创建一个定向营销活动。对于每个学生客户,我们需要选择最有可能且符合学生客户需求的三个课程来推广。  
        请审查、批准、提出澄清问题或委派后续工作,如有必要。委派工作时请附上完整的草稿。 
        以下是参与此活动的所有课程列表:{courses}。  
        目前我们所知的学生客户信息如下:{customer_description}。  

        首先,我们需要了解学生客户,才能开始此次营销活动。一旦我们了解了学生客户的需求、生活方式等,就需要选择最有可能被学生购买的三个课程。  

        您的最终答案必须是三个课程的列表,每个课程附带简短的描述,说明为什么它适合该学生客户。格式如下示例所示:  
         -  
         -  
         -  
        """),  
        agent=agent,expected_output='最终的营销活动版本,以Markdown格式呈现'  
      )  

    def get_ad_campaign_written_task(agent, selection):  
        return Task(description=dedent(f"""\  
        您正在为我们的学生客户创建一个定向营销活动。针对每个学生客户,我们已经选择了这一专门为该学生客户定制的三个课程来推广。  
        为了成功完成此活动,我们需要为学生客户准备一个宣传信息,以推广这些课程。该信息应大约为三段落,以便轻松整合到整个信件中。例如:  
        想学习数据分析吗?赶快报名参加哈佛大学的这门课程。  
        让这门课程帮助您提升职业生涯。  

        您需要审核、批准并委派必要后续工作以确保完整的宣传信息。委派工作时请附上完整的草稿。  

        您的最终答案必须包括三个课程列表,每个课程附带简短的宣传信息。  
        """),  
        agent=agent,expected_output='最终的营销活动版本,以Markdown格式呈现'  
      )
处理船员

让我们对每一行学生档案数据执行整个处理过程。

    df_output_list = []   

    for index, row in df_customers.iterrows():  
      print('############################################## '+ str(index))  
      customer_description = f'''  
      他们的学术目标是 {row['Academic Goals']}.  
      他们的专业是 {row[' Major']}.  
      他们的爱好是 {row[' Hobbies']}.  
      他们的计算机技能是 {row[' Computer Skills']}.  
      他们对语言的兴趣是 {row[' Interest in Languages']}.  
      他们的GPA是 {row[' GPA']}.  
      '''  
      print(customer_description)  

      # 定义任务1,选择相关课程前3名  
      task1 = get_ad_campaign_task(Chief_Recommendation_Director, customer_description, courses)  
      # 开始执行  
      targetting_crew = Crew(  
        agents=[student_profiler, course_specialist, Chief_Recommendation_Director],  
        tasks=[task1],  
        verbose=True,   
        process=Process.sequential # 任务将顺序执行,前一个任务的结果会传递给下一个任务  
      )  
      targetting_result = targetting_crew.kickoff()  

      # 定义任务2,生成推荐活动文案  
      task2 = get_ad_campaign_written_task(Chief_Recommendation_Director, targetting_result)  
      copywriting_crew = Crew(  
        agents=[campaign_agent, Chief_Recommendation_Director],  
        tasks=[task2],  
        verbose=True,   
        process=Process.sequential # 任务将顺序执行,前一个任务的结果会传递给下一个任务  
      )  
      copywriting_result = copywriting_crew.kickoff()  

      # 创建输出列表中的一个条目  
      df_output_list.append({'customer': customer_description,  
                             'targeted_courses': targetting_result,  
                             'promo_msg': copywriting_result,  
                            })  

    # 汇总结果到数据框  
    df_output = pd.DataFrame(df_output_list)  
    print(df_output)
运行应用程序

让我们用下面的代码来运行这个应用。

运行Python脚本:```
python app.py



Pandas数据框中的输出如下。

![](https://imgapi.imooc.com/9c854867097f3e9d13260315.jpg)

让我们仔细看看一个学生的信息以及用Crew AI生成的活动细节。

考虑一下这位学生的资料

![](https://imgapi.imooc.com/a094b667097f3ea007010201.jpg)

课程专家根据学生的资料选出了这些课程。

![](https://miro.medium.com/v2/resize:fit:1400/format:webp/1*QrIlvKnrES6bkkRvtlhGkw.png)

第二组发出了如下推荐信息。

![](https://imgapi.imooc.com/677f3eab0924f26314000713.jpg)

如果你想要创建不需要写代码的人工智能代理和助手,**Runbear** 通过提供一个与 Slack、MS Teams、HubSpot 和 Zendesk 无缝集成的无代码平台,这变得非常简单,你只需几分钟就可以为你的工作空间设置自定义的人工智能助手。

## [Runbear: 在您的工作空间中轻松集成自定义GPT轻松连接大型语言模型应用,例如OpenAI的助手和Anthropic的Claude,与Slack、Teams和HubSpot等无缝集成……runbear.io](https://runbear.io/?source=post_page-----a7305450253e--------------------------------)

 感谢你读这篇文章哦!!

感谢 Gowri M Bhatt 的内容审阅。

如果你喜欢这篇文章,请点击下方的鼓掌按钮 👏 并分享,让更多人看到它!

本教程的完整源代码可以在此处查看。

## [GitHub - codemaker2015/crewai-demo: CrewAI 是一个尖端的框架,用于调度角色扮演的自主 AI 代理。项目在 github.com](https://github.com/codemaker2015/crewai-demo?source=post_page-----a7305450253e--------------------------------)

## 一些资源

* [介绍 — CrewAI](https://docs.crewai.com/introduction)
* [alejandro-ao/crewai-crash-course: 入门教程:CrewAI 入门](https://github.com/alejandro-ao/crewai-crash-course)
* [多智能体系统及其构建方式](https://learn.crewai.com/)
* [crewAIInc/crewAI: 协调管理角色扮演、自主 AI 代理的框架。CrewAI 通过促进协作智能,使代理无缝协作,解决复杂任务。](https://github.com/crewAIInc/crewAI)
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消