Skip to main content

SocietyOfMindAgent

在 Colab 中打开 在 GitHub 上打开

本笔记本演示了 SocietyOfMindAgent,它将一个群聊作为内部的自言自语,但在外部世界中表现为一个单一的代理。这带来了三个明显的优势:

  1. 它提供了一种清晰的方式来生成代理的层次结构,将复杂性隐藏在内部的自言自语中。
  2. 它提供了一种一致的方式来从冗长的群聊中提取答案(通常,不清楚哪条消息是最终的回复,并且提取出来的回复本身可能并不总是以独立的消息形式呈现出来)。
  3. 当代理超出其上下文窗口限制时,它提供了一种恢复的方式(内部的自言自语受到 try-catch 块的保护)。
需求

安装 pyautogen

pip install pyautogen

更多信息,请参阅安装指南

import autogen  # noqa: E402

llm_config = {
"timeout": 600,
"cache_seed": 44, # 更改种子以进行不同的试验
"config_list": autogen.config_list_from_json(
"OAI_CONFIG_LIST",
filter_dict={"model": ["gpt-4", "gpt-4-0613", "gpt-4-32k", "gpt-4-32k-0613", "gpt-4-1106-preview"]},
),
"temperature": 0,
}
tip

了解有关为代理配置 LLM 的更多信息,请点击此处

两个代理的示例群聊

在这个示例中,我们将使用一个 AssistantAgent 和一个 UserProxy 代理(配置为执行代码)共同解决一个问题。执行代码需要至少两个对话轮次(一个用于编写代码,一个用于执行代码)。如果代码失败或需要进一步完善,则可能还需要额外的轮次。然后,我们将这些代理封装在一个 SocietyOfMindAgent 中,将内部讨论隐藏起来,不会被其他代理看到(但会显示在控制台中),并确保响应适合作为独立的消息。

构建内部自言自语的代理

我们首先构建内部自言自语的代理。这些是真正工作的代理。

assistant = autogen.AssistantAgent(
"内部助手",
llm_config=llm_config,
is_termination_msg=lambda x: x.get("content", "").find("TERMINATE") >= 0,
)

code_interpreter = autogen.UserProxyAgent(
"内部代码解释器",
human_input_mode="NEVER",
code_execution_config={
"work_dir": "coding",
"use_docker": False,
},
default_auto_reply="",
is_termination_msg=lambda x: x.get("content", "").find("TERMINATE") >= 0,
)

groupchat = autogen.GroupChat(
agents=[assistant, code_interpreter],
messages=[],
speaker_selection_method="round_robin", # 对于两个代理人来说,这相当于一对一的对话。
allow_repeat_speaker=False,
max_round=8,
)

manager = autogen.GroupChatManager(
groupchat=groupchat,
is_termination_msg=lambda x: x.get("content", "").find("TERMINATE") >= 0,
llm_config=llm_config,
)

构建并运行 SocietyOfMind Agent

我们现在将内部的群聊包装成 SocietyOfMind Agent,并创建一个 UserProxy 与其进行通信。

from autogen.agentchat.contrib.society_of_mind_agent import SocietyOfMindAgent  # noqa: E402

task = "2024年哪些日期微软股票高于370美元?"

society_of_mind_agent = SocietyOfMindAgent(
"society_of_mind",
chat_manager=manager,
llm_config=llm_config,
)

user_proxy = autogen.UserProxyAgent(
"user_proxy",
human_input_mode="NEVER",
code_execution_config=False,
default_auto_reply="",
is_termination_msg=lambda x: True,
)

user_proxy.initiate_chat(society_of_mind_agent, message=task)
user_proxy (to society_of_mind):

2024年哪些日期微软股票高于370美元?

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...
society_of_mind (to chat_manager):

2024年哪些日期微软股票高于370美元?

--------------------------------------------------------------------------------
inner-assistant (to chat_manager):

要找出2024年微软股票(MSFT)哪些日期的股价高于370美元,通常需要访问历史股价数据。这些数据可以从金融数据提供商或提供股市数据的 API 获取。

一种常见的访问这些数据的方式是使用 Python 中的 `yfinance` 库,它允许我们从 Yahoo Finance 下载历史股价。然而,由于我无法直接访问互联网或外部 API,我将为您提供一段 Python 脚本,您可以在您的机器上运行以获取数据并确定2024年 MSFT 股价高于370美元的日期。

如果您还没有安装 `yfinance` 库,请在终端中运行 `pip install yfinance` 进行安装,然后运行以下 Python 脚本:

```python
# 文件名: msft_stock_analysis.py
import yfinance as yf
from datetime import datetime

# 定义股票代码和日期范围
ticker_symbol = "MSFT"
start_date = "2024-01-01"
end_date = "2024-12-31"

# 下载历史股价数据
msft_data = yf.download(ticker_symbol, start=start_date, end=end_date)

# 过滤股价高于370美元的日期
days_higher_than_370 = msft_data[msft_data['Close'] > 370]

# 打印日期
print("2024年微软股票高于370美元的日期:")
for date in days_higher_than_370.index:
print(date.strftime('%Y-%m-%d'))
这个脚本将下载2024年微软股票的历史数据,并打印出收盘价高于370美元的日期。请运行这个脚本并提供输出结果。

--------------------------------------------------------------------------------

>>>>>>>> 执行代码块 0 (推测语言为 python)...
内部代码解释器 (给 chat_manager):

退出码: 1 (执行失败)
代码输出:
Traceback (most recent call last):
File "msft_stock_analysis.py", line 2, in <module>
import yfinance as yf
ModuleNotFoundError: No module named 'yfinance'


--------------------------------------------------------------------------------
内部助手 (给 chat_manager):

错误提示表明您的系统上没有安装 `yfinance` 模块。要解决这个问题,您需要安装 `yfinance` 库。请在终端中运行以下命令来安装它:

```sh
在开始之前,我们需要先安装 `yfinance` 库。可以通过以下命令使用 `pip` 进行安装:

