任务路由:先分清问题,再选择处理入口
正在读取学习记录…
1. 什么是路由
任务路由是根据输入,选择一个处理入口。用户问退款期限,进入政策查询;用户问订单在哪,进入订单查询;问题同时涉及两者,先澄清或拆成子任务。
这和客服分诊相似:政策问题交政策资料,订单问题交订单系统。路由器的输出是入口名称,后面的处理器再执行具体工作。把它们分开,可以独立检查“分到哪里”和“进去后做得怎样”。
确定性分支指相同输入和规则会得到相同选择。例如表单已有 type=refund,可以直接按字段分流;自然语言变化很多时,可以由分类模型辅助,应用程序再检查返回入口是否在列表里。
2. 运行一个可看懂规则的路由器
先在 PowerShell 创建并进入学习目录:
mkdir "F:\学习\l3-routing" -Force
cd "F:\学习\l3-routing"保存下面的文件后,在这个终端运行 dir 核对文件名,再执行本节给出的运行命令。
在新目录创建 routing.py:
先在 PowerShell 创建并进入学习目录:
mkdir "F:\学习\l3-routing" -Force
cd "F:\学习\l3-routing"保存下面的文件后,在这个终端运行 dir 核对文件名,再执行本节给出的运行命令。
"""按问题内容选择处理入口,多种意图并存时先澄清。"""
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))ls
python routing.py输出:
{"question": "退款期限是多少", "route": "policy_search"}
{"question": "订单123在哪里", "route": "order_lookup"}
{"question": "订单退款", "route": "clarify"}
{"question": "你好", "route": "clarify"}两个布尔变量分别检查“退款”和“订单”是否出现。只有退款进入政策,只有订单进入订单系统,两个都出现或都未出现就进入澄清。
clarify 表示下一步先向用户确认,例如“你想了解退款期限,还是查询这笔订单的退款进度?”用户补充后,再路由一次。这一步减少了拿不完整信息直接选择工具的情况。
3. 换一种说法,看看规则覆盖到哪里
把“退款期限是多少”换成“几天内可以退钱”,会得到 clarify,因为当前规则只匹配“退款”。可以把判断扩展为:
wants_policy = any(word in question for word in ("退款", "退钱"))保存后运行 python routing.py,第一行变为政策查询。接着把第一条输入改为“这笔订单为什么不能退钱”并重跑,会同时匹配两类,仍进入澄清。观察后恢复原关键词判断与四条问题,再运行核对原结果。先理解这种歧义,再考虑把一个问题拆成两个查询。
4. 用测试保存判断规则
在同目录创建 test_routing.py:
下面的测试检查退款、订单与混合问题分别进入哪个处理入口。
测试代码:test_routing.py
"""检查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()python -m unittest test_routing -v正常路径与改动后的边界都在测试中检查。若结果不同,先定位失败的断言,再回到对应的字段与分支。
5. 规则路由与模型路由如何选择
| 输入情况 | 方案 | 优点 | 需要维护 |
|---|---|---|---|
| 结构化表单类型 | 直接查映射表 | 稳定、便宜 | 类型枚举 |
| 少量固定说法 | 关键词或正则 | 易解释、易测试 | 同义词和歧义 |
| 复杂自然语言 | 分类模型与入口校验 | 覆盖更多表达 | 误分样本、成本和耗时 |
| 混合任务 | 澄清或拆分 | 保留用户真实目标 | 子任务依赖 |
模型路由可返回入口与理由,但执行器仍需检查入口名称、参数格式和当前用户权限。给一个问题分到“退款”只表达主题,发出退款操作之前还要确认订单、金额与审批。
评估路由时,准备一组有人工标签的问题,分别记录正确入口、实际入口和澄清次数。把常见误分按类别整理,例如“订单退款进度”被误分成通用政策,就可以调整规则或补充分类样本。
确定性分支适合步骤和条件已经明确的流程,也便于做回归测试。动态选择适合下一步要依赖未知观察的任务。两者可以组合:先由稳定入口分流,再在允许的范围内逐步查询。Anthropic 的工作流模式提供了路由与其他编排模式的对照。
一个问题走进处理器之前发生了什么
| 输入 | 退款匹配 | 订单匹配 | 路由 |
|---|---|---|---|
| 退款期限是多少 | True | False | policy_search |
| 订单123在哪里 | False | True | order_lookup |
| 订单退款 | True | True | clarify |
| 你好 | False | False | clarify |
两个布尔值组成四种组合。当前规则先检查只有退款,再检查只有订单,其他情况进入澄清。这个小表就是完整的判断空间,可以直接变成测试用例。
从路由到工具调用还要多一步参数提取。例如order_lookup需要订单编号,用户只说“我的订单在哪”时,入口明确但编号仍缺失,处理器先询问编号。政策查询可能只需主题,所以不同处理器各自定义输入Schema。
模型分类适合复杂表达,但也可以先保留确定性规则处理结构化输入。记录每次分流的输入类型、入口和最终处理结果,能找出“路由正确但参数缺失”和“入口选错”两类不同的问题。
回顾与下一步
先识别意图,再选择入口,处理器完成工作,歧义保留澄清分支。下一篇 人工核对处理风险较高或信息不足的动作。
课后练习展开习题收起习题
正在读取本地记录…
不调用模型,不执行代码。简答、代码和场景题仅保存答案并展示自查标准,不生成评分、徽章或认证。输入内容不会自动保存,请点击提交;不要填写个人信息或密钥。
objective · 模型选择、多模型路由与隐私
围绕 L1-routing 说明一个可验证的工程做法。
对应知识点:L1-routing
short_answer · 模型选择、多模型路由与隐私
围绕 L1-routing 说明一个可验证的工程做法。
对应知识点:L1-routing
coding · 模型选择、多模型路由与隐私
围绕 L1-routing 说明一个可验证的工程做法。
对应知识点:L1-routing
scenario · 模型选择、多模型路由与隐私
围绕 L1-routing 说明一个可验证的工程做法。
对应知识点:L1-routing
描述会发送给本站维护者,用于修订文章,保存90天。请只填写文章问题,省略个人信息、密钥和内部资料。