AutoGen 是由微软、宾夕法尼亚州立大学和华盛顿大学合作开发的一个框架,它支持使用多个代理来开发 LLM 应用程序,这些代理可以相互对话来完成任务。
AutoGen 中的代理是可定制的、可对话的,并且无缝地允许人类参与。AutoGen 有如下特点:
可以轻松构建基于多代理对话的下一代 LLM 应用程序。它简化了复杂的 LLM 工作流程的编排、自动化和优化。它最大限度地提高了 LLM 模型的性能并克服了它们的弱点。
它支持复杂工作流程的多种对话模式。借助可定制和可对话的代理,开发人员可以使用 AutoGen 构建各种涉及对话自主性、代理数量和代理对话拓扑的对话模式。
它提供了一系列具有不同复杂性的工作系统。这些系统涵盖各种领域和复杂性的广泛应用。
它提供增强的 LLM 推理。它提供 API 和缓存等实用程序,以及错误处理、多配置推理、上下文编程等高级使用模式。
AutoGen 的功能类似于 LangChain 中的 agents。
AutoGen的安装 首先,我们需要安装 AutoGen 的 Python 包:
1 pip install pyautogen docker
安装完成后,我们就可以使用了。
AutoGen的使用 加载配置数据 使用 AutoGen 时,我们首先需要加载配置,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 import osimport autogenfilter_dict = { "model" : "gpt-4" } config_list = autogen.config_list_from_json( "OAI_CONFIG_LIST" , filter_dict=filter_dict, ) llm_config = { "timeout" : 600 , "cache_seed" : 42 , "config_list" : config_list, "temperature" : 0 , }
在 config_list 中,可以配置很多模型供不同的 task 使用。config_list 可以直接是一个列表,也可以使用 autogen.config_list_from_json() 从 OAI_CONFIG_LIST 中加载配置数据,OAI_CONFIG_LIST 可以是一个json文件,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [ { "model": "gpt-4-32k", "api_key": "xxx", "tags": ["gpt-4-32"] }, { "model": "gpt-4", "api_key": "xxx", "tags": ["gpt-4"] }, { "model": "llama2", "tage": ["llama2", "local"] } ]
agent 会使用 config_list 中可用的第一个模型,并针对该模型进行 LLM 调用。如果第一个模型调用失败,agent 将针对第二个模型重试请求,依此类推,直到收到提示完成消息。
如果我们有多个 LLM,但是想指定使用其中的一个,可以使用 filter_dict 进行过滤,比如要指定使用 gpt-4 这个模型,就可以这样配置:
1 2 3 4 5 6 7 8 9 filter_dict = { "model" : "gpt-4" } config_list = autogen.config_list_from_json( "OAI_CONFIG_LIST" , filter_dict=filter_dict, )
当然,我们也可以使用 tags 进行过滤:
1 2 3 filter_dict = { "tags" : ["gpt-4" ] }
使用 tags 进行过滤时,tags 的值是一个列表,列表中可以指定多个 LLM。
创建并运行agent 创建 agent 时,上面的 llm_config 配置需要作为参数传入:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 assistant = autogen.AssistantAgent( name="assistant" , llm_config=llm_config, ) 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" : "web" , "use_docker" : False , }, llm_config=llm_config, system_message="""Reply TERMINATE if the task has been solved at full satisfaction. Otherwise, reply CONTINUE, or the reason why the task is not solved yet.""" ,)
创建 UserProxyAgent 对象时,参数的含义为:
name:指定用户代理的名称
human_input_mode:用户输入的模式,即是否在每次收到消息时请求人工输入。可能的值有 “ALWAYS”,”NEVER”,”TERMINATE”:
1 2 3 ALWAYS:表示每次收到消息时,代理都会提示人工输入,这种模式下,当用户输入 exit 或者 is_termination_msg 参数为 True 时,对话会退出。 NEVER:表示代理永远不会提示人工输入,这种模式下,当自动回复次数达到 max_consecutive_auto_reply 设置的值或者 is_termination_msg 为 True 时,对话会停止。 TERMINATE:表示仅当收到终止消息或自动回复数量达到 max_consecutive_auto_reply 设置的值时,代理才会提示人工输入。
max_consecutive_auto_reply:一个 int 值,设置最大连续自动回复数,默认为 None,没有限制。该限制仅在 human_input_mode 不是“ALWAYS”时起作用。
is_termination_msg:该参数值是一个函数,它接受字典形式的消息并返回一个布尔值,指示收到的消息是否是终止消息,该字典可以包含以下键:“content”、“role”、“name”、“function_call”。
code_execution_config:是一个字典或者 False,表示执行的代码需要的配置。字典中的配置项有:
1 2 3 4 work_dir(可选,str):代码执行的工作目录。如果没有,将使用默认工作目录。默认工作目录是“path_to_autogen”下的“extensions”目录。 use_docker(可选,list、str 或 bool):用于执行代码的 docker 容器。默认值为 True,这意味着代码将在 docker 容器中执行。将使用默认的镜像列表。如果提供了镜像名称的列表或字符串,则代码将在 docker 容器中执行,并成功拉取第一个镜像。如果为 False,则代码将在当前环境中执行。 timeout(可选,int类型):最大执行时间(以秒为单位)。 last_n_messages(可选,int类型):要回顾代码执行的消息数。默认为 1。
llm_config:LLM 的配置信息
system_message:str 或者 list 类型,用于 ChatCompletion 聊天的系统消息,仅当 llm_config 不为 False 时使用。
最后,执行 user agent 初始化聊天:
1 2 3 4 user_proxy.initiate_chat( assistant, message="""帮我分析一下过去一个月A股中药明康德这只股票的变化情况""" , )
下面是它的输出结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 [user_proxy[0m (to assistant): 帮我分析一下过去一个月A股中药明康德这只股票的变化情况 -------------------------------------------------------------------------------- [assistant[0m (to user_proxy): 首先,我们需要从网络上获取股票数据。我们可以使用Python的pandas_datareader库来获取这些数据。以下是获取过去一个月药明康德(股票代码:603259.SH)股票数据的代码。 ```python # filename: stock_analysis.py import pandas_datareader as pdr import datetime # Define the stock to be analyzed stock_code = '603259.SS' # Define the time period end_date = datetime.datetime.now() start_date = end_date - datetime.timedelta(days=30) # Get the stock data stock_data = pdr.get_data_yahoo(stock_code, start_date, end_date) # Print the stock data print(stock_data) ``` 请运行这段代码,它将输出过去一个月药明康德的股票数据,包括每天的开盘价、最高价、最低价、收盘价和成交量。 -------------------------------------------------------------------------------- [31m >>>>>>>> EXECUTING CODE BLOCK 0 (inferred language is python)...[0m [33muser_proxy[0m (to assistant): exitcode: 1 (execution failed) Code output: Traceback (most recent call last): File "stock_analysis.py", line 14, in <module> stock_data = pdr.get_data_yahoo(stock_code, start_date, end_date) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/zanwang/dev/AutoGenproject/pyautogen/lib/python3.11/site-packages/pandas_datareader/data.py", line 80, in get_data_yahoo return YahooDailyReader(*args, **kwargs).read() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/zanwang/dev/AutoGenproject/pyautogen/lib/python3.11/site-packages/pandas_datareader/base.py", line 253, in read df = self._read_one_data(self.url, params=self._get_params(self.symbols)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/zanwang/dev/AutoGenproject/pyautogen/lib/python3.11/site-packages/pandas_datareader/yahoo/daily.py", line 153, in _read_one_data data = j["context"]["dispatcher"]["stores"]["HistoricalPriceStore"] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^ TypeError: string indices must be integers, not 'str' -------------------------------------------------------------------------------- [33massistant[0m (to user_proxy): 看起来我们在获取Yahoo财经数据时遇到了问题。这可能是由于Yahoo财经的API发生了变化或者是由于网络问题。我们可以尝试使用另一个库,如yfinance,它专门用于从Yahoo财经获取数据。 以下是使用yfinance库获取过去一个月药明康德(股票代码:603259.SS)股票数据的代码。 ```python # filename: stock_analysis.py import yfinance as yf import datetime # Define the stock to be analyzed stock_code = '603259.SS' # Define the time period end_date = datetime.datetime.now() start_date = end_date - datetime.timedelta(days=30) # Get the stock data stock_data = yf.download(stock_code, start_date, end_date) # Print the stock data print(stock_data) ``` 请运行这段代码,它将输出过去一个月药明康德的股票数据,包括每天的开盘价、最高价、最低价、收盘价和成交量。 -------------------------------------------------------------------------------- [31m >>>>>>>> EXECUTING CODE BLOCK 0 (inferred language is python)...[0m [33muser_proxy[0m (to assistant): exitcode: 0 (execution succeeded) Code output: Open High Low Close Adj Close Volume Date 2024-01-29 63.000000 63.980000 59.360001 59.360001 59.360001 106097922 2024-01-30 56.400002 58.599998 56.180000 56.849998 56.849998 87396491 2024-01-31 56.000000 56.549999 53.900002 54.200001 54.200001 65697194 2024-02-01 54.560001 56.939999 53.730000 55.799999 55.799999 58337298 2024-02-02 56.910000 57.430000 50.220001 50.220001 50.220001 65707485 2024-02-05 46.279999 51.730000 45.200001 48.230000 48.230000 159302508 2024-02-06 46.860001 52.810001 45.369999 52.250000 52.250000 113259142 2024-02-07 53.610001 56.380001 53.610001 55.250000 55.250000 111295644 2024-02-08 53.650002 54.500000 52.000000 53.119999 53.119999 99007432 2024-02-19 50.500000 51.279999 48.619999 50.049999 50.049999 132806402 2024-02-20 49.849998 51.639999 49.330002 51.570000 51.570000 100319873 2024-02-21 51.000000 55.500000 50.820000 53.740002 53.740002 108874573 2024-02-22 53.090000 54.360001 52.880001 54.110001 54.110001 62886204 2024-02-23 54.040001 54.180000 52.549999 53.580002 53.580002 69410659 2024-02-26 53.840000 55.299999 53.750000 55.000000 55.000000 50604459 -------------------------------------------------------------------------------- [assistant[0m (to user_proxy): 根据输出的数据,我们可以看到过去一个月药明康德(股票代码:603259.SS)的股票每天的开盘价、最高价、最低价、收盘价和成交量。这些数据可以帮助我们了解股票的变化情况。 接下来,我们可以对这些数据进行一些基本的分析,例如计算平均收盘价、最高价和最低价,以及成交量。以下是进行这些计算的代码: ```python # filename: stock_analysis.py import yfinance as yf import datetime # Define the stock to be analyzed stock_code = '603259.SS' # Define the time period end_date = datetime.datetime.now() start_date = end_date - datetime.timedelta(days=30) # Get the stock data stock_data = yf.download(stock_code, start_date, end_date) # Calculate the average close price average_close = stock_data['Close'].mean() # Calculate the highest price highest_price = stock_data['High'].max() # Calculate the lowest price lowest_price = stock_data['Low'].min() # Calculate the average volume average_volume = stock_data['Volume'].mean() # Print the results print(f'Average close price: {average_close}') print(f'Highest price: {highest_price}') print(f'Lowest price: {lowest_price}') print(f'Average volume: {average_volume}') ``` 请运行这段代码,它将输出过去一个月药明康德的平均收盘价、最高价、最低价和平均成交量。 -------------------------------------------------------------------------------- [31m >>>>>>>> EXECUTING CODE BLOCK 0 (inferred language is python)...[0m [33muser_proxy[0m (to assistant): exitcode: 0 (execution succeeded) Code output: Average close price: 53.55533345540365 Highest price: 63.97999954223633 Lowest price: 45.20000076293945 Average volume: 92733552.4 -------------------------------------------------------------------------------- [assistant[0m (to user_proxy): 根据输出的结果,我们可以得到以下分析: - 过去一个月药明康德的平均收盘价为53.56元。 - 过去一个月药明康德的最高价为63.98元。 - 过去一个月药明康德的最低价为45.20元。 - 过去一个月药明康德的平均成交量为92733552.4股。 这些数据可以帮助我们了解药明康德在过去一个月的股票表现。然而,这只是基本的分析,如果需要更深入的分析,可能需要考虑更多的因素,如市场环境、公司基本面、行业动态等。 TERMINATE --------------------------------------------------------------------------------
从上面的输出可以看出,assistant agent 编写了数据抓取代码和数据分析代码并执行了它们,并且可以处理遇到的错误,还是非常强大的。这个问题如果直接问 ChatGPT,它是不会直接给出答案的,但是通过使用 AutoGen 就可以获取答案,用来获取和分析实时数据是非常不错的。
我们还可以创建一个 chat group,这个 chat group 中可以有多个 assistant agent,每个 assistant agent 可以有不同的功能。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 user_proxy = autogen.UserProxyAgent( name="User_proxy" , system_message="A human admin." , code_execution_config={ "last_n_messages" : 2 , "work_dir" : "groupchat" , "use_docker" : False , }, human_input_mode="TERMINATE" , ) coder = autogen.AssistantAgent( name="Coder" , llm_config=llm_config, ) pm = autogen.AssistantAgent( name="Product_manager" , system_message="Creative in software product ideas." , llm_config=llm_config, ) groupchat = autogen.GroupChat(agents=[user_proxy, coder, pm], messages=[], max_round=12 ) manager = autogen.GroupChatManager(groupchat=groupchat, llm_config=llm_config) user_proxy.initiate_chat( manager, message="Find a latest paper about gpt-4 on arxiv and find its potential applications in software." )
关于 AutoGen 使用的更多例子,可以查看官方文档:https://microsoft.github.io/autogen/docs/Examples