multi agen意图识别

意图识别在 multi agent 里用哪种方式取决于有多少个 agent、它们的职责边界清不清晰。

最常见的做法就是用一个 LLM 做路由,把每个 agent 的能力描述写成 system prompt 的一部分,让路由模型判断用户输入该分给谁。

AGENT_DESCRIPTIONS = {
    "sql_agent": "处理数据库查询相关问题,包括写SQL、查数据、建表",
    "deploy_agent": "处理部署、发布、回滚相关操作",
    "code_review_agent": "对代码片段做审查,给出改进建议",
}

def route(user_input: str) -> str:
    prompt = f"""根据用户输入,判断应该交给哪个agent处理。
    可选agent:{json.dumps(AGENT_DESCRIPTIONS, ensure_ascii=False)}
    用户输入:{user_input}
    只返回agent名称。"""
    return llm.invoke(prompt).strip()

这个方案够用,但有个明显问题:每次请求都要多一次 LLM 调用,延迟和成本都上去了。

agent 少的时候无所谓,agent 多了或者调用频繁就得考虑优化。

第二种方式是向量相似度匹配

把每个 agent 的能力描述提前做 embedding,用户输入进来也做 embedding,算余弦相似度,取最高的那个。

# 离线:把agent描述编码成向量
agent_embeddings = {name: embed(desc) for name, desc in AGENT_DESCRIPTIONS.items()}

# 在线:用户输入编码后做相似度匹配
query_vec = embed(user_input)
best_agent = max(agent_embeddings, key=lambda k: cosine_sim(query_vec, agent_embeddings[k]))

速度快成本低,但语义理解能力不如 LLM 路由,用户说的话稍微绕一点就可能匹配错。

第三种是规则兜底 + LLM 路由混合方案

明确的关键词命中直接走规则,模糊的再丢给 LLM 判断。

def route(user_input: str) -> str:
    # 规则层:确定性高的直接匹配
    if any(kw in user_input for kw in ["发布", "部署", "回滚", "上线"]):
        return "deploy_agent"
    if any(kw in user_input for kw in ["SQL", "查数据", "建表"]):
        return "sql_agent"
    # 兜底:交给LLM判断
    return llm_route(user_input)

实际项目里这种混合方式最实用,规则层处理 80% 的明确意图,LLM 处理剩下 20% 的模糊场景,延迟和成本都可控。

还有一个容易踩的坑,agent 职责划分不清晰的时候,再好的意图识别也救不了你。 如果两个 agent 的能力描述有大量重叠,路由模型也分不清该给谁。

意图识别做不好,大多数时候问题出在 agent 的职责定义上,不在路由算法上。

OpenAI 的 Swarm、LangGraph、AutoGen 这些框架的 routing 实现本质都是上面这几种方式的封装,没什么牛x的。

 

选哪个框架不重要,把 agent 的边界定义清楚才是正事。

链接:https://www.zhihu.com/question/1907930479778300189/answer/2065785777213256361

posted @ 2026-08-02 09:48  甜菜波波  阅读(11)  评论(0)    收藏  举报