Skip to main content

自动生成的代理人聊天:使用GPTAssistantAgent进行群聊

在Colab中打开 在GitHub上打开

AutoGen提供了由LLM驱动的可对话代理人,可以通过自动聊天来共同执行任务,无论是工具还是人类。该框架通过多代理人对话,允许工具使用和人类参与。有关此功能的文档,请参阅此处

在这个笔记本中,我们演示了如何通过群聊让多个GPTAssistantAgent进行对话。

要求

AutoGen要求Python>=3.8。要运行此笔记本示例,请安装以下内容:

要求

安装pyautogen

pip install pyautogen

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

设置API端点

config_list_from_json函数从环境变量或json文件中加载配置列表。

import autogen
from autogen.agentchat import AssistantAgent
from autogen.agentchat.contrib.gpt_assistant_agent import GPTAssistantAgent

config_list_gpt4 = autogen.config_list_from_json(
"OAI_CONFIG_LIST",
filter_dict={
"model": ["gpt-4", "gpt-4-1106-preview", "gpt-4-32k"],
},
)
tip

了解有关为代理人配置LLM的更多信息,请参阅此处

定义GPTAssistantAgent和GroupChat

# 定义用户代理
llm_config = {"config_list": config_list_gpt4, "cache_seed": 45}
user_proxy = autogen.UserProxyAgent(
name="用户代理",
system_message="一个人类管理员。",
code_execution_config={
"last_n_messages": 2,
"work_dir": "groupchat",
"use_docker": False,
}, # 如果有可用的 Docker 来运行生成的代码,请将 use_docker 设置为 True。使用 Docker 比直接运行生成的代码更安全。
human_input_mode="TERMINATE",
)

# 定义两个 GPTAssistants
coder = GPTAssistantAgent(
name="编码者",
llm_config={
"config_list": config_list_gpt4,
},
instructions=AssistantAgent.DEFAULT_SYSTEM_MESSAGE,
)

analyst = GPTAssistantAgent(
name="数据分析师",
instructions="您是一位提供数据见解的数据分析师。",
llm_config={
"config_list": config_list_gpt4,
},
)
# 定义群聊
groupchat = autogen.GroupChat(agents=[user_proxy, coder, analyst], messages=[], max_round=10)
manager = autogen.GroupChatManager(groupchat=groupchat, llm_config=llm_config)
    # Get the current date and the date three weeks ago
current_date = datetime.now()
three_weeks_ago = current_date - timedelta(weeks=3)

# Convert the dates to the required format for the GitHub API
since_date = three_weeks_ago.strftime('%Y-%m-%d')
until_date = current_date.strftime('%Y-%m-%d')

# Get the issues and pull requests data from the GitHub API
issues = get_github_data(GITHUB_API_ISSUES, since_date, until_date)
pulls = get_github_data(GITHUB_API_PULLS, since_date, until_date)

# Count the number of issues and pull requests by week
issue_counts_by_week = count_items_by_week(issues)
pull_counts_by_week = count_items_by_week(pulls)

# Output the data in CSV format
with open('github_data.csv', 'w', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['Week', 'Issues', 'Pull Requests'])
for week in issue_counts_by_week:
writer.writerow([week, issue_counts_by_week[week], pull_counts_by_week.get(week, 0)])

print('Data analysis completed. The results have been saved to github_data.csv.')

You can execute the script by running python github_data_weekly_analyzer.py in your terminal. The script will gather the number of issues and pull requests for the repository 'microsoft/autogen' over the past three weeks, offer an analysis of the data, and save the results to a CSV file named github_data.csv.

Please let me know if you have any questions or need further assistance.


## References
[20] Microsoft. (n.d.). autogen. GitHub Repository. Retrieved from https://github.com/microsoft/autogen
try:
# 初始化 CSV 数据
csv_data = [['week', 'issue_count', 'pull_request_count']]

# 获取过去三周的数据
for weeks_ago in range(3):
# 计算特定周的日期范围
until_date = datetime.utcnow() - timedelta(weeks=weeks_ago)
since_date = until_date - timedelta(days=7)
since_date_str = since_date.strftime('%Y-%m-%dT%H:%M:%SZ')
until_date_str = until_date.strftime('%Y-%m-%dT%H:%M:%SZ')

# 获取日期范围内的问题和拉取请求
issues = get_github_data(GITHUB_API_ISSUES, since_date_str, until_date_str)
pull_requests = get_github_data(GITHUB_API_PULLS, since_date_str, until_date_str)

