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.pswp.cn/news/215820.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/215820.shtml
英文地址,請注明出處:http://en.pswp.cn/news/215820.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

二分查找25(Leetcode1498滿足條件的子序列數目)

代碼&#xff1a; 這道題不能用Math.pow 精度不夠 得自己寫個數組存2的n次方 class Solution {public int numSubseq(int[] nums, int target) {int mod 1000000007;int n nums.length;System.out.println(n);int[] f new int[100005];f[0]1;for(int i1;i<f.length;i){…

docker 安裝mysql 主從復制

一、搭建主服務器的mysql 1.1 先新建文件夾 mkdir -p /data/dockerData/mysql-master/conf 1.2 進入/data/dockerData/mysql-master/conf目錄下新建my.config, [mysqld] ## 設置server_id&#xff0c;同一局域網中需要唯一 server_id101 ## 指定不需要同步的數據庫名稱 bin…

論文閱讀《High-frequency Stereo Matching Network》

論文地址&#xff1a;https://openaccess.thecvf.com/content/CVPR2023/papers/Zhao_High-Frequency_Stereo_Matching_Network_CVPR_2023_paper.pdf 源碼地址&#xff1a; https://github.com/David-Zhao-1997/High-frequency-Stereo-Matching-Network 概述 在立體匹配研究領域…

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

目錄 Web安全的重要性 ?編輯常見的Web漏洞類型及其原理&#xff1a; 1、跨站腳本攻擊&#xff08;XSS&#xff09;: 2、SQL注入: 3、跨站請求偽造&#xff08;CSRF&#xff09;: 4、遠程文件包含&#xff08;RFI&#xff09;和本地文件包含&#xff08;LFI&#xff09;:…

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坐標系。也是物理坐標系。即真實的的物理坐標系。 …

給鼠標描述符打上注釋防止忘記

static uint8_t g_mouse_hid_desc[] { //通用桌面設備 0x05, 0x01, // USAGE_PAGE (Generic Desktop) //鼠標設備 0x09, 0x02, // USAGE (Mouse) //應用集合 0xa1, 0x01, // COLLECTION (Application) //指針設備 0x09, 0x01, // USAGE (Pointer) //物理集合 0xa1, 0x00, // C…

【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…

Java項目開發,業務比較復雜如何減少bug

Java項目開發&#xff0c;業務比較復雜如何減少bug 當Java開發工作涉及復雜業務時&#xff0c;可以采取以下方法來減少bug的數量&#xff1a; 1、深入了解業務需求 充分了解業務需求&#xff0c;與業務人員進行充分的溝通和交流&#xff0c;確保對需求的理解正確。在需求分析…

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;庫的刪…

FFmpeg之AVFilterLink

這個結構體主要是用來link兩個filter的,它存在于每個AVFilterContext中 struct AVFilterContext {const AVClass *av_class; ///< needed for av_log() and filters common optionsconst AVFilter *filter; ///< the AVFilter of which this is an inst…