在之前的文章里,我展示了如何用 AutoGen 搭建一个由四个领域代理—— Passion、Obstacle、Balance、Values——共同对话的职业教练聊天机器人。它能工作,但所有代理同时发声,回复显得冗杂。
这次,我升级了“编排”逻辑,只让合适的代理发言,并由 LeadCoachAgent 将他们的观点汇总成精炼的行动方案。
业界路由是怎么做的?
在生产级多智能体系统里,团队很少只用一种启发式。常见的做法是 混合路由:
- 快速相似度过滤:本地向量索引(FAISS、Milvus)在几毫秒内筛选明显匹配。
- 轻量规则:用正则或关键字保证合规或强制触发特定工具。
- LLM 仲裁:仅在歧义时调用大模型,返回 JSON 化的“工具选择”结果。
- 回退与监控:若路由信心低,则走默认代理或向用户澄清,并记录日志用于再训练。
步骤 1:安装
pythonCopyEdit!pip install -q git+https://github.com/ag2ai/ag2.git \
openai sentence-transformers scikit-learn
步骤 2:定义代理与配置
pythonCopyEditimport os, openai
from autogen import ConversableAgent, UserProxyAgent, GroupChat, GroupChatManager
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
# 🔑 设置 OpenAI API Key
os.environ["OPENAI_API_KEY"] = "sk-your-key-here"
client = openai.OpenAI(api_key=os.environ["OPENAI_API_KEY"])
llm_config = {
"temperature": 0.3,
"timeout": 120,
"config_list": [
{"model": "gpt-4", "api_key": os.environ["OPENAI_API_KEY"]}
]
}
specs = {
"PassionAgent": "用 ≤3 句话找出用户的热情所在。",
"ObstacleAgent": "用 ≤3 句话指出阻碍并给出解决方案。",
"BalanceAgent": "用 ≤3 句话提供工作与生活平衡建议。",
"ValuesAgent": "用 ≤3 句话澄清核心价值观。"
}
agents = {
n: ConversableAgent(name=n, system_message=msg, llm_config=llm_config)
for n, msg in specs.items()
}
lead_agent = ConversableAgent(
name="LeadCoachAgent",
system_message="整合各代理观点,输出 3-5 条可执行步骤。",
llm_config=llm_config
)
user_proxy = UserProxyAgent(
name="UserProxyAgent",
human_input_mode="NEVER",
max_consecutive_auto_reply=5
)
步骤 3:混合路由(向量筛选 + GPT-4 回退)
pythonCopyEditclass HybridRouter:
def __init__(self, agent_dict):
self.agent_dict = agent_dict
self.desc = {
"PassionAgent": "discover passions",
"ObstacleAgent": "identify blockers",
"BalanceAgent": "work-life balance",
"ValuesAgent": "clarify values"
}
self.embedder = SentenceTransformer("all-MiniLM-L6-v2")
def _embed_pick(self, text):
emb = self.embedder.encode([text])
return [self.agent_dict[n] for n,d in self.desc.items()
if cosine_similarity(emb, self.embedder.encode([d]))[0][0] > 0.5]
def _llm_pick(self, text):
prompt = (
f"Select relevant agents for: '{text}'.\\n"
"Return a Python list from: PassionAgent, ObstacleAgent, BalanceAgent, ValuesAgent."
)
resp = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
temperature=0
)
try:
names = eval(resp.choices[0].message.content)
return [self.agent_dict[n] for n in names if n in self.agent_dict]
except:
return list(self.agent_dict.values())
def pick(self, text):
return self._embed_pick(text) or self._llm_pick(text)
router = HybridRouter(agents)
路由机制剖析
阶段 | 动作 | 时延 | 成本 |
---|---|---|---|
向量过滤 | MiniLM 向量余弦 >0.5 选代理 | 毫秒级 | 本地 |
LLM 回退 | 若无匹配,用 GPT-4 选代理 | ≈1 s | 一次 GPT-4 调用 |
边缘情况处理
- 单代理查询:只选中一个代理时,与 LeadCoachAgent 组合返回精简答复。
- 过于模糊:若仍不确定,LeadCoachAgent 会先提澄清问题。
- 错误路由:低置信度事件会记日志,供离线调优。
步骤 4:单轮对话函数
pythonCopyEditdef chat_once(user_text):
selected = router.pick(user_text)
gc = GroupChat(
agents=selected + [lead_agent],
messages=[],
max_round=2,
speaker_selection_method="round_robin"
)
mgr = GroupChatManager(gc, llm_config)
result = user_proxy.initiate_chat(mgr, message=user_text)
snippets = [m["content"] for m in result.chat_history
if isinstance(m, dict) and m.get("role") == "assistant" and m.get("content")]
if not snippets:
return "请再提供一些背景信息,我才能更好地帮助你。"
summary = lead_agent.generate_reply("Summarise:\\n" + "\\n".join(snippets))
return summary if isinstance(summary, str) else summary.get("content", "[no reply]")
步骤 5:交互循环
pythonCopyEditprint("Career-Coach 聊天机器人已就绪!输入问题或 'exit' 退出。")
while True:
q = input("You: ")
if q.lower() == "exit":
break
print("Coach:", chat_once(q))
运行示例与分析
用户:I want to create more impact
路由结果:[PassionAgent, ObstacleAgent, BalanceAgent]
LeadCoachAgent 总结(节选):
- 明确想影响的领域并设定目标
- 制定包含资源与时间表的计划
- 开始实施并根据反馈微调
- 用数据和反馈衡量影响力
- 持续学习,把影响力规模化
未来路线 – 三大优先方向
1. 上下文感知的混合路由
融合对话历史、情绪、用户档案和外部信号,用强化学习优化成功率、成本和满意度。
2. 动态、技能驱动的代理组合
按需加载轻量专长代理,以正式“技能”本体做匹配,实现即插即用。
3. 人-机协同与可解释性
低置信度时自动交接给人类,并公开路由理由(得分、备用路径)以便调试和建立信任。
欢迎试用完整代码,动手体验混合路由的威力!任何反馈或想深入的话题,留言一起探讨。