人该在哪一环插手?这是把"自动"和"可控"接起来的关键。完全自动快但危险,全程人工稳但慢。AutoGen 用 human_input_mode 把这条调节阀做成了档位,这一节讲怎么在真实任务里用对。
我们的判断:开发用 ALWAYS 看清每一步;灰度用 TERMINATE 留刹车;只有任务低风险且已验证才上 NEVER。
from autogen import UserProxyAgent import os cfg = {"model": "gpt-4o-mini", "api_key": os.environ.get("OPENAI_API_KEY")} # 灰度部署:正常自动,遇到终止/异常才介入 gate = UserProxyAgent("gate", human_input_mode="TERMINATE", code_execution_config={"use_docker": False})
不是每一步都值得人看。最有价值的介入点是:执行前(确认要跑的代码有没有破坏力)、终止前(确认结果能不能用)、分歧时(群里吵不出结果你来裁)。把人力放在这三处,性价比最高。
人输入的内容会作为一条普通消息进入历史,后续 Agent 据此调整。这意味着"人"在 AutoGen 里本质上是一个特殊的消息源,和 Agent 平权。这个设计很妙:你不用写特殊分支,人说话就自动参与编排。
# 下一轮 Agent 看到后自然改变方向 chat = gate.initiate_chat(assistant, message="生成报表。", max_turns=6) # 中途若 gate 喊停,你在终端输入反馈,反馈即下一条消息
开发用 ALWAYS 看清,灰度用 TERMINATE 留刹车,验证低风险后上 NEVER 提吞吐。下面示意两种配置并存。
from autogen import UserProxyAgent import os cfg = {"model": "gpt-4o-mini", "api_key": os.environ.get("OPENAI_API_KEY")} # 开发期:逐句确认 dev_gate = UserProxyAgent("dev_gate", human_input_mode="ALWAYS", code_execution_config={"use_docker": False}) # 生产期:只在终止/出错时介入 prod_gate = UserProxyAgent("prod_gate", human_input_mode="TERMINATE", code_execution_config={"use_docker": False}) # 同一套 Agent 逻辑,只换 human_input_mode 就能从开发切到生产
人在 TERMINATE 模式输入"换个思路重来",这句话作为消息进历史,下一轮 Agent 看到后自然调整。这意味着人工反馈不是"打断重跑",而是"参与对话"——它和自动消息地位平等。这个设计让人在回路里很轻量:你不用改代码,说句话就行。
这些场景里,再快的自动化也不如一次人工确认划算。负责任的部署,是把"人该在哪"写进设计文档,而不是上线后碰运气。
有人担心人工介入拖慢吞吐,于是全上 NEVER。但一次不可逆误操作(比如误删生产数据)的修复成本,远高于几十次人工确认的时间。我们建议用"风险分级"决定介入深度:低风险全自动,中风险 TERMINATE,高风险 ALWAYS。这样既保吞吐,又不放脱缰马。这张表比一句"尽量自动化"实用得多。
把人工介入点当成"检查点"而非"打断"来设计。比如在群聊每 N 轮自动暂停等人确认一次方向,而不是全程 ALWAYS 每句都问。这样既保人能纠偏,又不至于把吞吐拖垮。我们叫它"节拍式介入",比"逐句介入"更适合生产。设计文档里画出这些检查点,团队对"人在哪"就有共识。
别以为加了人介入就万事大吉。如果每次介入都要人读完整段历史才能决策,人很快疲劳漏看。所以介入点要给足上下文摘要——"当前阶段、待确认项、风险点",让人秒懂。我们优化人机协作,很大精力花在"让人少读、快决"上,而非单纯"加个确认按钮"。
系统成熟后,人工介入点会越来越少——因为常见情况都被自动化覆盖,人只在真正的异常出现。这不是去掉人,而是把人从重复确认里解放出来,专注高价值判断。我们衡量人机协作好不好,看"人工介入率是否随时间下降",下降说明系统在学乖。
人机协作这一节讲的不是"要不要人",而是"人在哪最值"。把人力放在执行前、终止前、分歧处,系统既自动又可控。这是对话即编排能上生产的最后一道保险。
⚠️ 执行有破坏力代码的 Agent 开了 NEVER,等于无人看管地运行危险操作,严禁。
💡 人机协作是"对话即编排"的安全绳——编排再自动,也得留个绳给人拽。