OpenRouter 支持机器人模型路由指南:廉价优先处理 FAQ
Model Routing for Support Bots: Cheap-First FAQ Handling
OpenRouter 发布指南,介绍支持机器人采用"廉价优先"模型路由:常规 FAQ 交给小型廉价模型,难例或不确定请求再升级到更强模型。三种应用侧模式为静态规则、分类器分诊和带置信度阈值的答案检查。OpenRouter 的 Auto Router("model": "openrouter/auto")可按任务类型选初始模型,models 数组提供错误回退,但支持政策验收检查仍需应用自己负责。
廉价优先的模型路由将常规支持问题发送给一个小型、廉价的模型,并将选定的困难或不确定请求升级到更强的模型。只要较便宜的路径满足你的支持需求,它就能降低对每条消息都使用强大模型的成本。三种应用侧模式是静态规则、基于分类器的分诊,以及带置信度阈值的答案检查。
本指南比较这三种模式,展示流程中哪些部分由 OpenRouter 处理,通过一个可复制的请求演示一个支持流程,并列出在添加升级机制之前需要衡量的指标。
简而言之
- 对于范围狭窄、易于识别的常见问题,使用静态规则;对于用词多变但类别稳定的情况,使用基于分类器的分诊;当廉价模型应先尝试作答时,使用答案检查。
- 将支持策略的验收检查保留在你的应用中。我们的模型回退处理请求错误。一个成功但不正确的答案需要在你的代码中单独做出升级决策。
- 在答案接受度、包含被丢弃尝试的总成本、升级率以及完整轮次延迟方面,将廉价优先与仅用廉价模型、仅用更强模型进行比较。
- 仅在你的评估表明升级能修复失败的地方添加升级。如果升级替换了一个本已可接受的廉价答案,只会增加成本和延迟,而不会改善响应。
当较便宜的模型适合常规常见问题时
使用一个强大的模型可以让初始集成保持简单。如果常规常见问题在较便宜的模型上满足你的质量要求,那么这部分流量就成为降低模型支出的候选对象。用同一份已批准的文档测试两个模型,候选模型来自我们的 模型目录 和当前 定价。
分类器调用和第二次尝试也会消耗时间和预算。根据你在生成前能识别什么以及生成后能检查什么来选择模式。
三种路由模式
Anthropic 的 构建有效智能体指南 将路由描述为对输入进行分类,并将其导向专门的后续任务,简单问题发送给较小的模型,困难问题发送给能力更强的模型。下面的构建和维护估算是我们对一个小型支持应用的规划判断。
| 方法 | 决策点 | 构建工作量 | 维护负担 | 有用的起始工作负载 |
|---|---|---|---|---|
| 静态规则 | 在生成前匹配意图或短语 | 低 | 随着措辞和策略变化更新规则 | 范围狭窄、易于识别的常见问题类别 |
| 基于分类器的分诊 | 轻量级分类器选择模型或工作流 | 中 | 维护标注示例并检查错误路由 | 用多变语言表达的稳定类别 |
| 带置信度阈值的答案检查 | 接受廉价答案或请求另一次尝试 | 中到高 | 维护策略检查并根据正确性验证置信度分数 | 具有明确、可测试要求的答案 |
这些模式可以共存。规则或分类决定请求从哪里开始。答案检查决定其输出是否可接受。在你根据自己的问题对照正确性进行检查之前,模型自我报告的置信度并不是正确性的概率,因此在获得这些数据之前,应将其视为一种排序信号。
你的应用负责什么,OpenRouter 处理什么
负责基于质量的路由意味着维护规则或分类器、验收检查、升级决策和监控。这些可以存在于你的支持应用内部,而无需单独的路由服务。
如果你想让我们选择初始模型,我们的 Auto Router(通过 "model": "openrouter/auto" 选择)会按任务类型对每个提示进行分类,并从 OpenRouter 用户在该任务类型上花费的模型中选择一个。一个有序的 模型回退列表,以 models 数组形式发送,会在出现错误(如速率限制、提供商宕机或内容审核拒绝)后,用下一个模型重试请求。支持政策的接受检查仍由你负责。
如果你想让我们选择初始模型,请选择 Auto Router。如果你知道自己偏好的模型并需要错误恢复,请选择有序回退列表。对于先便宜后质量升级的场景,你的应用程序检查候选答案,并在检查失败时请求另一个答案。
以下流程展示了这种责任划分。
OpenRouter 上的一个完整支持流程示例
第 1 步:在选择模型之前定义结果
HarborDesk 是一个虚构的 SaaS 产品,拥有固定的 FAQ。它的机器人可以解释政策并推荐支持,但无法检查账户或进行更改。一个可接受的回合会回答问题、请求澄清或推荐人工支持。
对于你能可靠识别且具有固定答案的意图,使用已批准的模板。单独测试意图选择,以确保正确的措辞到达正确的问题。需要解释的请求进入下面的生成答案路径。
第 2 步:在升级之前检查生成的答案
对于需要生成的请求,便宜模型提供第一个候选答案和分诊信号。你的应用程序负责接受决策。

