LLM之Agent(十一)| 多智能体框架CrewAI与AutoGen相比

news2024/9/28 1:22:23

       基于LLM构建的Agent中有一个明显的现象就是多智能体体系结构的表现要超越单智能体,即使单智能体使用无可挑剔的提示策略。本文将探索另一个有趣的多智能体框架——CrewAI。

一、CrewAI整体优势

       CrewAI可以应用在生成环境中。它在发言人的反应和编排上牺牲了一点灵活性和随机性,但在代理人的能力、任务和发言转向上获得了更多的确定性。到目前为止,唯一的编排策略是“sequential”,未来的发布计划是“consensual”和“hierarchical”。

       当我们在下一章中深入研究这个框架及其代码时,我们会发现确保任务由相关代理并按定义的顺序处理非常容易。你肯定不会在CrewAI中看到智能体之间的任何生动互动,比如一个智能体纠正另一个智能体,一个智能体的多次讲话。这些交互有利于实验或演示,但对需要高效、确定性和成本效益高的任务完成的真实LLM产品用处不大。因此,CrewAI优先考虑精简和可靠的方法,在一个强大的群聊中,每个人工智能代理都准确地知道该做什么以及他们的目标。

       在我看来,另一个也是最关键的优势是它蓬勃发展的工具和支持丰富的资源,可以用来构建代理和任务,这源于它是基于LangChain设计的智能体。LangChain是一个成熟的LLM框架,已经为LLM应用程序开发人员提供了丰富的工具和外围设备来增强语言模型的功能。

       CrewAI被证明适合熟悉LangChain的LLM应用程序开发人员,或者已经在其上构建应用程序的开发人员。对他们来说,将现有的单独代理集成到CrewAI框架中可以相对容易地实现。相比之下,AutoGen的学习曲线可能更陡峭,需要更多的时间来了解其用法并有效地集成代理。

二、CrewAI代码实战

      现在让我们深入了解如何在代码中实践这些优势。

2.1 CrewAI业务流程

      为了证明Agent顺序任务的易用性,我将使用之前AutoGen演示相同的任务,可以参考之前的博文LLM之Agent(九)|  通过API集成赋能Autogen Multi-Agent系统,该演示要求人工智能代理根据天气条件和所附的保险项目列表,生成一个包含适当活动的旅行计划。

构建一套群聊人工智能代理,需要以下角色:

  • Weather reporter:根据地点和日期提供天气状况。
  • Activity agent:根据地点和天气条件为旅行活动提供建议。
  • Travel advisor:生成包括每天活动在内的旅行行程。
  • Insurance agent:根据计划活动和潜在风险量身定制保险方案。

       为了详细说明,沟通应按顺序操作,如天气记者->活动代理人->旅行顾问->保险代理人

下面看一下如何实现:

a)步骤1-首先安装CrewAI软件包

pip install crewai

b)步骤2-导入包,并进行相关设置

      由于底层实现依赖于LangChain库,因此除了CrewAI之外,我们还必须导入相关的LangChain包

import osfrom crewai import Agent, Task, Crew, Processfrom langchain_openai import ChatOpenAIllm = ChatOpenAI(model="gpt-4-1106-preview")

c)步骤3-构建代理

       实施过程主要是为每个代理商设置系统提示。CrewAI将系统提示(可能还有代理描述)分为多个部分。看看天气预报员的代码:

Weather_reporter = Agent(  role='Weather_reporter',  goal="""provide historical weather     overall status based on the dates and location user provided.""",  backstory="""You are a weather reporter who provides weather     overall status based on the dates and location user provided.    You are using historical data from your own experience. Make your response short.""",  verbose=True,  allow_delegation=False,  llm=llm,)

       通常情况下,你应该填写rolegoalbackstory来构建一个代理。这三个部分的名称很容易理解,其中role指的是代理的名称,goal指的是创建该代理的原因,以及代理能力的backstoryallow_delegation是为将任务传递给下一个代理(如果该代理无法处理)时的情况定义的。

       按照相同的方法,让我们构造其余三个代理。

