AgentDepthAgent 工程学习指南
输入概念或问题,检索正文和待编写目录。
第一次学习?从 L0 总览开始 →

任务路由:先分清问题,再选择处理入口

我的学习 →

正在读取学习记录…

1. 什么是路由

任务路由是根据输入,选择一个处理入口。用户问退款期限,进入政策查询;用户问订单在哪,进入订单查询;问题同时涉及两者,先澄清或拆成子任务。

这和客服分诊相似:政策问题交政策资料,订单问题交订单系统。路由器的输出是入口名称,后面的处理器再执行具体工作。把它们分开,可以独立检查“分到哪里”和“进去后做得怎样”。

退款问题进入政策查询,订单位置进入订单查询,混合意图或无匹配进入澄清
路由返回入口名称。后续执行器根据入口调用工具,并继续校验参数与权限。

确定性分支指相同输入和规则会得到相同选择。例如表单已有 type=refund,可以直接按字段分流;自然语言变化很多时,可以由分类模型辅助,应用程序再检查返回入口是否在列表里。

2. 运行一个可看懂规则的路由器

先在 PowerShell 创建并进入学习目录:

Bash
mkdir "F:\学习\l3-routing" -Force
cd "F:\学习\l3-routing"

保存下面的文件后,在这个终端运行 dir 核对文件名,再执行本节给出的运行命令。

在新目录创建 routing.py:

先在 PowerShell 创建并进入学习目录:

Bash
mkdir "F:\学习\l3-routing" -Force
cd "F:\学习\l3-routing"

保存下面的文件后,在这个终端运行 dir 核对文件名,再执行本节给出的运行命令。

Python
"""按问题内容选择处理入口,多种意图并存时先澄清。"""
import json

def route(question):
    # 简单关键词规则使分流原因可直接观察。
    wants_policy = "退款" in question
    wants_order = "订单" in question
    if wants_policy and not wants_order:
        return "policy_search"
    if wants_order and not wants_policy:
        return "order_lookup"
    return "clarify"

if __name__ == "__main__":
    for question in ("退款期限是多少", "订单123在哪里", "订单退款", "你好"):
        print(json.dumps({"question": question, "route": route(question)},
                         ensure_ascii=False))
Bash
ls
python routing.py

输出:

TXT
{"question": "退款期限是多少", "route": "policy_search"}
{"question": "订单123在哪里", "route": "order_lookup"}
{"question": "订单退款", "route": "clarify"}
{"question": "你好", "route": "clarify"}

两个布尔变量分别检查“退款”和“订单”是否出现。只有退款进入政策,只有订单进入订单系统,两个都出现或都未出现就进入澄清。

clarify 表示下一步先向用户确认,例如“你想了解退款期限,还是查询这笔订单的退款进度?”用户补充后,再路由一次。这一步减少了拿不完整信息直接选择工具的情况。

3. 换一种说法,看看规则覆盖到哪里

把“退款期限是多少”换成“几天内可以退钱”,会得到 clarify,因为当前规则只匹配“退款”。可以把判断扩展为:

Python
wants_policy = any(word in question for word in ("退款", "退钱"))

保存后运行 python routing.py,第一行变为政策查询。接着把第一条输入改为“这笔订单为什么不能退钱”并重跑,会同时匹配两类,仍进入澄清。观察后恢复原关键词判断与四条问题,再运行核对原结果。先理解这种歧义,再考虑把一个问题拆成两个查询。

4. 用测试保存判断规则

在同目录创建 test_routing.py:

下面的测试检查退款、订单与混合问题分别进入哪个处理入口。

测试代码:test_routing.py
Python
"""检查routing示例的正常路径和边界结果。"""
import unittest
from routing import route
class Tests(unittest.TestCase):
    def test_known(self):
        self.assertEqual(route("退款期限是多少"),"policy_search")
        self.assertEqual(route("订单123在哪里"),"order_lookup")
    def test_unknown(self): self.assertEqual(route("你好"),"clarify")
    def test_ambiguous(self): self.assertEqual(route("订单退款"),"clarify")

if __name__ == "__main__":
    unittest.main()
Bash
python -m unittest test_routing -v

正常路径与改动后的边界都在测试中检查。若结果不同,先定位失败的断言,再回到对应的字段与分支。

5. 规则路由与模型路由如何选择

输入情况方案优点需要维护
结构化表单类型直接查映射表稳定、便宜类型枚举
少量固定说法关键词或正则易解释、易测试同义词和歧义
复杂自然语言分类模型与入口校验覆盖更多表达误分样本、成本和耗时
混合任务澄清或拆分保留用户真实目标子任务依赖

模型路由可返回入口与理由,但执行器仍需检查入口名称、参数格式和当前用户权限。给一个问题分到“退款”只表达主题,发出退款操作之前还要确认订单、金额与审批。

评估路由时,准备一组有人工标签的问题,分别记录正确入口、实际入口和澄清次数。把常见误分按类别整理,例如“订单退款进度”被误分成通用政策,就可以调整规则或补充分类样本。

确定性分支适合步骤和条件已经明确的流程,也便于做回归测试。动态选择适合下一步要依赖未知观察的任务。两者可以组合:先由稳定入口分流,再在允许的范围内逐步查询。Anthropic 的工作流模式提供了路由与其他编排模式的对照。

一个问题走进处理器之前发生了什么

输入退款匹配订单匹配路由
退款期限是多少TrueFalsepolicy_search
订单123在哪里FalseTrueorder_lookup
订单退款TrueTrueclarify
你好FalseFalseclarify

两个布尔值组成四种组合。当前规则先检查只有退款,再检查只有订单,其他情况进入澄清。这个小表就是完整的判断空间,可以直接变成测试用例。

从路由到工具调用还要多一步参数提取。例如order_lookup需要订单编号,用户只说“我的订单在哪”时,入口明确但编号仍缺失,处理器先询问编号。政策查询可能只需主题,所以不同处理器各自定义输入Schema。

模型分类适合复杂表达,但也可以先保留确定性规则处理结构化输入。记录每次分流的输入类型、入口和最终处理结果,能找出“路由正确但参数缺失”和“入口选错”两类不同的问题。

回顾与下一步

先识别意图,再选择入口,处理器完成工作,歧义保留澄清分支。下一篇 人工核对处理风险较高或信息不足的动作。

课后练习展开习题收起习题

4 道练习 · 客观题规则评分 · 其余题目待批改

正在读取本地记录…

不调用模型,不执行代码。简答、代码和场景题仅保存答案并展示自查标准,不生成评分、徽章或认证。输入内容不会自动保存,请点击提交;不要填写个人信息或密钥。

练习 1 / 4 · v1.0.0

objective · 模型选择、多模型路由与隐私

围绕 L1-routing 说明一个可验证的工程做法。

对应知识点:L1-routing

选择一个答案
练习 2 / 4 · v1.0.0

short_answer · 模型选择、多模型路由与隐私

围绕 L1-routing 说明一个可验证的工程做法。

对应知识点:L1-routing

练习 3 / 4 · v1.0.0

coding · 模型选择、多模型路由与隐私

围绕 L1-routing 说明一个可验证的工程做法。

对应知识点:L1-routing

练习 4 / 4 · v1.0.0

scenario · 模型选择、多模型路由与隐私

围绕 L1-routing 说明一个可验证的工程做法。

对应知识点:L1-routing

图片查看器
100%

文章配图 · 按 Esc 关闭