考虑一位客户询问如何取消订阅并请求退款。在 HarborDesk 的政策中,所有者可在 Settings > Billing 下取消,账单人员审核退款请求。
- 接受一个解释这两个步骤但不承诺退款的便宜答案。
- 拒绝一个将所有事项都转给账单部门且省略所有者取消的答案。如果有已批准的模板覆盖该请求,请使用它;或者如果你的评估显示更强的模型能修复这一遗漏,则请求更强的模型尝试。
- 如果客户要求机器人批准退款,请推荐账单支持。更强的模型无法提供这种权限。
检查政策内容和预期操作。仅凭有效的 JSON 并不能确立正确性。保留对话上下文,对更强的答案运行相同的检查,并在一次升级后停止。
第 3 步:配置错误回退并记录请求成本
此代码片段使用有序回退列表发送一个请求。在运行之前安装 requests 并设置 OPENROUTER_API_KEY。简短的虚构 FAQ 为示例提供上下文。
import os
import requests
messages = [
{
"role": "system",
"content": (
"Answer only from this fictional HarborDesk FAQ. "
"Owners can cancel under Settings > Billing. "
"Billing support reviews refund requests. "
"You cannot inspect accounts, cancel plans, or approve refunds. "
"Ask for clarification when necessary."
),
},
{"role": "user", "content": "How do I cancel my subscription and request a refund?"},
]
response = requests.post(
"https://openrouter.ai/api/v1/chat/completions",
headers={"Authorization": "Bearer " + os.environ["OPENROUTER_API_KEY"]},
json={
"models": ["openai/gpt-4.1-mini", "openai/gpt-4.1"],
"messages": messages,
"max_tokens": 512,
"stream": False,
},
timeout=60,
)
response.raise_for_status()
data = response.json()
if "error" in data:
raise RuntimeError(f"Completion failed: {data['error']}")
choices = data.get("choices", [])
if not choices:
raise RuntimeError("Completion returned no choices")
choice = choices[0]
if choice.get("error") is not None or choice.get("finish_reason") == "error":
raise RuntimeError(f"Completion failed: {choice.get('error', 'unknown error')}")
print({
"id": data["id"],
"model": data["model"],
"answer": choice["message"]["content"],
"cost": data.get("usage", {}).get("cost"),
})models 数组会在出现符合条件的错误(如速率限制或提供商宕机)后尝试下一个模型。成功但不正确的答案不会触发它。质量升级需要应用程序检查并单独请求更强的模型。
存在这两个错误检查是因为当模型开始处理请求但在生成输出时失败,我们可能返回 HTTP 200。error 对象出现在响应体的顶层,或者当存在部分内容时,出现在 choices[0] 内部,并将 finish_reason 设置为 error。错误与调试参考文档描述了这两种形式。将两者都视为失败,而不是将部分输出作为答案打印出来。
该片段会打印一个未经校验的候选结果以供检查。usage.cost 字段是我们为该请求收取的额度,model 是生成响应的模型,这在触发回退时很重要。请为每个请求记录这两项。当你的应用升级时,把两次调用都加起来,包括被丢弃的廉价草稿。如果收到的响应没有 cost 值,请把成本记为未知而非零,直到你对照 activity 页面进行核对。usage accounting 指南介绍了 usage 对象。
衡量升级率和每个已解决工单的成本
对于总是先尝试廉价模型的流水线,使用此公式计算每个请求的预期模型成本。
expected_cost = cost_cheap + cost_check_1
+ escalation_fraction * (cost_strong + cost_check_2)在检查项中计入任何评估器或分类器调用的成本,并对升级请求使用更强模型的成本。在相同的质量目标和延迟限制下,将结果与仅用廉价模型和仅用更强模型(包括它们的检查)进行比较。
针对每种路由策略跟踪这些指标。
- 升级率。 进行了更强模型尝试的请求占比。
- 被接受的错误答案。 通过了你的检查但未通过人工审核的廉价答案。
- 被升级的正确回答。 已经满足你的标准但仍被升级的廉价答案。每一个都会增加一次更强模型的费用和第二次调用的延迟,却没有改善响应。
- 转人工的恰当性。 当请求需要机器人不具备的权限时,机器人是否建议人工支持。
- 完整轮次延迟。 从客户消息到返回答案的时间,包括升级请求中的两个模型阶段。
高升级率值得检查被路由的问题。它本身并不能证明阈值有误。
对于每个已解决工单的成本,将某个工单群组的所有模型支出(包括未解决的工单)除以在规定重开工单窗口内满足既定解决定义的工单数量。测试集上的答案接受度衡量的是响应质量,而非客户问题解决情况,因此请将这两个指标分开。
在生产环境启用升级之前,在留出的支持问题上运行此比较。包括简单的常见问题、模糊请求、故障排查以及需要人工转接的请求,并根据预定义的内容标准和预期操作对每个答案进行评分。只有当升级能以你接受的成本和延迟将失败答案转化为通过答案时,它才值得采用。
结论
从经过批准的模板和针对狭窄常见问题的廉价模型基线开始。根据你的工作负载选择规则、分类或答案检查,然后仅在相同的质量目标和延迟限制下与更强模型进行比较。只有在升级能修复足够多的失败以证明成本和延迟合理时,才添加升级。当支持政策变化时,重新审视你的检查。
常见问题
我可以避免构建自定义路由服务吗?
你可以将路由保留在支持应用内部。如果你希望我们选择初始模型,请使用 Auto Router,并使用 models 回退数组,以便我们在请求出错后重试另一个模型。支持相关的接受检查,例如答案是否遵循你的取消政策,仍应放在你的应用中。将模型 ID 保存在配置中,并保持你的提示和评估数据可移植,以便日后更换模型。
廉价模型可以在生成过程中咨询更强模型吗?
不是通过本指南中的流程实现的。廉价模型先完成候选答案,然后由你的应用决定是否请求更强模型的答案。在一轮对话中咨询另一个模型,需要在你的代码中有一个显式的工具或编排步骤,调用更强的模型并将其输出返回到正在进行的工作流中。models 回退数组不会创建该机制。它只会在出错后于另一个模型上重试请求。
我应该选择哪个 FAQ 分类模型?
从在留出的支持问题上(包括模糊请求和政策例外)满足你质量目标的最便宜的候选模型开始。衡量完整轮次的延迟,而不是单次调用的延迟,因为最快的模型调用如果经常需要第二次尝试,仍可能产生较慢的支持响应。从一小组反复出现的问题开始,并随着你的评估显示出哪些路径有效而扩展。
参考文献
来源:OpenRouter Announcements · openrouter.ai