AutoGen实战应用(一):代码生成、执行和调试

AutoGen 是一个支持使用多个代理来开发大型语言模型(LLM) 应用程序的框架,这些代理采样相互对话的方式来解决人类交给的任务。AutoGen 代理是可定制的、可对话的,并且无缝地允许人类参与。他们采用LLM、人类输入和各种工具组合的各种运作模式。

 AutoGen 提供了可对话的 LLM 代理比如用户代理、助理代理等,还可用于通过人工或自动反馈解决各种任务,包括那些需要通过写代码才能完成的任务。下面我们来演示AutoGen通过代理之间的对话来完成人类交给的任务,并且代理们会在对话过程中完成生成代码,执行代码,观察代码结果,调试代码等迭代过程,直至最后完成任务。

以下demo建议在linux或者macos上测试成功!不建议在windows上执行,因为window环境容易产生莫名其妙的错误!

安装autogen

请新建一个python虚拟环境,并在命令行中执行以下安装命令:

pip install pyautogen

 任务1:计算股票价格收益率

在下面的示例中,让我们看看如何使用AutoGen中的代理来编写python脚本并执行该脚本。这个过程包括构造一个充当助手的AssistantAgent,以及一个充当人类用户代理的UserProxyAgent。首先我们需要配置模型和api_key, 这里我们选择的模型为:“gpt-4”, 这也是autogo官方推荐的模型。