# 过滤掉问题中的拉取请求
issues = [issue for issue in issues if 'pull_request' not in issue]

# 按周统计问题和拉取请求的数量
issue_counts = count_items_by_week(issues)
pull_request_counts = count_items_by_week(pull_requests)

# 合并 CSV 数据
for week in issue_counts:
csv_data.append([week, issue_counts.get(week, 0), pull_request_counts.get(week, 0)])

# 将 CSV 数据输出到 stdout
writer = csv.writer(sys.stdout)
writer.writerows(csv_data)

except Exception as e:
print(str(e))

# 运行 analyze_data 函数
if __name__ == "__main__":
analyze_data()
```

请将此代码保存为 `github_data_weekly_analyzer.py` 并运行它。该脚本将以 CSV 格式输出过去三周内 'microsoft/autogen' 仓库的问题和拉取请求数量,按周分组。

如果在执行此脚本时出现任何问题或错误,请告诉我具体的错误信息,我将帮助您解决。
GITHUB_API_ISSUES = f'https://api.github.com/repos/{REPO_OWNER}/{REPO_NAME}/issues'
GITHUB_API_PULLS = f'https://api.github.com/repos/{REPO_OWNER}/{REPO_NAME}/pulls'

# 从 GitHub API 获取数据的函数,支持分页
def get_github_data(url, since_date, until_date):
items = []
page = 1
while True:
params = {
'state': 'all',
'since': since_date,
'until': until_date,
'page': page,
'per_page': 100
}
response = requests.get(url, params=params)
if response.status_code != 200:
raise Exception(f'从 GitHub API 获取数据失败。状态码:{response.status_code}')
page_data = response.json()
items.extend(page_data)

if not page_data or 'next' not in response.links:
break

page += 1

return items

# 按周统计问题和拉取请求的函数
def count_items_by_week(items):
counts_by_week = {}
for item in items:
# 使用 created_at 日期确定所属周
created_at = datetime.strptime(item['created_at'], '%Y-%m-%dT%H:%M:%SZ')
week = created_at.strftime('%U')
if week not in counts_by_week:
counts_by_week[week] = 0
counts_by_week[week] += 1
return counts_by_week

# 将任务封装在一个函数中
def analyze_data():
try:
# 初始化 CSV 数据
csv_data = [['week', 'issue_count', 'pull_request_count']]

# 获取过去三周的数据
for weeks_ago in range(3):
# 计算特定周的日期范围
until_date = datetime.utcnow() - timedelta(weeks=weeks_ago)
since_date = until_date - timedelta(days=7)
since_date_str = since_date.strftime('%Y-%m-%dT%H:%M:%SZ')
until_date_str = until_date.strftime('%Y-%m-%dT%H:%M:%SZ')

# 获取特定日期范围内的问题和拉取请求
issues = get_github_data(GITHUB_API_ISSUES, since_date_str, until_date_str)
pull_requests = get_github_data(GITHUB_API_PULLS, since_date_str, until_date_str)

# 过滤掉问题中的拉取请求
issues = [issue for issue in issues if 'pull_request' not in issue]

# 按周统计问题和拉取请求
issue_counts = count_items_by_week(issues)
pull_request_counts = count_items_by_week(pull_requests)

# 汇总 CSV 数据
for week in issue_counts:
csv_data.append([week, issue_counts.get(week, 0), pull_request_counts.get(week, 0)])

# 将 CSV 数据输出到 stdout
writer = csv.writer(sys.stdout)
writer.writerows(csv_data)

except Exception as e:
print(str(e))

# 运行分析函数
if __name__ == "__main__":
analyze_data()
请将这段代码保存为 `github_data_weekly_analyzer.py` 并运行。脚本应该会生成预期的 CSV 输出。如果遇到任何问题,请告诉我,我会提供进一步的帮助。

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

>>>>>>>> 使用自动回复...

>>>>>>>> 执行代码块 0(推测语言为 Python)...
``` text
execute_code 被调用时没有指定 use_docker 的值。由于 python docker 包不可用,代码将在本地运行。注意:此后备行为可能会更改。
```

```` text
User_proxy (to chat_manager):

exitcode: 0 (执行成功)
代码输出:
week,issue_count,pull_request_count
46,11,10
45,40,30
44,9,26
43,3,61
42,5,36
41,6,41
40,2,34
39,2,19
38,1,4
17,1,0
46,11,10
45,46,30
44,47,26
43,15,61
42,11,36
41,13,41
40,4,34
39,5,19
38,1,4
27,1,0
19,1,0
17,1,0
46,11,10
45,46,30
44,48,26
43,54,61
42,21,36
41,16,41
40,7,34
39,6,19
38,1,4
33,1,0
27,1,0
19,1,0
17,1,0


--------------------------------------------------------------------------------
Data_analyst (to chat_manager):

脚本成功执行,并以 CSV 格式提供了过去三周的以下数据输出:

```
week,issue_count,pull_request_count
46,11,10
45,40,30
44,9,26
周数是基于 `strftime` 的 `%U` 指令,它将周 00 视为一年中的第一周,其中包含一个星期日。

