如何使用 CrewAI 构建协作型 AI Agents

一、前言

AI Agents 的开发是当前软件创新领域的热点。随着大语言模型 (LLM) 的不断进步,预计 AI 智能体与现有软件系统的融合将出现爆发式增长。借助 AI 智能体,我们可以通过一些简单的语音或手势命令,就能完成以往需要手动操作应用程序才能实现的任务。但目前, AI 智能体的开发还处于初期阶段,正如 1990 年代的互联网,我们还在基础设施、工具和框架开发的初步阶段探索前行。本文将介绍一个名为 CrewAI 的新型智能体开发框架。

本文主要包含以下内容

  • 认识 AI 智能体。
  • 探索 CrewAI —— 一个构建智能体的开源工具。
  • 学习如何构建一个共同创作内容的 AI 团队。
  • 了解 AI 智能体在现实生活中的应用案例。

二、什么是 AI Agents?

语言模型在翻译、总结和推理方面表现出色。但它们的潜力远不止于此。让大语言模型 (LLM) 具备代理性是充分挖掘其推理潜力的一种方法。AI 智能体就是被赋予适当工具和指令的 LLM,能够自动完成网页浏览、网络抓取、执行 SQL 查询、文件操作等任务。利用 LLM 的推理能力,这些智能体能够根据当前需求选择合适的工具。而且,我们还可以将多个智能体组合起来,共同完成更复杂的任务。

当我们谈论如何构建 AI Agents时,首先想到的工具就是 LangChain。然而,使用 LangChain 手动协调 AI 智能体执行协作任务可能会相当困难。CrewAI 正是为了解决这一问题而生。

三、什么是 CrewAI?

CrewAI 是一个开源框架,专门用于协调具有角色扮演和自主操作的 AI 智能体。它可以帮助我们轻松创建能够共同实现复杂目标协作的 AI 智能体。这个框架的设计目的是让 AI 智能体能够扮演不同的角色、分配任务并共享目标,就像现实世界中的团队成员一样。CrewAI 的几大特性包括:

  • 基于角色的AI智能体设计:定义具备特定角色、目标和背景故事的智能体,让 LLM 在生成回答前有更丰富的上下文。
  • 灵活的任务管理方式:通过可定制化工具定义任务,并能够动态地分配给不同的智能体。
  • 智能体间的自主委派机制:智能体能够自行决定任务分配并相互协作,这大大提高了解决问题的效率。
  • 流程驱动策略:目前系统只支持按顺序执行任务和按层级组织流程,Crew AI正在研发更为复杂的流程管理方式,比如基于共识和自主决策的流程。
  • 保存任务输出:可以将任务产生的数据保存为文件,便于后续使用。
  • 输出解析功能:根据需要,可以将任务输出解析成 Pydantic 模型或 Json 格式。
  • 支持开源模型集成:可以利用 Open AI 或其他开源模型来运行你的团队。

CrewAI 能够与 LangChain 生态系统无缝集成。这意味着我们可以利用 LangChain 提供的工具和大语言模型 (LLM) 的集成功能,与 CrewAI 一起工作。

CrewAI 是一个旨在增强人工智能代理协作的最先进框架。这种创新方法通过营造一个让人工智能代理作为一个统一团队更有效地运作的环境,解决了 Autogen 和 ChatDev 等现有解决方案的局限性。

AutoGen 在促进创建协同工作的对话代理方面发挥了重要作用。然而,当涉及到协调代理之间的交互时,尤其是对于较大的任务,它会遇到困难。另一方面,ChatDev引入了进程的概念,尽管缺乏灵活性和可扩展性,使其不太适合实际应用。 CrewAI 克服了这些挑战,并为人工智能协作树立了新标准。

四、CrewAI 的工作原理

在 CrewAI 的背后,CrewAI 的每个智能体在核心上都是基于 LangChain 的智能体,但它们被赋予了特殊的能力,通过 ReActSingleInputOutputParser 进行增强。这种特别设计的解析器不仅优化了角色扮演功能,还添加了用于增强上下文关注点的绑定停止词,并通过 LangChain 的会话摘要记忆机制实现了任务连续性。

由于这些智能体是构建在 LangChain 之上的,它们自然而然地带来了所谓的“飞轮效应”,最直接的好处就是你可以无缝接入所有 LangChain 提供的工具和工具包,极大地拓宽了应用场景。

目前版本的智能体能够独立自主运作,它们通过内部对话来选择合适的工具。不过,CrewAI 计划在未来版本中加入更多样化的流程类型,这将支持在不同的团队配置中进行协作,实现在运行时动态分配任务的能力。