from langchain.agents import load_toolshuman_tools = load_tools(["human"])activity_agent = Agent(  role='activity_agent',  goal="""responsible for activities     recommendation considering the weather situation from weather_reporter.""",  backstory="""You are an activity agent who recommends     activities considering the weather situation from weather_reporter.    Don't ask questions. Make your response short.""",  verbose=True,  allow_delegation=False,  llm=llm,)travel_advisor = Agent(  role='travel_advisor',  goal="""responsible for making a travel plan by consolidating     the activities and require human input for approval.""",  backstory="""After activities recommendation generated     by activity_agent, You generate a concise travel plan     by consolidating the activities.""",  verbose=True,  allow_delegation=False,  tools=human_tools,  llm=llm,)Insure_agent = Agent(  role='Insure_agent',  goal="""responsible for listing the travel plan from advisor and giving the short     insurance items based on the travel plan""",  backstory="""You are an Insure agent who gives     the short insurance items based on the travel plan.     Don't ask questions. Make your response short.""",  verbose=True,  allow_delegation=False,  llm=llm,)

       人机交互是多智能体应用程序治理的基本组成部分,以确保人工智能代理在适当的监督下发言。与需要开发人员构建用户代理以结合人类交互的AutoGen框架不同,集成LangChain的CrewAI提供了一种简化的方法,通过将名为“human”的工具加载到tools参数中,然后在代理travel_advisor的定义中加入tools=human_tools即可无缝地集成人工输入。我们接下来应该做的是将这个人工提示写入我们将在下一步中介绍的Task对象的描述中。

d)步骤4-构建任务

       在CrewAI中,没有针对整个组的“整体”任务,而是应该通过Task()方法为每个代理分配单独的任务。

task_weather = Task(  description="""Provide weather     overall status in Bohol Island in Sept.""",  agent=Weather_reporter)task_activity = Task(  description="""Make an activity list    recommendation considering the weather situation""",  agent=activity_agent)task_insure = Task(  description="""1. Copy and list the travel plan from task_advisor. 2. giving the short     insurance items based on the travel plan considering its activities type and intensity.""",  agent=Insure_agent)task_advisor = Task(  description="""Make a travel plan which includes all the recommended activities, and weather,     Make sure to check with the human if the draft is good      before returning your Final Answer.    .""",  agent=travel_advisor)

必须使用agent=…为每个任务显式分配一个代理…。

      如果你更喜欢评论旅行计划人际互动,你可以试着附加这样的文字“Make sure to check with the human if the draft is good before returning your final answer”。

e)步骤5-组建团队并开始

       现在,是时候用编排策略将他们组成一支有能力的团队了。

crew = Crew(  agents=[Weather_reporter, activity_agent,  travel_advisor, Insure_agent, ],  tasks=[task_weather, task_activity,  task_advisor, task_insure, ],  verbose=2)result = crew.kickoff()

       在目前唯一的选择顺序策略中,会严格按照agents列表和tasks列表中的顺序执行。根据我的测试,你必须确保两个顺序都是一致的,但我认为设计需要改进,以保持tasks列表是任务执行顺序的唯一参考。将verbose设置为2将使系统打印[Info][Debug]信息。

       当一切就绪时,只需调用kickoff()函数就可以开始群聊生成。

       从正在进行的打印中,您将看到LangChain的ReAct流程为每个任务提供的熟悉输出。

        最后,最后的答案显示了预期的旅行计划:

2.2 带Tools的代理

       当我们通过AutoGen框架开发AI群聊时,使用OpenAI的函数调用功能来调用外部API或自定义函数以扩展代理的知识是非常方便的。不幸的是,函数调用仅适用于GPT模型,很少有经过微调的开源模型。通过使用LangChain框架,该工具界面自然支持在现实世界中与CrewAI代理交互,并可用于所有兼容的模型。尽管工具的可靠性低于函数调用,但当工具的函数不需要复杂的输入参数时,它非常适用于开源模型。

       让我们看看如何在我们的旅行计划应用程序中使用它。