```
pip install yfinance
```

这个库可以让我们方便地从 Yahoo Finance 获取金融数据。安装完成后,我们就可以开始使用它了。
在安装了`yfinance`之后,请尝试再次运行提供的Python脚本。如果遇到任何问题,请告诉我。

--------------------------------------------------------------------------------

>>>>>>>> 执行代码块 0(推测的语言是sh)...
内部代码解释器(给chat_manager):

退出码:0(执行成功)
代码输出:
正在收集 yfinance
正在使用缓存的 yfinance-0.2.36-py2.py3-none-any.whl(72 kB)
要求已满足:lxml>=4.9.1(来自 yfinance)(5.1.0)
要求已满足:appdirs>=1.4.4(来自 yfinance)(1.4.4)
要求已满足:pytz>=2022.5(来自 yfinance)(2023.3.post1)
要求已满足:pandas>=1.3.0(来自 yfinance)(2.2.0)
要求已满足:peewee>=3.16.2(来自 yfinance)(3.17.0)
要求已满足:requests>=2.31(来自 yfinance)(2.31.0)
要求已满足:beautifulsoup4>=4.11.1(来自 yfinance)(4.12.3)
要求已满足:numpy>=1.16.5(来自 yfinance)(1.26.3)
要求已满足:html5lib>=1.1(来自 yfinance)(1.1)
要求已满足:frozendict>=2.3.4(来自 yfinance)(2.4.0)
要求已满足:multitasking>=0.0.7(来自 yfinance)(0.0.11)
要求已满足:soupsieve>1.2(来自 beautifulsoup4>=4.11.1->yfinance)(2.5)
要求已满足:six>=1.9(来自 html5lib>=1.1->yfinance)(1.16.0)
要求已满足:webencodings(来自 html5lib>=1.1->yfinance)(0.5.1)
要求已满足:python-dateutil>=2.8.2(来自 pandas>=1.3.0->yfinance)(2.8.2)
要求已满足:tzdata>=2022.7(来自 pandas>=1.3.0->yfinance)(2023.4)
要求已满足:certifi>=2017.4.17(来自 requests>=2.31->yfinance)(2023.11.17)
要求已满足:charset-normalizer<4,>=2(来自 requests>=2.31->yfinance)(3.3.2)
要求已满足:idna<4,>=2.5(来自 requests>=2.31->yfinance)(3.6)
要求已满足:urllib3<3,>=1.21.1(来自 requests>=2.31->yfinance)(2.1.0)
正在安装收集到的软件包:yfinance
成功安装 yfinance-0.2.36


--------------------------------------------------------------------------------
内部助手(给chat_manager):

看起来`yfinance`库已经成功安装。现在,该库可用后,请再次运行之前提供的Python脚本,以获取Microsoft的历史股价,并确定2024年股价高于370美元的日期。

这里是脚本,供您参考:

```python
# 文件名: msft_stock_analysis.py
import yfinance as yf
from datetime import datetime

# 定义股票代码和日期范围
ticker_symbol = "MSFT"
start_date = "2024-01-01"
end_date = "2024-12-31"

# 下载历史股票价格数据
msft_data = yf.download(ticker_symbol, start=start_date, end=end_date)

# 筛选股价高于370美元的日期
days_higher_than_370 = msft_data[msft_data['Close'] > 370]

# 打印日期
print("2024年微软股票价格高于370美元的日期:")
for date in days_higher_than_370.index:
print(date.strftime('%Y-%m-%d'))
```

请执行这个脚本并将输出结果提供给我。

--------------------------------------------------------------------------------

>>>>>>>> 执行代码块 0 (推测语言为python)...
内部代码解释器 (to chat_manager):

退出码: 0 (执行成功)
代码输出:
2024年微软股票价格高于370美元的日期:
2024-01-02
2024-01-03
2024-01-08
2024-01-09
2024-01-10
2024-01-11
2024-01-12
2024-01-16
2024-01-17
2024-01-18
2024-01-19


--------------------------------------------------------------------------------
内部助手 (to chat_manager):

输出结果表明,2024年微软股票(MSFT)在以下日期的股价高于370美元:

- 2024年1月2日
- 2024年1月3日
- 2024年1月8日
- 2024年1月9日
- 2024年1月10日
- 2024年1月11日
- 2024年1月12日
- 2024年1月16日
- 2024年1月17日
- 2024年1月18日
- 2024年1月19日

请注意,此列表仅包含输出中提供的日期,并可能不完整涵盖整个2024年。如果股票价格在除上述日期之外的其他日期高于370美元,脚本将列出更多日期。

终止

--------------------------------------------------------------------------------
society_of_mind (to user_proxy):

2024年微软股票(MSFT)在以下日期的股价高于370美元:

- 2024年1月2日
- 2024年1月3日
- 2024年1月8日
- 2024年1月9日
- 2024年1月10日
- 2024年1月11日
- 2024年1月12日
- 2024年1月16日
- 2024年1月17日
- 2024年1月18日
- 2024年1月19日

--------------------------------------------------------------------------------

#### 备注

关于这个输出结果有几个要注意的地方:- 首先,user_proxy只向society_of_mind agent发送了一条消息,并且只收到了一条响应消息。就它而言,society_of_mind agent是聊天中唯一的agent。- 其次,最终的响应以独立的方式进行格式化。与之前的响应不同,它没有提到先前的脚本或执行,并且缺少结束内心独白的TERMINATE关键字。