问题与目标
本篇实现一个 Supervisor:设备专家读取实时状态,规则专家解释处置规则,主管负责选择专家并形成最终答复。专家只能读,创建工单等副作用仍交给后续审批流程。
核心概念
Supervisor 模式通常把子 Agent 包装成工具。主管看到的是专家的能力说明和最终结果,不应直接获得专家的全部思考过程。工程上至少要约束四件事:
- 专家职责不重叠;
- 只传完成子任务所需的最小上下文;
- 每次委派都有可记录的输入与输出;
- 最大步数、超时和重复调用共同决定终止。
可运行实现
bash
python -m pip install "langchain>=1,<2" "langchain-openai>=1,<2"
export OPENAI_API_KEY="替换为自己的密钥"
python
import json
from langchain.agents import create_agent
from langchain.tools import tool
MODEL = "openai:gpt-4.1-mini"
@tool
def get_device_status(device_id: str) -> str:
"""读取一个设备的当前状态,不执行写操作。"""
devices = {"AX-3": {"status": "offline", "offline_minutes": 12}}
return json.dumps(devices.get(device_id, {"status": "not_found"}), ensure_ascii=False)
@tool
def search_inspection_rule(keyword: str) -> str:
"""查询巡检规则,不执行写操作。"""
return "设备离线超过 5 分钟时,建议创建人工巡检工单;创建前必须审批。"
device_expert = create_agent(
MODEL,
tools=[get_device_status],
system_prompt="你是设备专家,只报告工具返回的事实,不猜测规则。",
)
rule_expert = create_agent(
MODEL,
tools=[search_inspection_rule],
system_prompt="你是规则专家,只解释规则,不声称已经执行处置。",
)
def final_text(result: dict) -> str:
content = result["messages"][-1].content
return content if isinstance(content, str) else json.dumps(content, ensure_ascii=False)
@tool
def ask_device_expert(question: str) -> str:
"""向设备专家询问设备事实。每个任务最多调用一次。"""
result = device_expert.invoke({"messages": [{"role": "user", "content": question}]})
return final_text(result)
@tool
def ask_rule_expert(question: str) -> str:
"""向规则专家询问处置规则。每个任务最多调用一次。"""
result = rule_expert.invoke({"messages": [{"role": "user", "content": question}]})
return final_text(result)
supervisor = create_agent(
MODEL,
tools=[ask_device_expert, ask_rule_expert],
system_prompt=(
"你是巡检主管。先取得设备事实,再在需要时查询规则,最后汇总。"
"同一专家最多调用一次,不得创建工单;需要写操作时仅返回待审批建议。"
),
)
result = supervisor.invoke(
{"messages": [{"role": "user", "content": "检查 AX-3,并给出处置建议"}]},
config={"recursion_limit": 8},
)
print(final_text(result))
recursion_limit 是最后一道保险,不是完整的业务预算。生产系统还应在状态中记录专家调用次数、参数摘要和剩余时间;同一个专家收到等价输入时,直接拒绝重复委派或复用已验证结果。
常见问题与排查
专家互相调用形成环
优先采用“主管调用专家、专家不反向调用主管”的有向结构。若业务必须 Handoff,把允许的转移关系写成白名单状态机。
专家返回大量历史
子 Agent 只返回结论、证据引用和错误码。主管不需要子 Agent 的完整消息列表,更不应依赖隐藏推理文本。
只靠 Prompt 限制调用一次
Prompt 是软约束。在工具包装层统计 (task_id, expert, normalized_input),超过预算时返回结构化错误。
专家偷偷执行副作用
按职责分配工具,读取专家根本不注入写工具。高风险写操作进入独立审批节点,并使用权限和幂等键防护。
小结
多 Agent 的关键不是让多个模型互相聊天,而是明确职责、缩小上下文并建立硬终止条件。Supervisor 负责协作,工具层负责权限,运行时负责预算和审计。
License: CC BY-NC 4.0
Updated 2 hours ago
Was this article helpful? Give it a like.
0 comments