任务从一开始就指定给智能体,并且可以根据需要调整智能体可用的工具,这样既可以灵活地指导智能体完成不同的任务,又避免了给它们分配过多工具造成的负担。

Crew 本质上是一个框架,它包含了智能体和任务,并促进了它们按顺序完成工作。在实践中,采用多个独立 Crew 的模块化部署方式往往更加高效,每个 Crew 包含少量智能体。这种方式不仅使每个 Crew 能够达到不同的成果,而且避免了单一大型 Crew 处理众多任务和智能体时可能出现的瓶颈。

五、构建协作 AI 团队

如果想要更深入地了解 CrewAI,我们可以尝试构建一个用于创意写作的协作 AI 团队。首先,我们需要设定智能体的角色、工具以及每个智能体的具体任务。在这个内容创作团队中,我们设想了三个角色:创意分析师、撰稿人和编辑。每个角色都将承担特定的任务。

创意分析师负责分析主题并制定详尽的写作大纲。撰稿人则根据大纲撰写文章初稿。最后,编辑将对初稿进行格式化、编辑和校对。正如我们所知,CrewAI 允许我们为智能体添加定制工具。例如,我们可以为编辑智能体添加一个工具,使其能够将文档保存到本地硬盘。为了实现这些功能,我们需要一个大语言模型 (LLM)。在这个例子中,我们选择了 Google 的 Gemini 模型。

接下来,让我们开始编码。

和任何 Python 项目一样,首先创建一个虚拟环境并安装必要的依赖库。我们需要 Crewai 库以及 LangChain 提供的 Google GenAI 实现。当然,你也可以选择其他大语言模型,比如 Anthropic、Ollama、Tongyi Qwen 或 OpenAI 提供的开放模型。

注:CrewAI 可以使用 Ollama(一个用于人工智能代理开发的开源库)在本地运行。此功能可实现与现有系统的无缝集成,并消除对外部 API 的依赖,从而确保数据隐私和安全。

pip install crewai langchain-google-genai

首先,我们需要定义我们的 LLM 和协作智能体。为此,创建一个名为 agents.py 的文件来定义这些智能体。

import os

from crewai import Agent
from langchain.tools import tool
from langchain_google_genai import GoogleGenerativeAI

GOOGLE_API_KEY = "Your Key"
llm = GoogleGenerativeAI(
           model="gemini-pro", 
           google_api_key=GOOGLE_API_KEY
           )

接下来,我们定义一个文件保存工具。

class FileTools:

    @tool("Write File with content")
    def write_file(data: str):
        """这个工具用于将指定内容写入到特定路径的文件中。
输入格式应该是一个由竖线 (|) 分隔的字符串,包含两部分:文件的完整路径(例如:./lore/...)和你想要写入文件的具体内容。
        """
        try:
            path, content = data.split("|")
            path = path.replace("\n", "").replace(" ", "").replace("`", "")
            if not path.startswith("./lore"):
                path = f"./lore/{path}"
            with open(path, "w") as f:
                f.write(content)
            return f"File written to {path}."
        except Exception:
            return "Error with the input format for the tool."

上述的 write_file 方法使用了 LangChain 的工具函数进行装饰。由于 CrewAI 在后台使用 LangChain,所以工具必须遵循 LangChain 的规范。这个方法期望接收一个字符串,其中包含文件路径和内容,两者通过竖线 (|) 分隔。方法的文档字符串也作为函数的附加上下文,所以请确保提供详细的方法信息。

接下来,让我们定义智能体。

idea_analyst = Agent(
    role = "创意分析师",
    goal = "深入剖析创意,为文章撰写制定详细大纲。",
    backstory="""作为一名资深的内容分析师,你擅长深入挖掘创意,并为其制定出一套完整的写作计划。""",
    llm = llm,
    verbose=True
)
writer = Agent(
    role = "小说作家",
    goal = "根据分析师提供的创意,创作出吸引人的奇幻和科幻小说作品。",
    backstory="""作为一名享誉盛名的小说家,你曾两次荣登《人民文学》畅销书榜,专攻虚构和科幻领域。""",
    llm=llm,
    verbose=True
)

editor = Agent(
    role= "内容编辑",
    goal = "对作家撰写的内容进行精心编辑。",
    backstory="""作为一名经验丰富的编辑,你在编辑书籍和故事方面拥有多年的专业经验,能够确保作品质量。
复制再试一次分享""",
    llm = llm,
    tools=[FileTools.write_file],
    verbose=True
)

我们有三个智能体,每个都有不同的角色、目标和背景故事。这些信息将作为提示,帮助 LLM 更好地理解上下文。编辑智能体还关联了一个写作工具。

