Documentation
¶
Overview ¶
中文词表匹配内核:意图路由的确定性层(词表兜底优先于 LLM 分类)。
子串命中远远不够——「磁盘没有问题」包含"磁盘"、「不要执行」包含"执行", 直配会把查询/拒绝误判成命中。本文件在子串之上叠加三重守门:
- 否定守门:命中处紧前方窗口内出现否定短语即该处作废(中文否定习惯前置,只回看不前看);
- 词边界:拉丁词命中处紧邻字符不得是 ASCII 字母/数字——kill 不再误命中 skill/killed;
- 排除构式:命中位置落在排除短语(「怎么执行」「可执行文件」)内部即该处作废。
三重守门都只作废**该处**命中:同一输入里关键词多处出现时,任一处通过全部守门即命中 (「先看下执行结果,怎么执行再定」的两处都被构式排除才判 false)。
从 bianque 意图路由层提炼(v0.9.4),语言层通用、无领域词。
Package router 路由(Router)架构原语:LLM 意图分类 → 选路 → 分发执行。
与 skill 包"agent 自主 use_skill"(隐式路由,决策权在执行 agent)不同, router 是显式路由:先用一次廉价分类调用决定走哪条处理链,再交给对应 handler (handler 可以是 ReAct agent、Plan-and-Execute、单轮生成——任意编排)。 适用:入口流量可枚举为有限意图类别、各类别处理链差异大的场景。
Index ¶
- Variables
- func KeywordHit(lowerInput, keyword string) bool
- func KeywordHitBoundary(lowerInput, keyword string) bool
- func KeywordHitBoundaryExcept(lowerInput, keyword string, masks []string) bool
- func KeywordHitExcept(lowerInput, keyword string, masks []string) bool
- func KeywordPostNegated(lowerInput, keyword string) bool
- type Config
- type Decision
- type Route
- type Router
- type SlotSpec
Constants ¶
This section is empty.
Variables ¶
var OnNegationHit func()
OnNegationHit 否定守门命中钩子(可选;观测面注册,如 metrics 计数)。 在「该处命中被否定作废」时回调——热路径上只在作废瞬间触发,零命中零开销。 构建期注册(无内部同步)。
Functions ¶
func KeywordHit ¶
KeywordHit 词表命中判定:子串匹配 + 否定前置守门——「磁盘没有问题」「不要执行」 不再因包含关键词而误命中;同一输入里关键词多处出现时,任一处未被否定即命中。 输入应已小写(中文不受影响;拉丁关键词内部自动 ToLower 兜底)。
func KeywordHitBoundary ¶
KeywordHitBoundary KeywordHit 的词边界变体:命中处的前一字符与后一字符都不得是 ASCII 字母/数字(CJK 与标点均视为边界)——为「kill」这类拉丁词设计,杜绝 「skill」「killed」误命中;中文关键词不受影响(相邻字符本就不是 ASCII 字母数字, 行为与 KeywordHit 完全一致,混排输入如「ssh执行」也不受牵连——只约束声明的词)。
func KeywordHitBoundaryExcept ¶
KeywordHitBoundaryExcept KeywordHitBoundary 的排除构式变体(词边界 + mask 构式 + 否定守门三重判定)。
func KeywordHitExcept ¶
KeywordHitExcept KeywordHit 的排除构式变体:关键词某处命中若落在任一 mask 复合短语 (如「怎么执行」「可执行文件」)内部,该处作废、继续找下一处;全部作废即 false。 否定守门与 KeywordHit 一致。语义:处置词出现在问句/名词性构式里不触发执行链, 而同句真正的处置词(kill)不受「执行结果」这类名词性短语牵连。
func KeywordPostNegated ¶
KeywordPostNegated 后置否定守门:关键词**任一处**命中后紧随否定单字(不/没/无/非) 即视为否定陈述——「负载不高」「磁盘不满」里命中词是被否定的谓词对象;多处出现时 逐一扫描(与其余守门「任一处」语义对齐:「磁盘没问题,再看下磁盘」不会因首处未被 否定而漏判第二处的否定形态)。紧随复合否定(「磁盘没有问题」)同命中。与否定前置 守门(negatedAt)对偶:那边中文否定习惯前置、按窗口回看,这边紧贴即判、无需窗口。 判定从严:宁可作废误归一,不放过反向表述。返回 true 表示该关键词应作废。 输入应已小写(关键词内部 ToLower 兜底)。
Types ¶
type Config ¶
type Config struct {
// Model 分类模型(一次 GenerateJSON 调用;用快模型即可)。
Model model.BaseChatModel
// ModelName 分类调用记账标识。
ModelName string
// Routes 路由表(≥1 条;Name 唯一)。
Routes []Route
// MinConfidence 置信度下限(0~1;低于则走 Fallback。0 = 不设门槛)。
MinConfidence float64
// Fallback 兜底处理链(nil = 低置信/无法分类时报错)。
Fallback func(ctx context.Context, input string, reason string) (string, error)
// Slots 意图槽位(nil = 纯选路:提示词与解析保持原样,模型多给的 slots 一律丢弃)。
Slots []SlotSpec
}
Config 路由器配置。
type Decision ¶
type Decision struct {
Route string `json:"route"`
Confidence float64 `json:"confidence"`
Reason string `json:"reason"`
// Slots 槽位提取结果(仅含已配置槽位;未配置/模型未给 = nil)。
Slots map[string]string `json:"slots,omitempty"`
}
Decision 分类决策(可观测)。
type Route ¶
type Route struct {
// Name 路由名(分类目标词,须唯一;小写短横线风格,如 "bug-fix")。
Name string
// Description 意图描述(分类依据——写清"什么样的问题走这条")。
Description string
// Handle 处理链(任意编排:单轮生成 / ReAct / P&E / 纯函数)。
Handle func(ctx context.Context, input string) (string, error)
}
Route 一条路由:意图类别 + 处理链。
type Router ¶
type Router struct {
// contains filtered or unexported fields
}
Router 路由器(构建后只读,并发安全)。