import autogenconfig_list = [{'model': 'gpt-4','api_key': 'your_api_key',#输入用户自己的api_key}
]

接下来我们需要创建2个代理分别是assistant和user_proxy,其中user_proxy代表人类,主要的职能是向assistant交代人类的任务,并执行assistant生成的代码,然后将代码执行结果反馈给assistant, 而assistant的主要职能是接受user_proxy交代的人类任务,然后向告知user_proxy完成任务所需要的步骤和代码,并观察user_proxy反馈的代码执行结果以此来判断任务是否完成,如果未能完成任务则需要进一步修改代码后再让user_proxy执行代码直至最后完成。整个完成任务的过程就是assistant和user_proxy一问一答的迭代过程,常规情况下退出迭代的条件就是assistant从user_proxy反馈中判断出任务已经完成并返回给user_proxy一个“TERMINATE”标记。如下图所示:

下面我们需要创建UserProxyAgent和AssistantAgent两个代理,我们在创建UserProxyAgent时,我们设置参数human_input_mode为“NEVER”,它表示UserProxyAgent将不会征求人类用户的反馈。当达到max_consecutive_auto_reply定义的限制时,或者当is_termination_msg()对接收到的消息返回true时,接下来我们来创建这两个代理:

# 创建"assistant" 代理
assistant = autogen.AssistantAgent(name="assistant",llm_config={"cache_seed": 42,  # seed 用户缓存中间结果"config_list": config_list, "temperature": 0,  },  
)
# 创建"user_proxy"代理
user_proxy = autogen.UserProxyAgent(name="user_proxy",human_input_mode="NEVER",max_consecutive_auto_reply=10,is_termination_msg=lambda x: x.get("content", "").rstrip().endswith("TERMINATE"),code_execution_config={"work_dir": "coding","use_docker": False,  },
)

这里我们根据官方文档的说明来介绍一些两个代理的参数的含义:

AssistantAgent是ConversableAgent的一个子类,它配置了一个默认的系统消息。默认的系统消息是用来用LLM解决任务的,包括建议python代码块和调试。 human_input_mode默认为“NEVER”并且code_execution_config默认为 False。默认情况下,该代理不执行代码,而是期望用户执行代码。

UserProxyAgent 是ConversableAgent 的子类,它可以执行代码并向其他代理提供反馈 ,参数human_input_mode默认设置为“ALWAYS” 和llm_config默认设置为“False”。默认情况下,代理将在每次收到消息时提示人工输入。而在本例中我们将human_input_mode默认设置为“NEVER”即无需人工参与。

接下来我们就任务交给user_proxy ,让它和assistant 一起合作来完成任务:

# 助手从user_proxy接收一条消息,其中包含任务描述
user_proxy.initiate_chat(assistant,message="""What date is today? Compare the year-to-date gain for META and TESLA.""",
)

我们的问题是:“What date is today? Compare the year-to-date gain for META and TESLA.” 中文意思为:“今天是几号?比较一下META和特斯拉今年的收益”。 要完成这个任务是需要查询meta和tesla这两支股票的年初和年末的价格来实现的,下面我们看看这两个代理是如何完成这个任务的:

 以上是user_proxy 和assistant之间一部分对话内容的,这里我们可以看到,user_proxy向assistant交代任务后,assistant便回复了user_proxy 完成任务的所有步骤:firs, next..., 以及所需要的代码,而user_proxy 则去执行这些代码,在执行代码过程中可能会出现异常,user_proxy 会将代码执行的异常情况再反馈给assistant,assistant再修改代码,user_proxy再次执行代码,这样迭代循环,直至最后完成任务:

 最后我们看到所有代码中的bug被解决以后,user_proxy执行代码后计算出了META和TESLA的年度收益率并将结果反馈给了assistant,assistant最后回复用户user_proxy时在末尾加上了 “TERMINATE”标记表示任务已经完成。上面的例子涉及代码执行。

在AutoGen中,当UserProxyAgent(用户代理)在接收到的消息中检测到可执行代码块并且没有提供人工用户输入时,它会自动触发代码执行。这个过程在指定的工作目录中进行,默认使用Docker容器。除非指定了特定的目录,比如在本例中我们在用户代理的参数code_execution_config中指定了work_dir为“coding”也就是说autogen会在我们的工作目录下创建一个coding文件夹,所有的工作都会在coding文件夹内完成,否则AutoGen默认为extensions目录。在构造UserProxyAgent的新实例时,用户可以通过设置work_dir参数来指定不同的工作目录。

任务2:绘图

接下来我们在任务1的基础上画出这两个股票的收益率趋势图,同样我们只需要告诉用户代理我们的要求即可:

# 上一个问题的后续
user_proxy.send(recipient=assistant,message="""Plot a chart of their stock price change YTD and save to stock_price_ytd.png.""",
)

 这里我们完成了任务2,并在工作目录的“coding”文件夹内创建了一个股票收益率的图片,下面我们来打开这个图片:

from IPython.display import ImageImage(filename='coding/stock_price_ytd.png')

总结

今天我们学习了AutoGen的基本原理以及基础参数的设置,并通过两个简单的例子轻松实现了原本需要使用复杂逻辑才能完成的任务。任务的复杂逻辑并没有发生变化,只是实现这些逻辑的主体由人变成了AI,我们模拟出两个由AI担任的人物角色,他们通过相互之间的对话一步一步的解决了人类交给它们的任务,你说神奇不神奇!😀。

参考资料

Getting Started | AutoGen

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

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

相关文章

docker 安装mysql 主从复制

一、搭建主服务器的mysql 1.1 先新建文件夹 mkdir -p /data/dockerData/mysql-master/conf 1.2 进入/data/dockerData/mysql-master/conf目录下新建my.config, [mysqld] ## 设置server_id,同一局域网中需要唯一 server_id101 ## 指定不需要同步的数据库名称 bin…

论文阅读《High-frequency Stereo Matching Network》

论文地址:https://openaccess.thecvf.com/content/CVPR2023/papers/Zhao_High-Frequency_Stereo_Matching_Network_CVPR_2023_paper.pdf 源码地址: https://github.com/David-Zhao-1997/High-frequency-Stereo-Matching-Network 概述 在立体匹配研究领域…

web漏洞原理与防御策略,web漏洞怎么挖掘

目录 Web安全的重要性 ​编辑常见的Web漏洞类型及其原理: 1、跨站脚本攻击(XSS): 2、SQL注入: 3、跨站请求伪造(CSRF): 4、远程文件包含(RFI)和本地文件包含(LFI):…

Spring Boot实现接口幂等

Spring Boot实现接口幂等 1、pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http:…

大创项目推荐 协同过滤电影推荐系统

文章目录 1 简介1 设计概要2 课题背景和目的3 协同过滤算法原理3.1 基于用户的协同过滤推荐算法实现原理3.1.1 步骤13.1.2 步骤23.1.3 步骤33.1.4 步骤4 4 系统实现4.1 开发环境4.2 系统功能描述4.3 系统数据流程4.3.1 用户端数据流程4.3.2 管理员端数据流程 4.4 系统功能设计 …

【软件安装】VMware安装Centos7虚拟机并且设置静态IP,实现Windows和Centos7网络互相访问

这篇文章&#xff0c;主要介绍VMware安装Centos7虚拟机并且设置静态IP&#xff0c;实现Windows和Centos7网络互相访问。 目录 一、VMware安装Centos7 1.1、下载Centos7镜像 1.2、安装Centos7系统 二、设置静态IP地址 2.1、查看虚拟机网络IP 2.2、禁用NetworkManager服务 …

每天五分钟计算机视觉:VGG网络相对于AlexNet网络有哪些不同?

本文重点 在前面的课程中&#xff0c;我们已经学习了VGG网络模型&#xff0c;也学习了AlexNet网络模型&#xff0c;AlexNet模型先于VGG网络模型产生&#xff0c;所以VGG在一定程度上要优于AlexNet模型&#xff0c;二者来看一下&#xff0c;二者究竟有什么不同&#xff1f; 深度…

Qt的坐标系系统 - 3个坐标系,2个变换

参考&#xff1a; https://zhuanlan.zhihu.com/p/584048811https://www.zhihu.com/tardis/zm/art/634951149?source_id1005 小谈Qt的坐标系系统 Qt中有三个坐标系 设备坐标系窗口坐标系逻辑坐标系 设备坐标系: 即Device坐标系。也是物理坐标系。即真实的的物理坐标系。 …

【Linux】free命令使用

free命令 ​free是指查看当前系统内存的使用情况&#xff0c;它显示系统中剩余及已用的物理内存和交换内存&#xff0c;以及共享内存和被核心使用的缓冲区。 作者 作者&#xff1a;Brian Edmonds。 语法 free [参数] free 命令 -Linux手册页 命令选项及作用 执行令 &am…

【二分查找】【滑动窗口】LeeCode2528:最大化城市的最小电量

作者推荐 【动态规划】【广度优先】LeetCode2258:逃离火灾 本文涉及的基础知识点 二分查找算法合集 滑动窗口 题目 给你一个下标从 0 开始长度为 n 的整数数组 stations &#xff0c;其中 stations[i] 表示第 i 座城市的供电站数目。 每个供电站可以在一定 范围 内给所有城…

Java学习总结

1. Java集合体系框架 java.util中包含 Java 最常用的the collections framework。 Java集合类主要由两个根接口Collection和Map派生出来的。 Collection 接口派生出了三个子接口List、Set、Queue。Map 接口 因此Java集合大致也可分成List、Set、Queue、Map四种接口体系。 …

CDH6.3.2安装

文章目录 [toc]一、CM简介1、ClouderaManager的概念2、ClouderaManager的功能3、ClouderaManager的架构 二、准备清单1、部署步骤2、集群规划3、软件环境准备 三、安装清单1、操作系统iso包2、JDK包3、MySQL包4、CM和CDH包5、部署ansible 四、基础环境准备1、配置网络2、配置ho…

el-collapse 默认展开第一个(实测有效)

<el-collapse accordion v-model"activeCollapse"> <el-collapse-item v-for"(item, index) in assetList" :name"index" :key"item.id" > 我这个是通过循环, 只需要v-model 绑定的值和 name 相等,就可以实现展开 然后就…

重新认识Word——给图、表、公式等自动编号

重新认识Word——给图、表、公式等自动编号 给图增加题注题注失败的情况给图添加“如图xx-xx所示” 给公式插入题注第一步——先加题注第二步——设置两个制表符 解决题注“图一-1”的问题 前面我们已经学习了如何引用多级列表自动编号了&#xff0c;现在我们有第二个问题&…

大数据湖体系规划与建设方案:PPT全文51页,附下载

关键词&#xff1a;大数据解决方案&#xff0c;数据湖解决方案&#xff0c;数据数仓建设方案&#xff0c;大数据湖建设规划&#xff0c;大数据湖发展趋势 一、大数据湖体系规划与建设背景 在传统的企业信息化建设中&#xff0c;各个业务系统通常是独立建设的&#xff0c;导致…

学习笔记10——Mysql的DDL语句

学习笔记系列开头惯例发布一些寻亲消息 链接&#xff1a;https://baobeihuijia.com/bbhj/contents/3/197161.html 数据库创建&#xff1a; CREATE DATABASE books&#xff1b; CREATE DATABASE IF NOT EXISTS books;更改字符集 ALTER DATABASE books CHARACTER SET gbk;库的删…

C语言常用字符串

目录 1.什么是字符串 2.如何定义字符串 第3和第4定义的区别&#xff1a;3是字符串变量&#xff0c;4是字符串常量&#xff0c;不予许被修改 3.strlen和sizeof的区别 4.地址分配&#xff08;malloc,realloc,free,memset&#xff09; 案例 5.字符串拷贝(strcpy,strncpy) …

JS实现返利网注册系统(网页数据验证)

主代码 <!DOCTYPE HTMLPUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"><head><title>返利网注册</tit…

品牌线下店铺的查价方式

不同于电商平台&#xff0c;线下店铺会更传统&#xff0c;产品定价除了受品牌规则的约束&#xff0c;同样也与门店实际销量和促销有关&#xff0c;当遇到地方活动&#xff0c;促销力度大了&#xff0c;价格难免会与品牌要求相差异&#xff0c;但是管控渠道&#xff0c;包含线上…

痤疮分割 实验心路历程

数据集的制作 将labelme生成的标注文件记普通的json文件转成coco数据集格式的json文件 图像分辨率过大 如果不做任何调整&#xff1a; 会出现“killed”的报错&#xff0c;表示图片像素过大&#xff0c;显卡内存不够&#xff0c;无法支撑训练 显卡 换成更高性能的显卡&am…