模式意图路由

并非每个用户请求都需要同一种处理器。有些用一次数据库查询就能回答;有些需要具备领域上下文的 LLM;有些则需要人工。TypeSafe 可以作为快速、低成本的分类器位于这些处理器之前,决定该调用哪一个。

示例:客服路由

假设你正在构建一个客服系统。消息源源不断地涌入,需要被路由到正确的处理器。与其把每条消息都送进昂贵的 LLM 去弄清请求类型,不如先做分类,再据此路由。

%%{init: {"fontFamily": "Inter, sans-serif", "flowchart": {"rankSpacing": 35, "wrappingWidth": 300, "subGraphTitleMargin": {"top": 12, "bottom": 36}}}}%% flowchart LR message["customer message"] subgraph req["TypeSafe evaluates questions<br/>in parallel"] direction TB intent["<b>Choice:</b> intent"] complexity["<b>Score:</b> complexity"] %% Invisible links stack the questions; they are answered in parallel. intent ~~~ complexity end message -- "one request<br/>message + 2 questions" --> req req -- "one response<br/>2 answers with<br/>confidence" --> confidence{"<b>intent confidence<br/>≥ 0.5?</b><br/>your code"} confidence -- "no" --> human["human agent"] confidence -- "yes" --> route{"<b>which intent?</b><br/>"} route -- "order_status" --> order["order lookup<br/>deterministic code"] route -- "product_question" --> product["product specialist LLM"] route -- "return_exchange" --> returns["returns specialist LLM"] route -- "complaint" --> escalate{"<b>complexity > 1<br/>or its confidence < 0.5?</b><br/>"} escalate -- "yes" --> human escalate -- "no" --> complaint["complaint resolution LLM"]

第 1 步:分类意图与复杂度

questions
json
{
  "intent": {
    "type": "choice",
    "instructions": "The primary intent of this customer message",
    "criteria": {
      "order_status": "Asking about an existing order",
      "product_question": "Asking about a product before buying",
      "return_exchange": "Wants to return or exchange something",
      "complaint": "Unhappy with experience, wants resolution"
    }
  },
  "complexity": {
    "type": "score",
    "instructions": "How complex is this request to resolve",
    "criteria": [
      "Simple lookup or standard procedure",
      "Requires some judgment or multi-step process",
      "Unusual situation, edge case, or escalation needed"
    ]
  }
}

第 2 步:路由到最合适的处理器

python
def route_ticket(ticket_id, response):
    intent = response.answers["intent"]
    complexity = response.answers["complexity"]

    if intent.confidence < 0.5:
        # If we don't have enough confidence to classify, route to a human agent
        return route_to_human_agent(ticket_id)

    if intent.choice == "order_status":
        handle_order_status(ticket_id)

    elif intent.choice == "product_question":
        handle_with_llm(ticket_id, PRODUCT_SPECIALIST)

    elif intent.choice == "return_exchange":
        handle_with_llm(ticket_id, RETURNS_SPECIALIST)

    elif intent.choice == "complaint":
        low_confidence = complexity.confidence < 0.5
        # A higher complexity.score leans toward the "escalation needed" end of the scale.
        if complexity.score > 1 or low_confidence:
            # Too complex for safe automation, or we're not sure about the complexity; route to a human.
            route_to_human_agent(ticket_id)
        else:
            handle_with_llm(ticket_id, COMPLAINT_RESOLUTION)

一种意图路由到完全不涉及 LLM 的确定性代码;两种意图分别路由到加载了不同上下文的不同专用 LLM;还有一种利用复杂度评分在 LLM 与人工之间做出选择。TypeSafe 只需一次快速调用即可完成全部分类,而昂贵的资源只会在真正需要它们的请求上被调用。

请注意复杂度评分上还有一道额外的置信度检查。正如置信度一文所讨论的,结合系统语境和决策的利害程度来考虑低置信度分数的含义,始终十分重要。