接下来,我们需要定义任务。为此,创建一个名为 tasks.py 的文件。

from textwrap import dedent


class CreateTasks:

    def expand_idea():
        return dedent("""分析给定任务 {idea}。为完成给定任务准备全面的要点。
                确保想法切题、连贯且引人入胜。
                确保遵守规则。不要使用任何工具。
                 
                规则:
                - 用项目符号列出想法。
                - 避免成人内容的想法。
            """)
    def write():
        return dedent("""根据创意分析师给出的蓝图想法,写一个1200字的引人入胜的故事。
                确保内容连贯、易于传达且吸引人。
                不要使用任何工具。 
                确保遵守规则。
                 
                规则:
                - 写作必须语法正确。
                - 尽可能少使用术语
              """)
    def edit():
        return dedent("""
                查找任何语法错误,进行编辑和格式化(如果需要)。
                在需要时为文本添加标题和副标题。
                不要缩短内容或添加评论。
                为内容创建一个合适的文件名,使用 .txt 扩展名。
                你必须使用工具将其保存到路径 ./lore/(你的标题.txt) 中。
            """)

这里的任务是你希望智能体执行的具体行动计划。

最后,创建 main.py 文件,我们将在这里组合智能体和任务,构建一个功能完备的团队。

from textwrap import dedent

from crewai import Crew, Task

from agents import editor, idea_analyst, writer
from tasks import CreateTasks


class ContentWritingCrew():
    def __init__(self, idea):
        self.idea = idea
    def __call__(self):
        tasks = self._create_tasks()
        crew = Crew(
            tasks=tasks,
            agents=[idea_analyst, writer, editor],
            verbose=True
            )
        result = crew.kickoff()
        return result

    def _create_tasks(self):
        idea = CreateTasks.expand_idea().format(idea=self.idea)
        expand_idea_task = Task(
            description=idea,
            agent = idea_analyst
        )
        write_task =  Task(
            description=CreateTasks.write(),
            agent=writer
        )
        edit_task = Task(
            description=CreateTasks.edit(),
            agent=editor
        )
        return [expand_idea_task, write_task, edit_task]

if __name__ == "__main__":
    dir = "./lore"
    if not os.path.exists(dir):
        os.mkdir(dir)
    idea = input("idea: ")
    my_crew = ContentWritingCrew(idea=idea)
    result = my_crew()
    print(dedent(result))

在上述代码中,我们定义了一个名为 ContentWritingCrew 的类,它接受用户输入的创意主题。_create_tasks 方法用于创建任务,而 call 方法则用于初始化并启动团队。运行脚本后,你可以在终端或笔记本上观察到一系列动作的执行。任务将按照团队定义的顺序执行。以下是执行日志的一个示例。

这是最终智能体,即编辑器的执行日志。它编辑了撰稿人智能体提供的初稿,并使用文件编写工具以合适的文件名保存文件。

这就是使用 CrewAI 创建协作 AI 智能体的基本流程。你还可以结合其他 LangChain 工具或创建自定义工具,通过有效的提示来完成更复杂的任务。

六、AI智能体应用案例

自主 AI 智能体在现实生活中有着广泛的应用前景。从个人助理到虚拟教练,以下是一些 AI 智能体的实际应用案例。

个人 AI 助理:不久的将来,个人助理将成为我们日常生活的一部分。想象一下,有一个像 Jarvis 那样的智能助理,它能处理你的所有数据,实时提供有用的信息,并自动完成一些日常琐事。

代码解释器:OpenAI 的代码解释器展示了 AI 智能体的强大潜力。这个解释器能够执行任何 Python 脚本,并根据文本提示返回结果。这可能是迄今为止最成功的 AI 智能体应用之一。

虚拟教练:随着 AI 技术的不断进步,我们可以预见在教育、培训等领域将出现大量的虚拟教练。

智能体优先软件开发:AI 智能体在软件开发领域有着巨大的应用潜力。与传统的手动操作相比,AI 智能体能够根据语音指令自动完成各种任务。

空间计算:随着增强现实 (AR) 和虚拟现实 (VR) 技术的不断发展,AI 智能体将在虚拟世界与现实世界之间架起桥梁,发挥至关重要的作用。

七、总结

尽管我们仍处于 AI 智能体开发的初级阶段,但目前要实现 AI 智能体的最佳性能,我们还需要依赖于 GPT-4,这在成本上可能较为昂贵。然而,随着开源模型逐渐赶上 GPT-4,我们将有更多的选择,能够在合理的成本下高效运行 AI 智能体。同时,智能体开发的框架也在不断进步,未来将使智能体能够执行更加复杂的任务。

