使用AutoGen框架构建一个基础的协作代理团队。AutoGen为构建涉及多个代理的应用提供了灵活的抽象,这些代理可以互相交流和一起操作。目的是创建一个系统,其中一个代理充当研究员,另一个充当撰写者,它们合作生成一篇技术博客文章的提纲,根据用户的请求来完成。这个实践练习假设您已经安装了AutoGen (pip install pyautogen) 并且已配置好一个LLM端点(例如,通过环境变量如OPENAI_API_KEY或OAI_CONFIG_LIST JSON文件)。我们将侧重于设置代理、确定其角色、通过群聊建立交流,并启动协作任务。设置环境和LLM配置首先,确保您的环境已准备就绪。通常,AutoGen使用配置列表来指明要用的LLM。您可以使用环境变量或从JSON文件载入它。例如,一个OAI_CONFIG_LIST文件可能像这样:[ { "model": "gpt-4-turbo-preview", "api_key": "YOUR_API_KEY" } ]在我们的Python脚本中,我们将载入这个配置:import autogen import os # 从环境变量或文件载入LLM配置 # 示例假设设置了OAI_CONFIG_LIST环境变量, # 指向JSON字符串或文件路径。 # 替换为您的具体配置方法。 config_list = autogen.config_list_from_json( env_or_file="OAI_CONFIG_LIST", filter_dict={ "model": ["gpt-4-turbo-preview"] # 或您偏好的模型 } ) # LLM的配置参数 llm_config = { "timeout": 600, "cache_seed": 42, # 对于非确定性结果,使用None "config_list": config_list, "temperature": 0, # 较低的temperature可获得更确定的输出 }定义代理角色我们的协作团队需要三个核心组成部分:用户代理: 代表人类用户,启动任务并可能提供反馈。如果需要,它还可以执行代码,但此处我们不侧重于该功能。研究员代理: 一个基于LLM的助手,负责收集有关请求主题的信息。撰写者代理: 另一个基于LLM的助手,负责将收集到的信息组织成博客文章提纲。让我们使用AutoGen的UserProxyAgent和AssistantAgent来定义这些代理:# 定义用户代理 # 充当发起者,如果需要可以执行代码(human_input_mode="TERMINATE" 表示在一次交互后停止) user_proxy = autogen.UserProxyAgent( name="User_Proxy", system_message="寻求博客文章提纲的人类用户。", code_execution_config=False, # 本示例不需要代码执行 human_input_mode="TERMINATE", # 在收到最终回复后停止 is_termination_msg=lambda x: x.get("content", "").rstrip().endswith("TERMINATE"), ) # 定义研究员代理 researcher = autogen.AssistantAgent( name="Researcher", llm_config=llm_config, system_message="您是一位专业研究员。您的任务是寻找有关给定技术主题的相关信息和要点。请专注于准确性和深入性。不要撰写最终提纲,只提供研究结果。" ) # 定义撰写者代理 writer = autogen.AssistantAgent( name="Writer", llm_config=llm_config, system_message="您是一位专业技术撰写者。您的任务是将研究员提供的研究结果组织成清晰、有逻辑的博客文章提纲。包括引言、概念、实际案例(如适用)、结论等部分。确保结构流畅。以单词 TERMINATE 结束您的回复。" )注意每个助手代理的不同system_message。这对于引导他们在团队中的行为和专业分工非常重要。撰写者最终消息中的TERMINATE关键词以及UserProxyAgent中的is_termination_msg检查有助于控制对话流程。建立交流协议:群聊AutoGen通过GroupChat促成多代理对话。我们将已定义的代理加入一个群组,并实例化一个GroupChatManager来协调交互。# 创建群聊 groupchat = autogen.GroupChat( agents=[user_proxy, researcher, writer], messages=[], max_round=10 # 设置对话轮数的上限 ) # 创建群聊管理器 manager = autogen.GroupChatManager( groupchat=groupchat, llm_config=llm_config )max_round参数可避免无限循环并控制资源使用。GroupChatManager使用其自身的LLM配置来根据对话历史决定下一个发言的代理,除非提供了特定的发言者选择方法。digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="sans-serif", color="#4263eb", fontcolor="#495057"]; edge [color="#adb5bd"]; UserProxy [label="用户代理\n(发起者)"]; Manager [label="群聊管理器\n(协调者)", shape=ellipse, color="#1c7ed6"]; Researcher [label="研究员代理\n(LLM)", color="#1098ad"]; Writer [label="撰写者代理\n(LLM)", color="#0ca678"]; UserProxy -> Manager [label="启动任务"]; Manager -> Researcher [label="要求研究"]; Researcher -> Manager [label="提供结果"]; Manager -> Writer [label="要求撰写提纲"]; Writer -> Manager [label="提供提纲\n(以 TERMINATE 结束)"]; Manager -> UserProxy [label="交付最终提纲"]; }AutoGen群聊中博客文章提纲任务的基本交互流程。启动协作代理和交流结构确定后,UserProxyAgent现在可以通过向GroupChatManager发送初始消息来启动任务。# 定义任务提示 task_prompt = """ 请研究大型语言模型中检索增强生成(RAG)的核心思想,并创建一个博客文章提纲,涵盖其重要性、组成部分、典型工作流程和常见问题。 """ # 启动聊天 user_proxy.initiate_chat( manager, message=task_prompt, )运行与观察执行此脚本将触发多代理交互。UserProxyAgent将task_prompt发送给GroupChatManager。Manager根据提示和代理角色,可能会首先选择Researcher发言。Researcher处理请求,执行其“研究”(由LLM根据其内部知识模拟),并将其研究结果发布到聊天中。Manager收到研究结果,并在看到需要提纲后,选择Writer。Writer接收研究员的输入,根据其指令组织内容,创建提纲,附加TERMINATE,并将其发布到聊天中。Manager将Writer的最终消息转发给UserProxyAgent。UserProxyAgent看到消息中的TERMINATE条件满足,便结束了聊天。您将在控制台输出中观察到对话的展开,显示代理之间交换的消息。Writer的最终输出应是请求的博客文章提纲。扩展和考量此示例为使用AutoGen进行协作型MAS提供了基础模式。对于与专家级开发相关的更复杂情况,请考虑:更专业的角色: 如果任务需要,引入用于编辑、事实核查或代码生成的代理。复杂的发言者选择: 在GroupChat内实现自定义的发言者转换逻辑,而不是仅仅依赖于基于LLM的管理器。MAS中的工具使用: 使用AutoGen的函数调用功能,为代理(例如研究员)配备工具(如网络搜索API)。错误处理与恢复: 实现策略,使代理能够处理其他代理失败或提供错误信息的情况。状态管理: 对于更长或更复杂的协作,为每个代理或共享内存空间整合内存机制(如第3章所述)。替代框架: 了解CrewAI或LangGraph等框架,它们为多代理工作流程提供了不同的抽象(例如,基于角色的定义、状态图执行)。这个动手实践练习展示了设置和运行简单多代理系统的核心机制。基于这些思想,可以开发出更复杂、更有能力的应用程序,其中专业的LLM代理合作完成单个代理无法实现的目标。