a.预置工具

       首先,我们希望Activity_agent提供来自互联网搜索的旅行活动,而不是自行生产。像大多数LangChain示例一样,我们使用DuckDuckGo作为搜索工具,该工具已内置到LangChain库中了。

       安装DuckDuckGo软件包:

pip install duckduckgo_search

       定义搜索工具:

from langchain_community.tools import DuckDuckGoSearchRunsearch_tool = DuckDuckGoSearchRun()

          将search_tool插入activity_agent

activity_agent = Agent(  role='activity_agent',  goal="""responsible for actitivies     recommendation considering the weather situation from weather_reporter.""",  backstory="""You are an activity agent who recommends     activities considering the weather situation from weather_reporter.    Don't ask questions. Make your response short.""",  verbose=True,  allow_delegation=False,    tools=[search_tool],  llm=llm,)

         在最后一步中,不要忘记通知代理使用Task定义中的最新数据。

task2 = Task(  description="""Make a research for suitable and up-to-date activities     recommendation considering the weather situation""",  agent=activity_agent)

       现有的各种工具可以从LangChain集成中选择。

b.自定义工具

     有时用户会调用自定义函数或API,也可以通过LangChain的装饰器@toolStructuredTool方法创建自定义工具。

      假设我们希望weather_reporter能够通过自定义API搜索在线天气数据。让我们快速模拟一个。

from langchain.tools import BaseTool, StructuredTool, toolfrom langchain.pydantic_v1 import BaseModel, Fieldclass WeatherInput(BaseModel):    search_string: str = Field(description="the search string for the weather status")def get_weather(search_string:str) -> str:    """Look up the weather status"""    return "It's raining season with typhoons."weather_search = StructuredTool.from_function(    func=get_weather,    name="weather_search",    description="search for the weather status",    args_schema=WeatherInput,    return_direct=True,)

       现在创建了新工具weather_search,用于接受查询字符串以返回虚拟天气状态“It’s raining season with typhoons”。然后,我们更新代理以配备此工具:

Weather_reporter = Agent(  role='Weather_reporter',  goal="""providing weather     overall status based on the dates and location the user provided.""",  backstory="""You are a weather reporter who provides weather     overall status based on the dates and location the user provided.    Make your response short.""",  verbose=True,  allow_delegation=False,  tools=[weather_search],  llm=llm,)

        并更新任务:

task1 = Task(  description="""providing weather     overall status in Bohol Island in September.""",  agent=Weather_reporter)

       在应用程序重新运行后,根据结果,weather_reporteractivity_agent都将开始使用该工具来支持它们的响应生成(蓝色句子)。

2.3 开源模型

       由于该框架与OpenAI API的推理结构没有紧密绑定,因此在CrewAI中使用开源模型的局限性比AutoGen小得多。一个快速的方法是通过安装Ollama来部署一个本地模型。

步骤1-安装Ollama

       按照Ollama官方[2]页面上的说明将软件包安装到您的本地机器上,并确保您有足够的本地计算资源来运行模型。

步骤2——创建LLM实例

       要为代理创建Ollama模型的推理,只需要使用LangChain中的Ollama()方法定义一个新的llm。

from langchain.llms import Ollamallm_ollama = Ollama(model="YOUR_MODEL_NAME")

支持的型号列表可以参考:[3]

       然后,将llm_ollama提供给代理,例如:

Insure_agent = Agent(  role='Insure_agent',  goal="""responsible for listing the travel plan from advisor and giving the short     insurance items based on the travel plan""",  backstory="""You are an Insure agent who gives     the short insurance items based on the travel plan.     Don't ask questions. Make your response short.""",  verbose=True,  allow_delegation=False,  llm=llm_ollama,  )

       现在,Insure_agent将通过本地语言模型生成文本。