7.1、关键要点

  • AI 智能体利用大语言模型 (LLM) 的推理能力,选择适当的工具来完成复杂任务。
  • CrewAI 是一个构建协作 AI 智能体的开源框架。
  • CrewAI 的独特特性包括基于角色的智能体设计、智能体间的自主委托以及灵活的任务管理。
  • CrewAI 能够与现有的 LangChain 生态系统无缝集成,我们可以结合使用 LangChain 工具和大语言模型 (LLM) 与 CrewAI。

八、References

[1]. CrewAI GitHub:https://github.com/joaomdmoura/crewAI

[2]. Google GenAI:https://python.langchain.com/docs/integrations/llms/google_ai

[3]. Ollama:https://python.langchain.com/docs/integrations/llms/ollama

[4]. Tongyi Qwen:https://python.langchain.com/docs/integrations/llms/tongyi

[5]. Building AI Agents: https://www.analyticsvidhya.com/blog/2024/01/building-collaborative-ai-agents-with-crewai/

[6]. CrewAI Docs:https://docs.crewai.com/

[7]. CrewAI Examples:https://github.com/joaomdmoura/crewAI-examples

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/423425.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【YOLO v5 v7 v8 小目标改进】RFB:组合不同大小的卷积核和扩张卷积来模拟人类视觉感受野的多尺度特性

RFB:组合不同大小的卷积核和扩张卷积来模拟人类视觉感受野的多尺度特性 提出背景RFB 原理空间感受野结构RFB-Net 小目标涨点YOLO v5 魔改YOLO v7 魔改YOLO v8 魔改 提出背景 当前表现最好的目标检测器依赖于深层CNN骨干网络,如ResNet-101和Inception&am…

Vue3 条件渲染 v-show

v-show 指令&#xff1a;用于控制元素的显示或隐藏。 执行条件&#xff1a;当条件为 false 时&#xff0c;会添加一个 display:none 属性将元素隐藏。 应用场景&#xff1a;适用于显示隐藏切换频率较高的场景。 <div v-show"数据">内容</div> 基础用法…

LeetCode 热题 100 | 图论(一)

目录 1 200. 岛屿数量 2 994. 腐烂的橘子 2.1 智障遍历法 2.2 仿层序遍历法 菜鸟做题&#xff0c;语言是 C 1 200. 岛屿数量 解题思路&#xff1a; 遍历二维数组&#xff0c;寻找 “1”&#xff08;若找到则岛屿数量 1&#xff09;寻找与当前 “1” 直接或间接连接在…

langchain学习笔记(七)

RunnablePassthrough: Passing data through | &#x1f99c;️&#x1f517; Langchain 1、RunnablePassthrough可以在不改变或添加额外键的情况下传递输入。通常和RunnableParallel结合使用去分配数值给到字典的新键 两种方式调用RunnablePassthrough &#xff08;1&#…

MySQL进阶:全局锁、表级锁、行级锁总结

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;MySQL进阶&#xff1a;MySQL事务、并发事务问题及隔离级别 &#x1f4da;订阅专栏&#xff1a;MySQL进阶 希望文章对你们有所帮助…

Linux学习笔记:进程的终止和等待

进程终止和等待 进程终止进程退出场景进程常见退出方式_exit()退出exit()退出return退出exit()与_exit()的不同之处 进程的等待什么是进程等待?为什么要进行进程等待如何进行等待wait方式:waitpid方式 进程终止 进程退出场景 一般来讲,进程的退出场景有三种: 代码运行完毕,…

Unity RectTransform·屏幕坐标转换

RectTransform转屏幕坐标 分两种情况 Canvas渲染模式为Overlay时&#xff0c;使用此方式 public Rect GetScreenCoordinatesOfCorners(RectTransform rt) {var worldCorners new Vector3[4];rt.GetWorldCorners(worldCorners);var result new Rect(worldCorners[0].x,world…

LeetCode54题:螺旋矩阵(python3)

路径的长度即为矩阵中的元素数量&#xff0c;当路径的长度达到矩阵中的元素数量时即为完整路径&#xff0c;将该路径返回。 循环打印&#xff1a; “从左向右、从上向下、从右向左、从下向上” 四个方向循环打印。 class Solution:def spiralOrder(self, matrix: List[List[i…

我的秋招数据分析岗面经分享(京东,美团,阿里,拼多多,vivo,滴滴)

节前&#xff0c;我们社群组织了一场技术&面试讨论会&#xff0c;邀请了一些互联网大厂同学、参加社招和校招面试的同学&#xff0c;针对新手如何入门数据分析、机器学习算法、该如何备战面试、面试常考点分享等热门话题进行了深入的讨论。 基于社群的讨论&#xff0c;今天…

