You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非RetrieveUserProxyAgent发起群聊时该代理未初始化的解决问询

非RetrieveUserProxyAgent发起对话时的检索初始化问题

智能体配置

定义了四个AutoGen智能体:

  • navigator(AssistantAgent):处理通用导航类任务
  • boss(UserProxyAgent):作为用户交互入口
  • expert(RetrieveUserProxyAgent):负责特定信息的检索
  • expertSub(AssistantAgent):基于expert检索到的信息生成回答

群聊配置

群聊及管理器的代码实现:

groupchat = autogen.GroupChat(
    agents=[boss, navigator, expert, expertSub], messages=[], max_round=12,
    speaker_selection_method=custom_speaker_selection_func,
)
manager = autogen.GroupChatManager(groupchat=groupchat, llm_config=llm_config)

问题现象

  1. 从expert发起对话(正常场景):
    调用expert.initiate_chat启动对话时,检索功能正常工作,终端会输出chromadb相关初始化日志:

    result = expert.initiate_chat(
        manager,
        message=expert.message_generator,
        problem=firstQuery,
        n_results=2,
    )
    
  2. 从boss发起对话(异常场景):
    当通过boss.initiate_chat启动对话时,需navigator处理的查询可正常执行,但任务委派给expert后,程序仅输出Next speaker: Expert就终止,无任何错误或异常提示,且终端无chromadb初始化日志,推测检索组件未完成初始化:

    result = boss.initiate_chat(
        manager,
        message=firstQuery
    )
    

需求

希望从boss作为对话发起入口,当GroupManager将需要检索的任务委派给expert时,expert能自动完成检索组件的初始化并正常执行检索操作。


解决方案

问题根源在于RetrieveUserProxyAgent的检索初始化逻辑默认仅在自身的initiate_chat方法中触发,从其他代理发起对话时不会自动执行。可通过以下两种方式解决:

方案1:提前手动初始化检索组件

在boss发起对话前,手动调用expert的retrieve_init方法完成chromadb初始化:

# 在创建manager之后、启动boss对话之前执行
expert.retrieve_init(
    vector_db_path="./chromadb",  # 替换为你的向量数据库存储路径
    n_results=2,  # 需与业务需求匹配的检索结果数量
    # 可添加其他检索相关参数,如embedding模型配置等
)

此方式简单直接,确保expert的检索环境在对话启动前就已准备完毕。

方案2:自定义触发逻辑,首次被调用时自动初始化

修改expert的receive方法,使其在首次接收消息时自动触发初始化:

# 保存原receive方法
original_receive = expert.receive

def custom_receive(self, message, sender, silent=False):
    # 标记是否已完成初始化
    if not hasattr(self, "_retrieve_initialized") or not self._retrieve_initialized:
        self.retrieve_init(
            vector_db_path="./chromadb",
            n_results=2,
        )
        self._retrieve_initialized = True
    # 调用原receive方法处理消息
    return original_receive(self, message, sender, silent)

# 替换expert的receive方法
expert.receive = custom_receive.__get__(expert, type(expert))

此方式无需提前手动操作,当GroupManager首次将任务分配给expert时,会自动完成检索组件的初始化。

注意事项

  • 确保retrieve_init的参数(如n_results、向量库路径)与你之前在initiate_chat中使用的参数一致,避免检索行为不一致。
  • 检查custom_speaker_selection_func逻辑,确保它能正确识别需要检索的任务并分配给expert,避免委派错误导致的流程中断。

内容的提问来源于stack exchange,提问作者Teran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 13:45:04