返回

AutoGen GroupChat 400 错误:快速解决消息名称问题

Ai

AutoGen GroupChat 报错:openai.BadRequestError (Error code: 400) 问题解决

使用 AutoGen 的 GroupChat 功能时,遇到 openai.BadRequestError,错误代码 400,错误信息显示Invalid 'messages[2].name': string does not match pattern,这让人头疼!别慌,咱们来一步步解决它。

一、问题原因分析

这个错误信息很明确地指出了问题所在:messages[2].name 的值不符合 OpenAI API 的要求。OpenAI 期望这个 name 字段的值是一个符合 ^[a-zA-Z0-9\_-]+\$ 正则表达式的字符串,也就是说,它只能包含字母、数字、下划线和破折号。

问题可能出在哪里呢? 多半是因为我们在构建 GroupChat 中的 Agent 时,给 Agent 的 name 属性设置了不符合规范的字符。例如,空格、中文、特殊符号等等。

二、解决方案

针对这个问题,我们可以从以下几个方面入手解决:

1. 检查 Agent 名称

最直接的方法,就是检查所有参与 GroupChat 的 Agent 的名称。 确保它们的 name 属性只包含字母、数字、下划线和破折号。

代码示例(错误):

user_proxy = autogen.UserProxyAgent(
    name="User Proxy (管理者)",  # 包含空格,错误!
    # ... 其他配置 ...
)

coder = autogen.AssistantAgent(
    name="Code 编写员",          # 包含中文和空格,错误!
    # ... 其他配置 ...
)

groupchat = autogen.GroupChat(agents=[user_proxy, coder], messages=[], max_round=12)
manager = autogen.GroupChatManager(groupchat=groupchat, llm_config=llm_config)

代码示例(正确):

user_proxy = autogen.UserProxyAgent(
    name="User_Proxy",  # 正确的名称
    # ... 其他配置 ...
)

coder = autogen.AssistantAgent(
    name="Coder",          # 正确的名称
    # ... 其他配置 ...
)
groupchat = autogen.GroupChat(agents=[user_proxy, coder], messages=[], max_round=12)
manager = autogen.GroupChatManager(groupchat=groupchat, llm_config=llm_config)

操作步骤:

  1. 逐个检查 Agent 定义。
  2. 找到 name 属性。
  3. 修改为符合规范的名称。
  4. 重新运行代码。

2. 检查 system_message (如果使用了自定义的 system_message)

有时候,我们可能会自定义 Agent 的 system_message,在这个过程中,也可能引入不合法的字符,进而影响到消息传递。

代码示例 (错误):

coder = autogen.AssistantAgent(
    name="Coder",
    system_message="你是代码大师(Coder)。", #中文括号导致后续处理出错。
    llm_config=llm_config,
)

代码示例 (正确):

coder = autogen.AssistantAgent(
    name="Coder",
    system_message="你是代码大师Coder.", #避免特殊符号。
    llm_config=llm_config,
)

解决办法
审查自定义system_message是否有特殊符号。

3. 使用 AutoGen 的内置名称规范化(进阶)

AutoGen 其实已经考虑到了这个问题,它提供了一些内置的工具来帮助我们规范化 Agent 的名称。

方法一:autogen.utils.sanitize_model_name

这个函数可以用来清理字符串,使其符合 OpenAI API 的要求。我们可以在创建 Agent 之前,先用这个函数处理一下名称。

from autogen.utils import sanitize_model_name

user_proxy_name = "User Proxy (管理者)"
coder_name = "Code 编写员"

user_proxy = autogen.UserProxyAgent(
    name=sanitize_model_name(user_proxy_name),
    # ... 其他配置 ...
)

coder = autogen.AssistantAgent(
    name=sanitize_model_name(coder_name),
    # ... 其他配置 ...
)
groupchat = autogen.GroupChat(agents=[user_proxy, coder], messages=[], max_round=12)
manager = autogen.GroupChatManager(groupchat=groupchat, llm_config=llm_config)

这种方法更加稳妥,可以预防一些我们没有注意到的非法字符。

方法二:利用get_human_input函数(如果涉及用户交互)
如果你使用了UserProxyAgent,且用户可能输入agent的name, 也可以做类似处理。

# 假设在某个地方,用户输入了agent name
user_input_name = input("请输入Agent的名称:")

agent_name = autogen.utils.sanitize_model_name(user_input_name)

4. 深入调试(如果以上方法都不奏效)

如果以上方法都无法解决问题,那么我们需要更深入地进行调试。

步骤:

  1. 打印消息: 在代码中添加打印语句,打印出 GroupChat 传递的 messages 列表的内容。

    groupchat = autogen.GroupChat(agents=[user_proxy, coder], messages=[], max_round=12)
    manager = autogen.GroupChatManager(groupchat=groupchat, llm_config=llm_config)
    
    # 假设在某个地方触发了对话
    user_proxy.initiate_chat(manager, message="请编写一个 Python 函数...")
    
    print(groupchat.messages) # 打印消息内容
    
    
  2. 检查 messages[2].name 查看打印出的消息,找到 messages 列表中的第三个元素(索引为 2),看看它的 name 字段到底是什么值。

  3. 定位问题: 根据 name 的值,回溯代码,找出是哪个地方给它设置了这个值。

    • 很有可能是在自定义 system_message时, 或在UserProxyAgent与用户的交互处理中出现了不合规字符。
  4. 检查OpenAI API 版本 : 虽然通常不是直接原因,但仍建议检查一下 OpenAI API 的版本, 保持库的更新。

    pip install --upgrade openai
    pip install --upgrade pyautogen
    

三、安全建议

这个问题与安全没有直接关系,但良好的命名习惯有助于提高代码的可读性和可维护性。 保持Agent名称的清晰和一致,对以后管理、维护都有很大帮助。

希望上面的方法能够帮您解决 AutoGen GroupChat 报错的问题!