艺术家林曦:新的一年|开启人生的最佳竞技状态吧!

开年大吉呀&#xff5e;新的一年&#xff0c;你准备好如何启程了吗&#xff1f;    暄桐是一间传统美学教育教室&#xff0c;创办于2011年&#xff0c;艺术家林曦是创办人和授课老师&#xff0c;教授以书法为主的传统文化和技艺&#xff0c;皆在以书法为起点&#xff0c;亲…

6、wuzhicms代码审计

wuzhicms代码审计 前言 安装环境配置 服务器要求 Web服务器: apache/nginx/iis PHP环境要求:支持php5.2、php5.3、php5.4、php5.5、php5.6、php7.1 (推荐使用5.4或更高版本!) 数据库要求: Mysql5www/install文件夹即可进入安装页面 审计开始 首页文件index.php&#xff0c…

测试需求平台8-Arco组件实现产品增改需求

✍此系列为整理分享已完结入门搭建《TPM提测平台》系列的迭代版&#xff0c;拥抱Vue3.0将前端框架替换成字节最新开源的arco.design&#xff0c;其中约60%重构和20%新增内容&#xff0c;定位为从 0-1手把手实现简单的测试平台开发教程&#xff0c;内容将囊括基础、扩展和实战&a…

HCIA-Datacom实验指导手册:8 网络编程与自动化基础

HCIA-Datacom实验指导手册&#xff1a;8 网络编程与自动化基础 一、实验介绍&#xff1a;二、实验拓扑&#xff1a;三、实验目的&#xff1a;四、配置步骤&#xff1a;步骤 1 完成交换机的 Telnet 预配置步骤 2 Python 代码编写 五、结果验证六、windows 计划任务程序配置七、 …

大数据权限认证 Kerberos 部署

文章目录 1、什么是 Kerberos2、Kerberos 术语和原理2.1、Kerberos 术语2.1、Kerberos 原理 3、Kerberos 服务部署3.1、前置条件3.2、安装依赖3.3、配置 krb5.conf3.4、配置 kdc.conf3.5、配置 kadm5.acl3.6、安装 KDC 数据库3.7、启动服务3.8、创建 Kerberos 管理员3.9、创建普…

qsort的使用与实现

c语言常见的排序方法大概有这些&#xff0c;今天我们所讲的是就是qsort快排的讲解 头文件 qsort的使用 我们先使用msdn查看他的相关资料&#xff0c;得知这个函数的传参请情况 1.void *base 翻译过来就是将要排序的函数的起始位置/数组首元素地址 2.size_t num 翻译过来就是数…

vue项目获取拼音首字母

工具包 pinyin-pro npm install pinyin-pro 官方地址 pinyin-pro | pinyin-pro性能优异、转换准确的 js 中文转拼音工具https://pinyin-pro.cn/示例代码(获取每个汉字的拼音首字母) import {pinyin} from pinyin-pro;function getPinyinInitial(name){if (name) {let py p…

redis实战笔记汇总

文章目录 1 NoSQL入门概述1.1 能干嘛&#xff1f;1.2 传统RDBMS VS NOSQL1.3 NoSQL数据库的四大分类1.4 分布式数据库CAP原理 BASE原则1.5 分布式集群简介1.6 淘宝商品信息的存储方案 2 Redis入门概述2.1 是什么&#xff1f;2.2 能干嘛&#xff1f;2.3 怎么玩&#xff1f;核心…

高性能MySQL 第4版

第一章MySQL架构 MySQL提供了多种锁的颗粒度&#xff0c;每种MySQL存储引擎都可以实现自己的锁策略和锁力度。 行级锁是在存储引擎而不是在服务器中实现的。 隔离界别 READ UNCOMMITTED - 脏读 在事务中可以可以查看到其他事务中还没有提交的修改。实际中很少用。 READ C…

运筹学_1.1.4 线性规划问题-解的概念

1.1.4 线性规划问题-解的概念 一、可行解与最优解二、基的概念三、基变量、基向量&#xff1b;非基变量、非基向量&#xff1b;基解、基可行解&#xff1b;四、最优解与可行解、基可行解的关系五、用例题&#xff08;枚举法&#xff09;巩固基解、基可行解、最优解三个概念1、例…

鸿蒙Harmony应用开发—ArkTS声明式开发(点击事件)

组件被点击时触发的事件。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 onClick onClick(event: (event: ClickEvent) > void) 点击动作触发该回调。 卡片能力&#xff1a; 从API version 9开始…
最新文章