Skip to main content

常见问题

安装正确的包 - pyautogen

PyPI 上 Autogen 包的名称是 pyautogen

pip install pyautogen

当使用错误的包时,可能会遇到以下常见错误:AttributeError: module 'autogen' has no attribute 'Agent'AttributeError: module 'autogen' has no attribute 'config_list_from_json' 等。

设置 API 端点

此文档已移至 此处

在 agents 中使用构建的配置列表

此文档已移至 此处

一个 agent 如何决定从列表中选择哪个模型?

此文档已移至 此处

Unexpected keyword argument 'base_url'

在版本 >=1 中,OpenAI 将 api_base 参数重命名为 base_url。因此,对于旧版本,请使用 api_base,而对于新版本,请使用 base_url

我可以使用非 OpenAI 的模型吗?

可以。目前有两种选项:

处理速率限制错误和超时错误

您可以设置 max_retries 来处理速率限制错误。您可以设置 timeout 来处理超时错误。它们都可以在 agent 的 llm_config 中指定,并将在 LLM 推理的 OpenAI 客户端中使用。如果在 config_list 中设置了它们,它们可以针对不同的客户端进行不同的设置。

  • max_retries (int): 单个客户端允许重试失败请求的总次数。
  • timeout (int): 单个客户端的超时时间(以秒为单位)。

有关更多信息,请参阅 文档

如何继续一个已完成的对话

当您调用 initiate_chat 时,默认情况下会重新开始对话。您可以使用 sendinitiate_chat(clear_history=False) 来继续对话。

max_consecutive_auto_reply vs max_turn vs max_round

我们如何决定每个代理使用哪个 LLM?可以使用多少个代理?我们如何决定群组中有多少个代理?

每个代理都可以进行定制。您可以在每个代理后面使用 LLM、工具或人类。如果您为代理使用 LLM,则使用最适合其角色的 LLM。代理的数量没有限制,但是可以从2、3个较小的数量开始。LLM 能力越强,所需角色越少,需要的代理数量就越少。

默认的用户代理代理不使用 LLM。如果您想在 UserProxyAgent 中使用 LLM,可以模拟用户的行为。

默认的助理代理被指示同时使用编码和语言技能。它不一定要进行编码,这取决于任务。您可以自定义系统消息。因此,如果您想将其用于编码,请使用擅长编码的模型。

为什么代码不保存为文件?

如果您为编码代理使用自定义的系统消息,请在系统消息中包含以下内容: 如果您希望用户在执行代码之前将代码保存到文件中,请将 # filename: <filename> 放在代码块的第一行。 这行代码是 AssistantAgent 的默认系统消息中的一部分。

如果建议的代码中仍然没有出现 # filename,请考虑在 initiate_chat 中的初始用户消息中添加明确的指示,例如“将代码保存到磁盘中”。 AssistantAgent 默认情况下不保存所有代码,因为有些情况下只是想完成一个任务而不保存代码。

旧版代码执行器

note

新版代码执行器提供了更多的执行后端选择。 了解更多关于 代码执行器 的信息。

通过在代理的构造函数中指定 code_execution_config 来使用旧版代码执行器。

from autogen import UserProxyAgent

user_proxy = UserProxyAgent(
name="user_proxy",
code_execution_config={"work_dir":"_output", "use_docker":"python:3"},
)