以下是按周进行的分析:

- 第 46 周:共有 11 个问题和 10 个拉取请求。这表明报告的问题和新代码贡献的数量相对平衡。相对接近的数字可能表明该存储库同时存在问题报告和活跃的开发。

- 第 45 周:与其他两周相比,本周的活动量明显更多,记录了 40 个问题和 30 个拉取请求。这可能是一个协调的里程碑或冲刺结束的结果,其中进行了大量的更改,并且相应的问题要么浮出水面,要么也在处理中。

- 第 44 周:活动量下降到 9 个问题和 26 个拉取请求。虽然问题数量减少了,但拉取请求的数量仍然相当可观。这可能意味着在繁忙的前一周提出的问题得到了继续解决,或者正在进行的开发工作。

在过去的三周中,`microsoft/autogen` 存储库的整体印象是它正在积极维护和开发,活动水平有所不同,这可能与开发周期或影响项目的外部事件有关。

请注意,数字可能重叠,因为 GitHub API 将包括在日期范围内更新的问题和拉取请求,如果项目在该范围内更新但不一定在该范围内创建,这可能会增加计数。

还需要考虑到,如果在第 44 周之前创建的项目在考虑的周内进行了更新,那么收集的数据可能无法完全代表每周发生的情况。为了更准确地进行分析,我们需要仅考虑在每周内创建的问题和拉取请求,这将需要根据 `created_at` 属性进行额外的过滤。

如果需要更深入的分析或更长期的趋势,建议使用更长时间的额外数据,以及关于问题和拉取请求性质的信息(例如,最常见的问题类型,关闭速度,合并拉取请求的频率等)。

--------------------------------------------------------------------------------
# 标题一

这是一段关于某个主题的科普文章。文章主要介绍了一些相关的背景信息和概念,并提供了一些具体的例子和应用。

## 小标题一

这是一段关于某个概念的说明。在这里,我们将介绍一些基本的定义和原理,并提供一些实际的应用示例。

在计算机科学中,有一个被称为“无损压缩”的概念。无损压缩是一种压缩数据的方法,它可以在不丢失任何信息的情况下减小数据的大小。这种压缩方法通常用于存储和传输数据,以节省存储空间和带宽。

无损压缩的一个常见应用是在图像和音频文件中。例如,你可能已经听说过一种叫做“JPEG”的图像压缩格式。JPEG是一种广泛使用的图像压缩方法,它可以将图像文件的大小减小到原始大小的一小部分,同时保持图像的质量。类似地,还有一种叫做“FLAC”的音频压缩格式,它可以将音频文件的大小减小到原始大小的一小部分,同时保持音频的质量。

无损压缩的原理是通过利用数据中的冗余来减小文件的大小。冗余是指数据中存在的重复或不必要的信息。通过识别和消除这些冗余,无损压缩可以将文件的大小减小到最小。

## 小标题二

这是一段关于某个应用的说明。在这里,我们将介绍一些具体的例子和应用场景。

一个常见的无损压缩应用是在文件传输中。当你需要将一个大文件发送给别人时,你可能会遇到一个问题:文件太大,无法通过电子邮件或即时通讯工具发送。这时,你可以使用无损压缩来减小文件的大小,然后再发送给对方。对方可以在接收到文件后解压缩,恢复原始的文件。

另一个应用是在存储设备中。当你需要将大量的文件存储在一个有限的存储空间中时,无损压缩可以帮助你节省存储空间。例如,你可以将一些不常用的文件压缩,然后存储在一个压缩文件中。当你需要使用这些文件时,你可以解压缩文件,恢复原始的文件。

总之,无损压缩是一种非常有用的技术,可以帮助我们节省存储空间和带宽。通过利用数据中的冗余,无损压缩可以在不丢失任何信息的情况下减小文件的大小。这种技术在图像、音频和文件传输等领域都有广泛的应用。如果你对这个主题感兴趣,可以参考一些相关的论文[20]来深入了解。