- 后端
- API网关
- 模型推理服务
- AI Agent
【免费下载链接】semantic-router
An open, programmable decision layer for models and compute.
导读
本文系统讲解 semantic-router 中的事件信号(eventsignal):一种不依赖模型推理、通过正则表达式对结构化事件载荷(错误告警、审计日志、事故报告、交易失败码)进行确定性分类与路由的机制。你将掌握routing.signals.events的完整配置语法、四类匹配条件与置信度计算公式,并通过源码级解析理解其编译、匹配与信号暴露的完整链路,最终能在支付、运维监控等场景中构建"事件类型/严重级别/紧急程度/动作码"分级路由规则。
一、什么是事件信号:为结构化事件载荷而生的确定性路由
event信号按事件类型、严重级别、紧急程度或领域特定动作码,为结构化、类事件请求路由。规则统一在routing.signals.events下定义:
routing: signals: events: - name: critical_payment_event event_types: [...] severities: [...] action_codes: [...] temporal: true它是 semantic-router 启发式(heuristic)信号家族中的一员。从源码结构看,Signals配置结构(signal_config.go)中EventRules []EventRule与 keyword、embedding、jailbreak、pii、context 等规则并列,说明事件信号与其它信号共享同一套"信号评估 → 决策 → 模型选择"流水线,但在匹配机制上完全独立。
主要优势
- 基于正则的匹配,无需模型推理:零 ML 依赖,匹配延迟极低,不消耗模型配额;
- 直接路由企业事件驱动载荷:错误告警、审计日志、事故报告等可路由到专用模型池,无需额外训练领域分类器;
- 置信度与匹配条件数量成正比:为决策引擎提供分级信号,而非非黑即白的布尔结果;
- 时间紧急检测独立于事件类型:
urgent、immediate、asap、deadline、time-sensitive、now、critical.window等紧急标记可单独触发路由,让时间敏感事件绕过标准的延迟容忍队列。
二、它解决什么问题:keyword 与 embedding 信号的空白
keyword 与 embedding 信号面向自然语言查询,其假设是"用户用自然语言表达意图"。但结构化事件载荷——JSON 片段、告警消息、交易错误码——包含定义明确的字段,例如:
Error code TXN_DECLINE received from payment gateway CRITICAL: database connection lost这类文本有两个特点:一是关键词匹配难以干净建模(TXN_DECLINE这类动作码不是自然语言词,embedding 也难以表达其精确语义);二是事件本身带有结构化维度(类型、严重级别、紧急度、动作码),需要按维度独立路由。
event信号为每类事件提供命名、可组合的信号,而不强迫运维人员编写脆弱的正则关键词规则——用户只需声明"什么事件类型 + 什么严重级别",匹配与置信度计算由路由器完成。
三、何时使用事件信号
在以下情况使用event:
- 请求包含机器生成的事件载荷(错误告警、审计日志、交易失败);
- 希望按严重级别档独立于事件类型路由(例如所有
critical事件进高保真模型,即使事件类型不同); - 领域特定动作码(例如
TXN_DECLINE、AUTH_FAIL)应确定性选择模型池,而非依赖语义近似; - 时间敏感事件需要绕过标准的延迟容忍队列,立即进入快速响应模型。
四、配置语法与字段详解
4.1 完整配置示例
以下配置来自仓库官方示例 payment-critical.yaml,可在config/fragments/signal/event/目录中找到:
routing: signals: events: - name: critical_payment_event description: Critical payment or transaction events that need incident-grade routing. event_types: - payment_failed - transaction_declined severities: - critical - high action_codes: - TXN_DECLINE temporal: true4.2 字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
name | string | 规则名,在routing.decisions[].rules中按此名引用 |
description | string | 可选的人类可读说明,解释规则何时应匹配 |
event_types | 字符串列表 | 要匹配的事件类型模式(不区分大小写的词边界匹配) |
severities | 字符串列表 | 严重级别关键词:critical、high、medium、low |
action_codes | 字符串列表 | 领域特定动作码(不区分大小写的词边界匹配) |
temporal | bool | 为true时匹配紧急标记:urgent、immediate、asap、deadline、time-sensitive、now、critical.window |
匹配语义:至少满足一个已配置条件时规则匹配(四个条件取"或"关系,但置信度按比例分级)。
从配置结构看(signal_config.go),EventRule的 YAML 映射与上表一一对应:
type EventRule struct { Name string `yaml:"name"` Description string `yaml:"description,omitempty"` EventTypes []string `yaml:"event_types,omitempty"` Severities []string `yaml:"severities,omitempty"` ActionCodes []string `yaml:"action_codes,omitempty"` Temporal bool `yaml:"temporal,omitempty"` }该配置同时被 JSON Schema 校验(router-config-v0.3.schema.json 中events条目引用EventRule定义),配置错误会在加载阶段被拦截。
4.3 置信度计算:分级信号的核心
置信度公式为:
confidence = 0.5 + 0.5 × (matched_criteria / total_criteria)- 最多四个条件(
event_types、severities、action_codes、temporal); - 四条件规则上的单条件匹配得到
0.625; - 完全匹配始终得到
1.0; - 只配置一个条件且匹配的规则也得到
1.0。
该公式在 event_classifier.go 中有精确实现:
// Confidence: 0.5 base + up to 0.5 proportional to matched criteria. match.Confidence = 0.5 + 0.5*float64(matchedCount)/float64(criteriaCount)测试用例 event_classifier_test.go 直接验证了分级行为:
payment_failed双条件规则(事件类型 + 严重级别)只匹配事件类型时,置信度为0.5 + 0.5 × (1/2) = 0.75;- 四条件全部匹配时置信度精确等于
1.0。
这意味着决策引擎可以把不同置信度区间映射到不同模型池——例如高置信度事件走快速响应模型,低置信度事件走更保守的复核模型。
五、与决策规则联动:路由到专用模型池
事件信号本身只负责"识别与打分",真正的路由行为由routing.decisions完成。name字段正是决策规则的引用键:
routing: decisions: - name: route_critical_event description: Route critical payment events to the fast response model. priority: 200 rules: type: event name: critical_payment_event modelRefs: - model: fast-response-model上述配置的含义是:当critical_payment_event事件规则匹配(并达到决策引擎接受的置信度)时,请求被路由到fast-response-model。priority: 200用于在同级匹配规则间决定优先级。
六、源码级实现解析
6.1 编译阶段:正则预编译与防护
NewEventClassifier(event_classifier.go)在初始化时将每条规则编译为预编译正则结构:
- 事件类型与动作码通过
regexp.MustCompile("(?i)\\b" + regexp.QuoteMeta(s) + "\\b")编译,实现不区分大小写的词边界匹配,同时QuoteMeta避免特殊字符注入; - 空字符串或纯空白的事件类型/动作码会被跳过,防止退化模式
\b\b意外匹配任意文本; - 严重级别在编译期归一化(trim + 小写),未知严重级别被丢弃,不占用条件计数。
严重级别与紧急标记的内置词表(event_classifier.go):
var severityKeywords = map[string]*regexp.Regexp{ "critical": regexp.MustCompile(`(?i)\bcritical\b`), "high": regexp.MustCompile(`(?i)\bhigh\b`), "medium": regexp.MustCompile(`(?i)\bmedium\b`), "low": regexp.MustCompile(`(?i)\blow\b`), } var temporalMarkers = regexp.MustCompile(`(?i)\b(urgent|immediate|asap|deadline|time.sensitive|now|critical.window)\b`)注意time-sensitive中的连字符被编译为.,因此time-sensitive与time sensitive均能匹配。
6.2 匹配阶段:四条件独立评估
evaluateRule(event_classifier.go)依次执行matchEventTypes、matchSeverities、matchActionCodes、matchTemporal四个独立函数,每个已配置的条件最多贡献一次计数。只有criteriaCount == 0 || matchedCount == 0(无配置条件或零匹配)时规则才判为不匹配。这也解释了为什么"完全匹配 / 单条件匹配"的置信度都是1.0——分母与分子相等。
6.3 信号评估与结果暴露
在分类流水线中,事件信号与其他信号并行调度(classifier_signal_dispatch_policy.go),evaluateEventSignal(classifier_signal_event.go)执行如下结果暴露:
- 将匹配的规则名追加到
MatchedEventRules; - 记录
SignalConfidences["event:"+ruleName]作为该信号的置信度; - 当严重级别匹配时,额外置位
SignalValues["event:"+ruleName+":severity"] = 1.0; - 当紧急标记匹配时,额外置位
SignalValues["event:"+ruleName+":temporal"] = 1.0; - 记录执行耗时到
Metrics.Event.ExecutionTimeMs,供可观测性指标使用。
匹配的规则名还会作为事件信号投影输入进入决策引擎(classifier_projection_inputs.go),这意味着决策规则可以基于"命中了哪些事件规则"做组合判定。
6.4 DSL 与 Kubernetes CRD 支持
事件信号不仅支持 YAML 配置,还能通过 DSL 声明编译。compileEventSignal(compiler_signals.go)将 DSL 中的event_types、severities、action_codes、temporal字段逐一映射为config.EventRule。
在 Kubernetes 场景下,EventSignal是 CRD 路由配置的一等公民(types_route.go),且约束了events数组上限为 100 条:
// Events defines structured event metadata routing signals. // +optional // +kubebuilder:validation:MaxItems=100 Events []EventSignal `json:"events,omitempty" yaml:"events,omitempty"`决策规则的type枚举中同样包含event,与keyword、embedding、context等并列(types_route.go)。
七、测试验证:行为已被测试覆盖
仓库为事件分类器提供了完整的单元测试(event_classifier_test.go),可验证以下行为:
| 测试用例 | 验证点 |
|---|---|
TestEventClassifier_NoRules | 无规则时任何文本均不匹配 |
TestEventClassifier_EventTypeMatch | 事件类型词边界匹配 |
TestEventClassifier_NoMatchOnUnrelatedText | 无关自然语言不误匹配 |
TestEventClassifier_SeverityMatch | 大小写无关的严重级别匹配(CRITICAL) |
TestEventClassifier_TemporalMatch | 紧急标记触发时间维度 |
TestEventClassifier_ActionCodeMatch | 动作码TXN_DECLINE匹配 |
TestEventClassifier_MultiCriteriaHighConfidence | 四条件全中置信度1.0 |
TestEventClassifier_PartialCriteriaLowerConfidence | 双条件中一 → 置信度0.75 |
TestEventClassifier_MultipleRulesMultipleMatches | 多规则可同时命中 |
TestEventClassifier_CaseInsensitiveMatching | 事件类型大小写不敏感 |
TestEventClassifier_EmptyRuleNeverMatches | 无任何条件的规则永不匹配 |
这些测试从正面锁定了"词边界、大小写不敏感、置信度分级、空规则防护"四项核心行为,可以作为你自定义事件规则时的行为参照。
八、依赖与限制
- 事件匹配读取请求文本;它不解析或校验权威事件 schema——如果请求是结构化 JSON,匹配基于其文本序列化形式;
- 正则匹配可被调用方伪造:调用方可以随意在文本中插入
critical或urgent字样,因此不要单独用该信号做授权判定或事故严重级别判定; - 适合与其它信号(如 pii、jailbreak、safety)组合使用,事件信号只负责"这是哪种事件",其余防线各司其职。
九、完整示例与下一步
仓库自带可直接参考的事件信号配置:payment-critical.yaml。完整的信号目录位于 config/fragments/signal,其中 event 存放事件信号示例,其余子目录覆盖 keyword、embedding、jailbreak、pii、context、complexity 等启发式信号,可供组合构建复杂的路由策略。若要进一步理解信号如何进入决策引擎,可研读 classifier_signal_event.go 与决策配置文档,将事件信号与routing.decisions的priority、modelRefs配合,搭建出"事件分级 × 模型池映射"的完整生产链路。
- 后端
- API网关
- 模型推理服务
- AI Agent
【免费下载链接】semantic-router
An open, programmable decision layer for models and compute.
相关推荐
semantic-router Event Signal 详解:用正则路由企业事件负载的结构化信号
semantic router Event Signal 详解:用正则路由企业事件负载的结构化信号 事件驱动的企业负载(错误告警、审计日志、事务失败码)与自然语
后端API网关模型推理服务AI Agentsemantic-router 对话信号(Conversation Signal)完全指南:基于请求结构的零推理启发式路由
semantic router 对话信号(Conversation Signal)完全指南:基于请求结构的零推理启发式路由 导读 本文讲解 semantic r
后端API网关模型推理服务AI Agentsemantic-router 信号层(Signal)完全指南:把请求事实变成可复用路由决策
semantic router 信号层(Signal)完全指南:把请求事实变成可复用路由决策 导读 本文是 semantic router(一个开放、可编程的模
后端API网关模型推理服务AI Agent
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考