三、结论

       CrewAI在提供LangChain引入的可扩展功能方面具有明显优势,包括工具集成和对开源大型语言模型的支持。它的顺序编排能力有利于多智能体应用程序的生产。尽管有这些优势,但缺乏某些功能可能会阻碍其广泛采用——与OpenAI的助手和更复杂的编排相关的功能明显缺乏。CrewAI团队必须尽快解决这些差距并部署增强功能,以满足LLM应用程序开发的需求。

参考文献:

[1] https://levelup.gitconnected.com/for-a-multi-agent-framework-crewai-has-its-advantages-compared-to-autogen-a1df3ff66ed3

[2] https://ollama.ai/

[3] https://ollama.ai/library

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kubecolor让kubelet更好看

kubecolor让kubelet更好看 默认情况下kubectl输出都是白色,在列特别多的情况下比较难分清楚具体是哪个对应哪个. 发现kubecolor可以完美解决这样的问题. 1. 安装kubecolor mkdir kubecolor cd kubecolor wget https://github.com/kubecolor/kubecolor/releases/download/v0.…

uniapp 项目请求接口千万别写死

我接手我徒弟的项目发现有一个请求接口是写死的。比如这种 config.baseUrlhttps://www.test1.cn/这样写虽然没有问题,但是如果遇到上传或下载接口 而且每个文件都有 这么多文件都写死 不利于维护。 下面我优化的是这样 新建一个config/index.js 引入方法 /config …

c# Get方式调用WebAPI,WebService等接口

/// <summary> /// 利用WebRequest/WebResponse进行WebService调用的类 /// </summary> public class WebServiceHelper {//<webServices>// <protocols>// <add name"HttpGet"/>// <add name"HttpPost"/>// …

Jasperreport 生成 PDF之省纸模式

省纸模式顾名思义就是节省纸张&#xff0c;使用 Jasper 去生成 PDF 的时候如果进行分组打印的时候&#xff0c;一页 A4 纸只会打印一组数据。这种情况下&#xff0c;如果每组数据特别少&#xff0c;只有几行&#xff0c;一页 A4 纸张根本用不了&#xff0c;就会另起一页继续打印…

springboot并mybatis入门启动

pom.xml,需要留意jdk的版本&#xff08;11&#xff09;和springboot版本要匹配&#xff08;2.7.4&#xff09;&#xff0c;然后还要注意mybatis启动l类的版本&#xff08;2.2.2&#xff09; <?xml version"1.0" encoding"UTF-8"?> <project xm…

【国产MCU】-CH32V307-GPIO控制:输入与输出

GPIO控制:输入与输出 文章目录 GPIO控制:输入与输出1、GPIO简单介绍2、驱动API介绍3、GPIO配置代码实现3.1 GPIO配置为输出3.2 GPIO配置为输入CH32V307的GPIO口可以配置成多种输入或输出模式,内置可关闭的上拉或下拉电阻,可以配置成推挽或开漏功能。GPIO口还可以复用成其他…

设计模式——2_1 命令(Command)

文章目录 定义图纸一个例子&#xff1a;空调和他的遥控器只有控制面板的空调遥控器可以撤销的操作 碎碎念命令和Runnable命令和事务 定义 把请求封装成一个对象&#xff0c;从而使你可以用不同的请求对客户进行参数化&#xff0c;对请求排队或记录请求日志&#xff0c;以及支持…

2024美国数学建模竞赛A题完整版思路+代码+数据+后续高质量参考论文

2024 MCM 问题A: 资源 用性和性 &#xff08;完整版见文末&#xff09; 题目翻译&#xff1a; 虽然有些动物物种存在于通常的雌雄两性之外&#xff0c;但大多数物种基本上是雌性或雄性。尽管许 多物种在出生时呈现1:1的性别比&#xff0c;但其他物种则偏离了均等的性别比。这…

jsp粉丝社区系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 粉丝社区系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

在Vue中如何构建复杂表单?