在这个例子中,code_execution_config 指定代码将在一个名为 python:3 的 Docker 容器中执行。 如果未指定,默认情况下镜像名称为 python:3-slimwork_dir 指定代码将被执行的目录。 如果代理运行 pip install 出现问题或出现类似于 Error while fetching server API version: ('Connection aborted.', FileNotFoundError(2, 'No such file or directory') 的错误,请检查配置。 你可以选择将图像设置为 'python:3',如上面的代码示例所示,这样应该就能解决问题了。

默认情况下,它在一个 Docker 容器中运行代码。如果你想在本地运行代码(不推荐),那么可以在 code_execution_config 的每个代码执行代理中将 use_docker 设置为 False,或者将 AUTOGEN_USE_DOCKER 设置为 False 作为环境变量。

你也可以在 Docker 容器中开发你的 AutoGen 应用程序。例如,在 GitHub codespace 中进行开发时,AutoGen 在一个 Docker 容器中运行。如果你不是在 GitHub Codespaces 中进行开发,请按照 这里 的说明在 Docker 中安装和运行 AutoGen。

使用 gpt-3.5-turbo 时,代理之间会互相致谢

使用 gpt-3.5-turbo 时,你经常会遇到代理进入“感激循环”的情况,这意味着当他们完成一个任务后,他们会开始不断地互相祝贺和感谢。这是 gpt-3.5-turbo 性能上的一个限制,与 gpt-4 相比,后者没有问题记住指令。这可能会阻碍你在尝试使用更便宜的模型测试自己的用例时的实验体验。

一个解决方法是在提示中添加一个额外的终止通知。这是一个“小提示”,让 LLM 记住他们在完成任务后需要终止对话。你可以通过将以下字符串附加到用户输入字符串中来实现:

prompt = "Some user query"

termination_notice = (
'\n\nDo not show appreciation in your responses, say only what is necessary. '
'if "Thank you" or "You\'re welcome" are said in the conversation, then say TERMINATE '
'to indicate the conversation is finished and this is your last message.'
)

prompt += termination_notice

注意:这个解决方法在大约 90% 的情况下都能解决问题,但有时 LLM 仍然会忘记终止对话。

在 Codespaces 中由于 sqlite3 的旧版本,ChromaDB 失败

(来自 issue #251

使用 ChromaDB 的代码示例(如检索)在 Codespaces 中失败,原因是 sqlite3 的要求不满足。

>>> import chromadb
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/vscode/.local/lib/python3.10/site-packages/chromadb/__init__.py", line 69, in <module>
raise RuntimeError(
RuntimeError: Your system has an unsupported version of sqlite3. Chroma requires sqlite3 >= 3.35.0.
Please visit https://docs.trychroma.com/troubleshooting#sqlite to learn how to upgrade.

解决方法:

  1. pip install pysqlite3-binary
  2. mkdir /home/vscode/.local/lib/python3.10/site-packages/google/colab 解释:根据这个gist,从官方的chromadb文档链接中可以看到,添加这个文件夹会触发chromadb使用pysqlite3而不是默认的数据库。

如何注册回复函数

(来自问题 #478

请参考这里 https://microsoft.github.io/autogen/docs/reference/agentchat/conversable_agent/#register_reply

例如,您可以注册一个回复函数,当代理收到消息并调用generate_reply时,该函数会被调用。

def print_messages(recipient, messages, sender, config):
if "callback" in config and config["callback"] is not None:
callback = config["callback"]
callback(sender, recipient, messages[-1])
print(f"Messages sent to: {recipient.name} | num messages: {len(messages)}")
return False, None # required to ensure the agent communication flow continues

user_proxy.register_reply(
[autogen.Agent, None],
reply_func=print_messages,
config={"callback": None},
)

assistant.register_reply(
[autogen.Agent, None],
reply_func=print_messages,
config={"callback": None},
)

在上面的代码中,我们注册了一个print_messages函数,每当代理的generate_reply在接收到消息后被触发时,该函数会被调用。

如何获取最后一条消息?

请参考 https://microsoft.github.io/autogen/docs/reference/agentchat/conversable_agent/#last_message

如何获取每个代理的消息?

请参考 https://microsoft.github.io/autogen/docs/reference/agentchat/conversable_agent#chat_messages

在使用autogen docker时,是否总是需要重新安装模块?

在代理的code_execution_config中,"use_docker"参数将被设置为执行后包含更改的映像的名称,当对话结束时。 您可以保存该映像名称。对于新的对话,您可以将"use_docker"设置为保存的映像名称以在那里开始执行。

数据库锁定错误

在使用Azure Machine Learning计算实例等虚拟机时,可能会遇到"database locked error"。这是因为LLM缓存试图写入应用程序无法访问的位置。

您可以将cache_path_root设置为应用程序可以访问的位置。例如,

from autogen import Cache

with Cache.disk(cache_path_root="/tmp/.cache") as cache:
agent_a.initate_chat(agent_b, ..., cache=cache)

您还可以使用Redis缓存代替磁盘缓存。例如,

from autogen import Cache

with Cache.redis(redis_url=...) as cache:
agent_a.initate_chat(agent_b, ..., cache=cache)

您还可以禁用缓存。有关详细信息,请参阅这里

代理由于docker未运行而抛出异常,我该如何解决这个问题?

如果在本地运行 AutoGen,执行代码的代理默认会尝试在 Docker 容器中执行代码。如果 Docker 没有运行,这将导致代理抛出错误。要解决这个问题,您有几个选项。

如果要完全禁用代码执行

  • 对于每个代码执行代理,将 code_execution_config 设置为 False。例如:
user_proxy = autogen.UserProxyAgent(
name="agent",
llm_config=llm_config,
code_execution_config=False)

如果要在 Docker 中运行代码执行

  • 推荐:确保 Docker 正在运行。

如果要在本地运行代码执行

  • 可以在每个代码执行代理的 code_execution_config 中将 use_docker 设置为 False
  • 要一次性为所有代码执行代理设置:将环境变量 AUTOGEN_USE_DOCKER 设置为 False

例如:

user_proxy = autogen.UserProxyAgent(
name="agent", llm_config=llm_config,
code_execution_config={"work_dir":"coding", "use_docker":False})

CompressibleAgentTransformChatHistory 迁移到 TransformMessages

为什么要迁移到 TransformMessages

迁移可以增强处理聊天消息转换的灵活性、模块化和定制性。TransformMessages 引入了一种改进的、可扩展的方法,用于预处理对话代理的消息。

如何迁移?

为了确保平稳的迁移过程,只需按照 Introduction to TransformMessages 中提供的详细指南进行操作。

如果出现错误 "TypeError: Assistants.create() got an unexpected keyword argument 'file_ids'",该怎么办?

这个错误通常发生在使用早于 0.2.27 版本的 Autogen 与 1.21 版本或更高版本的 OpenAI 库组合时。问题出现的原因是旧版本的 Autogen 不支持新版本的 OpenAI API 中使用的 file_ids 参数。 要解决这个问题,您需要将 Autogen 库升级到 0.2.27 或更高版本,以确保 Autogen 与 OpenAI 库的兼容性。

pip install --upgrade autogen

由于 "Hash sum mismatch",没有一个 devcontainer 能够构建,我该怎么办?

这是一个间歇性问题,似乎是由于某些镜像和代理问题引起的。 如果出现这个问题,请尝试用以下内容替换 apt-get update 步骤:

RUN echo "Acquire::http::Pipeline-Depth 0;" > /etc/apt/apt.conf.d/99custom && \
echo "Acquire::http::No-Cache true;" >> /etc/apt/apt.conf.d/99custom && \
echo "Acquire::BrokenProxy true;" >> /etc/apt/apt.conf.d/99custom

RUN apt-get clean && \
rm -r /var/lib/apt/lists/* && \
apt-get update -o Acquire::CompressionTypes::Order::=gz && \
apt-get -y update && \
apt-get install sudo git npm # and whatever packages need to be installed in this specific version of the devcontainer

这是 StackOverflow 上的两个建议的结合,分别是这里这里