018、AutoGen入门:多智能体初体验 018、AutoGen入门多智能体初体验昨晚调一个AutoGen的对话流程卡在两个Agent互相踢皮球整整三个小时。最后发现是max_consecutive_auto_reply参数没设对两个Agent一个说“这个问题需要设计专家确认”另一个立刻回“好的我转给设计专家”然后转来转去日志刷了上百条。那一刻我盯着终端突然意识到多智能体系统最可怕的不是模型不够聪明是Agent太有礼貌了。今天这篇笔记就从这种“礼貌死循环”聊起带你走一遍AutoGen最基础的多智能体搭建我会把踩过的坑直接标在代码注释里别嫌啰嗦这些坑我都是用头发换的。先说环境。老规矩pip install pyautogen版本我用的0.2.x注意0.4以后API改了不少网上很多老教程跑不通多半是版本问题。装完先验证一下import autogen能过就继续。接下来要做的第一件事不是写Agent是配置LLM。AutoGen本身不产生模型它只是把模型包装成“会说话的工人”。所以需要一个config_list里面塞进你的模型API信息。如果你用的是OpenAI兼容接口比如本地跑的vLLM或者代理服务直接把base_url指过去就行。这里有个坑——api_key写不写都行但有些代理服务会严格校验最好填个占位符别留空。我之前用某个内部网关空字符串直接报401排查了半天还以为是网络问题。配置好模型开始创建第一个Agent。AutoGen里最核心的概念是ConversableAgent几乎所有Agent都是从它派生的。一个最简单的助理Agent长这样assistantautogen.ConversableAgent(nameassistant,system_message你是一名资深技术专家回答问题时简洁准确。,llm_config{config_list:config_list},human_input_modeNEVER,)human_input_modeNEVER的意思是这个Agent不会停下来问你意见全程自动跑。如果你希望它每个回合都让你确认就设成ALWAYS。还有一个TERMINATE模式只有在它判断该结束对话时才会来问你这个日常调试比较有用。别问我为啥不直接用TERMINATE因为如果你不写清楚终止条件它会一直“我觉得我们已经达成共识了”然后继续聊下去。现在让一个Agent太孤单再来一个。我想模拟一个“编程主管”和一个“测试工程师”的协作。主管Agent负责写代码测试Agent负责审查代码。这里有一个关键点两个Agent的任务边界必须清晰否则就是开头那种踢皮球。我踩过的坑是——让两个Agent都“具有全面的能力”结果谁都不肯先动手互相谦让了十几轮。正确的做法是给每个Agent一个明确的system_message并且写清楚“你要做什么”以及“做完后如何交接”。coderautogen.ConversableAgent(namecoder,system_message你是编程主管。根据需求编写Python代码写完直接发送。不需要解释不需要问问题。,llm_config{config_list:config_list},human_input_modeNEVER,)testerautogen.ConversableAgent(nametester,system_message你是测试工程师。收到代码后运行并检查如果正确回复代码正确并结束对话如果错误指出问题并让coder修改。,llm_config{config_list:config_list},human_input_modeNEVER,)注意tester的system_message里明确写了“如果正确回复’代码正确’并结束对话”。这个“结束对话”不是口头说说要和AutoGen的终止机制配合。AutoGen里一个Agent如果发送了is_termination_msg中定义的消息对话就会停止。你可以定义一个函数检测返回内容是否包含“代码正确”。这个函数要挂在initiate_chat里的is_termination_msg参数上或者通过register_reply逻辑控制。别偷懒不写否则两个Agent会无限循环每次都是“好的我们再检查一遍”然后模型token烧得飞快。下面真正让它们跑起来resultcoder.initiate_chat(tester,message请实现一个计算斐波那契数列的函数输入n返回第n项。,max_turns5,is_termination_msglambdamsg:代码正确inmsg[content],)max_turns5是一个安全网。就算终止条件没触发跑满5轮也会强制停下来。这个参数强烈建议先设小一点比如3或者5跑通了再调大。我习惯调试时设2等确认逻辑没问题再改。还有initiate_chat的返回值result里面包含了整个对话历史可以用来复盘。打印result.chat_history就能看到每个Agent说了什么。之前有个诡异的问题两个Agent明明聊得很欢但最后什么结果都没留下。后来才发现是我忘了把result保存下来以为对话会自动存到某个日志文件天真。现在跑一下这个例子。你会发现coder先写一段代码tester收到后运行这里有个前提tester必须能执行代码否则它只能“假装运行”。AutoGen有个code_execution_config参数可以让你指定代码执行的工作目录。如果不配置Agent只是文本生成并不会真的跑代码。于是我给tester加上代码执行能力testerautogen.ConversableAgent(nametester,system_message你是测试工程师。收到代码后运行并检查...,llm_config{config_list:config_list},human_input_modeNEVER,code_execution_config{work_dir:coding,use_docker:False,},)work_dir是代码生成后存放的目录use_dockerFalse表示直接用本机python执行。这里有个安全提示——让Agent执行任意代码有风险生产环境别这么干。但咱们本地调试图个方便。另外很多教程喜欢用Docker隔离如果你机器装了Dockeruse_dockerTrue更安全。我当时图省事用False结果Agent生成了一段删文件的代码不是故意的就是模型跑偏了吓得我赶紧把work_dir设成临时目录。所以后来我都建议哪怕不打算用Docker也把work_dir指向一个空目录至少别放重要文件。跑起来之后观察终端输出。AutoGen会打印类似“ FROM coder to tester”这样的字样让你清楚看到是谁在说话。你会发现一个现象coder写完代码后tester可能不会真的去执行而是说“我检查了代码逻辑正确”。这是因为模型没有触发代码执行工具。为了让tester真的运行你需要允许它调用execute_code函数。AutoGen内置了一个code_executor组件但用起来有点绕。简单办法在创建tester时把code_execution_config配上并且确保system_message里写了“你需要运行代码”。但即使这样模型也未必买账。我试过好几次它直接分析代码而不执行原因可能是system_message不够强硬。后来我改成“你必须运行代码将运行结果作为判断依据”执行率才上来。所以提示词里“必须”这个词对模型还挺管用。多智能体不只有两个你可以加第三个。比如加一个reviewer负责审阅coder和tester的对话给出最终总结。这时的结构就不是简单的一对一而是链式或图式。AutoGen里最灵活的方式是手写chat_queue或者用GroupChat和GroupChatManager。以我经验新手阶段先把两个Agent玩透再加第三个。因为每多一个Agent可能出现的诡异对话就翻一倍。我试过三个Agent互相讨论一个算法结果它们开始聊起了人生哲学完全忘了原始需求。最后靠max_turns强制打断一看记录模型已经用莎士比亚风格在讨论时间复杂度了。再聊聊调试技巧。多智能体出了问题第一件事不是改代码是看“谁在什么时候说了什么”。AutoGen提供了result.chat_history我经常直接把它dump成json然后人肉翻。翻的时候注意几个标志性症状如果某个Agent连续回复好几条可能是它的max_consecutive_auto_reply在0.2版本里叫这个名字新版本可能换了没有限制导致它一条接一条自发说话。我踩过这个坑发现Agent自己和自己对话了因为两个Agent的底层其实是同一个模型接口它们共享了上下文容易角色串线。解决方法把max_consecutive_auto_reply1让每个Agent每轮最多说一次话。另一个症状Agent回复“正如我之前所说”说明它发现自己重复了但不知道如何退出。这时需要检查终止条件是不是太严格或者system_message里没有给出明确的出口。比如我就让tester在发现coder已经修改过两次代码后直接回复“无法解决需要人工介入”这样就能跳出循环。最后说点个人经验。AutoGen这类多智能体框架真正的工作量不在写代码在于设计Agent的“人格”。你别把Agent当作函数要当作一个角色。你要给这个角色设定好它的职责、权限、工作流程、以及遇到什么情况必须停下来。很多AI工程师一开始让Agent自由发挥结果就是失控。我现在的习惯是每个Agent的system_message里必须包含四要素我是谁、我要做什么、我做完了怎么交接、什么情况算完不成。四要素写清楚再配合max_turns和终止条件基本能稳定跑通。另外别迷信“智能体越多越强大”。一个复杂任务拆成两个Agent清晰度比拆成五个高得多。多智能体最大的价值是隔离关注点而不是堆数量。如果你想体验“真正的人工智能团队”从两个Agent开始一个写一个审就是最好的起点。等它们配合默契了再慢慢加人那时候才会发现原来模型的幻觉在团队协作里竟然能被部分对冲掉。这感觉挺奇妙的像一个不靠谱的同事和一个较真的同事互相盯梢最后交出来的东西居然比单个人靠谱。好了这篇笔记先写到这里下篇我打算聊聊AutoGen里常用的GroupChat管理模式以及如何让Agent复用人话而不是一直说“收到”。