概述 很有可能&#xff0c;在我们的软件工程旅程中&#xff0c;我们至少要构建一次复杂的表单。本文将介绍如何创建一个复杂的表单&#xff0c;该表单可以使用一些Vue特性(如v-for和v-model)逐步增强。它还提供了一些基本的Vue核心功能的复习&#xff0c;这些功能将在您日常使…

Swift 入门之自定义类型的模式匹配(Pattern Matching)

概览 小伙伴们都知道 Swift 是一门简洁、类型安全、极富表现力以及“性感迷人”的编程语言。 和大多数语言一样&#xff0c;在 Swift 中也有一些隐藏着的、不为人知的宝藏特性。利用它们我们可以极大增加撸码的愉悦和成就感。 其中&#xff0c;模式匹配&#xff08;Pattern …

Linux---动静态库

动静态库的相关概念 静态库&#xff08;.a&#xff09;&#xff1a;程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库动态库&#xff08;.so&#xff09;&#xff1a;程序在运行的时候才去链接动态库的代码&#xff0c;多个程序共享使用库的…

【HarmonyOS】鸿蒙开发之ArkTs初步认识——第2.1章

ArkTs简介 ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript&#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集。 以下图可以展示Js&#xff0c;TS&#xff0c;ArkTs的关系 ArkTs基础语…

比收费还好用,6个自学python必看网站

今天给大家分享几个自学python经常用到的网站&#xff0c;非常实用&#xff0c;建议收藏&#xff01; 1.中文版官方教程 https://docs.python.org/zh-cn/3/tutorial/errors.html#defining-clean-up-actions 你可以从这里下载Python、使用、学习Python。官方文档自然是最权威的…

【vue】报错 Duplicate keys detected 解决方案

错误描述&#xff1a;Duplicate keys detected. This may cause an update error.错误直译&#xff1a;检测到重复的键。这可能会导致错误。错误原因&#xff1a;有相同父元素的多个子元素的v-for有相同的key值。 解决方法&#xff1a; return:{dataList:[{name:张三&#xf…

10秒搞定!隔壁奶奶都能搞定的幻兽帕鲁、雾锁王国开服指南

最近《幻兽帕鲁》和《雾锁王国》非常火热&#xff0c;玩过的小伙伴们都说非常上头&#xff01;有跟朋友对战需求的小伙伴们可以通过本文拥有一台高性价比的专用服务器&#xff0c;随时可以用来跟朋友一起玩游戏&#xff01; 敲重点&#xff01;&#xff01;&#xff01; 步骤…

86.网游逆向分析与插件开发-物品使用-物品丢弃的逆向分析与C++代码的封装

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;物品使用的逆向分析与C代码的封装-CSDN博客 码云地址&#xff08;ui显示角色数据 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;7563f86877c…

关于bypassuac的探究——思考

我们所使用的几个api&#xff0c;如RegCreateKeyExA、RegSetKeyExA都是直接修改注册表的操作&#xff0c;这种操作应该被归类为敏感操作&#xff0c;那么这里会不会被杀软拦截呢&#xff0c;去测试一下 windows defender正常上线 获取到的权限也是bypassuac后的权限 再看一下…

备战蓝桥杯---搜索(BFS基础1)

如果DFS是时光回溯&#xff0c;那么BFS则是影子分身。 下面是它的定义&#xff1a; 下面直接看题&#xff1a; 十分经典&#xff0c;在这注意存的时候可以用i*mj的形式&#xff0c;可以当作模板&#xff0c;下面是AC代码&#xff1a; #include<bits/stdc.h> using name…

阿里云AI通义千问出bug,今天修复了,一切都是莫名其妙,国产AI又可以了?

怎么隔一天就好了&#xff1f; 引言我的处理感想再次提问AI代码结尾 引言 前天我的阿里云AI 通义千问 不是抽风了嘛 详情见 阿里云AI通义千问出bug,解决不了直接弃,开始对国产AI由支持变失望 就是我的一些对话莫名消失了 我的处理 我在这里进行了反馈 但是没有回应 我以为…