模板生成与待治理清单
daily_task/rca/中债/。界面示意画的是页面内容区,实际页面左侧还有约 220px 的导航栏。1. 为什么要改
中债 8 份告警去掉客户模板号、让 kb 自己生成模板号后,在两份以上出现的客户模板共 154 个:91 个每份拿到的模板号都相同,19 个部分沿用,44 个在某一份全换了新号。生成的 520 个模板里有 42 个混进了多个客户模板,覆盖 45% 的告警。
逐个复算后,换号有两类原因。一类是内容本来不同(不同的日志行、不同的巡检项),按静态规则就该分开,靠调参数或治理阶段合并。另一类是代码逻辑的缺陷:
| # | 缺陷 | 后果 |
|---|---|---|
| 1 | 「至少多少个词相同」按模板创建时那条告警的词数定,比较却拿泛化后变短的模板去比 | 模板越泛化越难匹配。实例:创建时 43 个词要求至少 33 个相同,模板泛化后只剩 34 个词 |
| 2 | 每并进一条,模板就再泛化一点 | 泛化到几乎全是 <*> 后吸进别的类型的告警 |
| 3 | 本批内按文本字母顺序逐条处理、并进第一个满足的模板;模板号是本批泛化后文本的哈希 | 同样的告警换一种分批方式,得到不同的模板和号 |
| 4 | 变量剔除先把本条告警自己的主机、IP、对象、对象名、资源换成 <OBJ> | 同一句话,对象列有没有值,剔除出来的文本就不一样。例:没有对象列的那份文件里作业名留在文本里,有对象列的几份里作业名变成 <OBJ> |
2. 已定的决定(2026-10-10、10-11 用户)
| # | 决定 |
|---|---|
| T1 | 静态阶段只用通用规则。去掉「本条告警自己的标识换成 <OBJ>」。静态规则合不到一起的同类模板,交给治理智能体按语义合并。 |
| T2 | 匹配用代表文本:模板的代表文本是创建它的那条告警剔除变量后的文本,之后不变。相似度 = 相同词数 ÷ 两边词数较大者,不小于阈值算相似;同时像多个取最像的,并列取最早创建的。 |
| T3 | 批内、批间都按告警时间顺序处理。模板号由「监控系统 + 代表文本」算哈希,创建时定、之后不变。带 <*> 的泛化文本只用来展示。 |
| T4 | 受保护的错误码、占位符、关键词、相似度阈值在界面上按库可调,放在「告警主题 › 设置」末尾。 |
| T5 | 改这些参数会换一代(第 4 节)。 |
| T6 | 模板号是两层结构:有父节点就用父节点的号。父节点新建、号以 m: 开头,看号就知道是合并来的。所有用到模板的环节(展示、统计、清单、解析规则、分析结果包、给 RCA 智能体的工具出参)都取有效模板号。存储不动,成员照旧各自记账。 |
| T7 | 去掉冲突功能。 |
| T8 | 去掉噪音页签和噪音审批;用户可以把某个模板标记为噪音,之后分析时剔除这些告警。 |
| T9 | 「依赖候选」改名,页签保留,等治理智能体有产出再优化。 |
| T10 | 这一阶段的产出是给治理智能体的待治理清单,改完代码连清单内容一起验证。 |
| T11 | 所有规则都在页面上看得见、改得了,代码里不留隐藏规则:分词、关键词判定(含 Exception/Error 结尾、比较运算符)都做成可配参数。 |
| T12 | 变体骨架同样不再去掉「本条告警自己的标识」。2026-10-11 实施后用户改:变体不再用骨架,改按剔除变量后的文本分(11.2)。 |
| T13 | 人可以在页面上发起模板合并,和治理智能体调同一个接口。 |
| T14 | 噪音告警不出现在结果包里,简报也不写。 |
| T15 | 待治理清单每项附「相似但没过阈值的模板」前 3 个。 |
| T16 | 「依赖候选」改名为「对象关系」。 |
| T17 | 人在页面上合并模板只有「确认合并」一步,没有「提交」;治理智能体提交的合并请求进「待确认 › 模板合并」。 |
| T18 | 待确认的页签为:解析规则(告警字段的提取规则,如对象、主机、应用)、模板合并、对象关系(原依赖候选)、语义约定、谓词。冲突、噪音、列映射都没有。 |
| T19 | 模板怎么生成只由 kb 的静态规则(第 3 节、可配参数)决定;在模板这件事上,治理智能体只做合并,不写模板正则。治理智能体的另一件事是写解析规则,即告警字段的提取规则。 |
3. 模板生成(算法包 2.0.0)
3.1 变量剔除
- 受保护的错误码先藏起来,最后原样放回。库设置里的列表 + 语义约定里的「错误码格式」。
- 按占位符表的顺序逐条替换。
- 空白合成一个空格。
不再有 <OBJ> 这一步。变体(同一模板下的不同写法)的骨架原来也先去掉本条告警自己的标识,同样去掉(T12):骨架 = 告警内容里的中文短语(按出现顺序)+ 命中的受保护错误码(去重排序)。已改(2026-10-11 用户,算法包 2.1.0):变体 = 同一模板下剔除变量后的文本,文本不同就是不同变体,和告警用什么语言写无关(11.2)。
3.1a 全部规则一览(T11)
静态阶段只有下面这些规则,都在「设置 › 模板生成」卡片里展示、可改,内置值预填,代码里不另有判断:
| 规则 | 内置值 | 作用 |
|---|---|---|
| 受保护的错误码 | 6 条正则(Oracle、TNS、MQ、IBM 消息号、HTTP 4xx/5xx、errno 名) | 命中片段原样保留 |
| 占位符 | 10 条有序正则(<TS> <DATE> <TIME> <UUID> <IP> <HEX> <HASH> <ID> <PCT> <N>) | 变量换成占位符;最后空白合成一个空格 |
| 分词正则 | <[A-Z*]+>|[^\W_]+(?:'[^\W_]+)*|[!<>=]+ | 把剔除后的文本切成词;不匹配的字符(标点、下划线、空格)当分隔 |
| 关键词:中文(含有即算) | 超时、拒绝、重置、连接断开、连接中断、不可用、无法连接、连接失败、失败、恢复、不、未、无、满、不足、死锁、阻塞 | 关键词序列不同的告警不归为同一模板(开关) |
| 关键词:英文(整词,不分大小写) | timeout、refused、rejected、unavailable、failed、failure、not、no、cannot、full、down、up、error、warning | |
| 关键词:正则(整词匹配) | \w*(Exception|Error)、[!<>=]+ | |
| 相似度阈值 | 0.75 | 代表文本匹配(3.2) |
| 关键词序列必须一致 | 开 | 同上 |
变体的分法也在卡片里写明,本期只展示,不做参数。2.1.0 起变体按剔除变量后的文本分,用的就是卡片上这套规则。
3.2 匹配与模板号
对一批告警:按(告警时间, 行号)排序,同一监控系统内逐条处理
剔除变量后的文本 t,分词得到 tokens
候选 = 本监控系统当前代次里不晚于这条告警建的模板
(库里已有的按创建它的那条告警的(时间, 行号)算 + 本批前面新建的)
对每个候选 c(代表文本 r,分词 rt):
关键词序列不同 → 跳过(开关,默认开)
相似度 = LCS(tokens, rt) ÷ max(len(tokens), len(rt))
取相似度 ≥ 阈值里最高的;并列取最早创建的 → 这条告警的模板
一个都没有 → 新建模板:代表文本 = t,模板号 = s: + sha1(监控系统 + t) 前 12 位
候选很多时,先用「共有词数 ÷ 较长一方词数」这个上界和长度比筛掉不可能的,再算 LCS,结果不变。
确定性保证:一条告警分到哪个模板,只取决于它自己和比它早的告警。所以同一批数据按时间任意切分摄入、同一批数据再摄入一次,每条告警的模板号都和一次性摄入相同。这条写成单测。
只比不晚于本条告警建的模板(实施时定,2026-10-11 用户):原稿的候选是「当前代次的全部模板」。实测同一批再摄入时,比这条告警晚建、和它更像的模板也成了候选,中债 28618 条里有 108 条换号,不满足 8.1 的 A1。改为只比不晚于本条告警建的模板之后,两种比较都是 0 条不同。分组表为此加 origin_time、origin_row,记创建模板的那条告警的毫秒时间和它在文件里的行号;时间相同时才比行号,只在同一份文件内有意义。
已知限制:先摄入新数据、再补摄更早的数据时,早期告警只能匹配已有模板,不会回头改代表文本;补摄的结果和按时间顺序摄入可能不同。
展示文本:模板页面显示的泛化文本(不同之处记 <*>)由成员样本算出来,只展示,不参与匹配。分组表的 signature 列存代表文本,template_text 存展示文本。
客户数据带模板号时照旧直接用,不走这一节。
4. 参数设置
放在「告警主题 › 设置」页签末尾,新加一张卡片「模板生成」,每个库一份,内置值预填。
模板生成
没有客户模板号时,kb 先剔除变量、再按相似度把告警归成模板。改动后已有的 kb 生成模板会全部重算,要换一代。
| 正则 | 说明 | |
|---|---|---|
ORA-\d{4,5} | Oracle | 删除 |
\b[A-Z][A-Z0-9]{2,4}\d{4}[EWI]\b | IBM 消息号 | 删除 |
| … 共 6 条内置 · 添加 | ||
| 顺序 | 占位符 | 正则 | |
|---|---|---|---|
| 1 | <TS> | \d{4}[-/]\d{1,2}[-/]\d{1,2}[ T]\d{1,2}:\d{2}… | 上移 下移 删除 |
| 5 | <IP> | (?<![\d.])(?:\d{1,3}\.){3}\d{1,3}(?![\d.]) | 上移 下移 删除 |
| 10 | <N> | (?<![A-Za-z_])\d+(?:\.\d+)?(?![A-Za-z_]) | 上移 下移 删除 |
| … 共 10 条内置 · 添加 | |||
<[A-Z*]+>|[^\W_]+(?:'[^\W_]+)*|[!<>=]+\w*(Exception|Error)[!<>=]+ 添加变体:同一模板下,按上面的规则剔除变量后文本不同的记为不同变体(只展示)。占位符没覆盖到的变量会多拆出变体。
参数存在告警主题的设置里(template 一段)。没有保存过的库用内置值;保存后整套存下,页面看到的就是生效的。正则保存前校验能否编译;预览和摄入用同一套代码。
4.1 改参数
改占位符、关键词、阈值,代表文本和相似判定都会变,模板号跟着变,新旧模板之间没有确定的一一对应,所以换一代。流程同全局提取规则的 D3a:
- 预览:新参数下会分成多少个模板。
- 显示影响:作废多少分组、多少条已确认的解析规则。
- 输入库代号,保存后换一代。
- 自动用保留的上传文件重新摄入近 7 天,新一代不是空的。
- 已确认的解析规则带到新一代,状态为待确认:旧分组的告警在新一代落到哪个模板,就把规则挂成待确认版本,由人重新确认。
用客户模板号的库只有展示文本会变,不换代。
5. 两层模板号与模板合并
5.1 数据结构
| 位置 | 改动 |
|---|---|
分组表 tb_sem_alert_group | 加 origin_time、origin_row(创建模板的那条告警,见 3.2)、parent_id(成员指向父节点)、noise 与标记说明、操作人、时间(第 6 节)。父节点也存成一行:模板号 m: 开头、没有自己的告警,展示文本取成员的汇总。 |
新表 tb_sem_alert_template_merge | 合并的审批记录:父节点、成员列表、依据(智能体的语义说明)、证据(正则、样本引用)、状态(待确认 / 已确认 / 已驳回 / 已撤销)、处理人与说明。同一成员同一时间只属于一条有效记录。 |
| 算法包 | 库快照多一份「子模板号 → 父模板号」映射。分组时同时算两个键:存储用的(成员自己的)和有效的(父节点的)。 |
父节点的号在合并确认时生成,m: + 哈希(监控系统 + 合并记录 ID),之后不变。结构固定两层:只在同一监控系统内合并;父节点不能再有父节点;把模板并进已有父节点就是加成员;两个父节点合并时一边的成员挂到另一边,空了的父节点作废。
5.2 作用域:哪里取有效模板号
| 环节 | 做法 |
|---|---|
| 摄入 | 统计、样本、变体照旧记在成员自己名下(存储不动,撤销干净)。 |
| 解析规则(告警字段的提取规则) | 挂在父节点上,对所有成员生效。成员原有的规则在审批合并时处理:选一条保留,或由智能体给出合并后的规则一起审。 |
| 分析(结果包、给 RCA 智能体) | 按有效键分组:信号、模板表、时间线里只有父节点。 |
| 解析规则列表 | 父节点一行,展开看成员;统计按成员求和。 |
| 分组详情、待治理清单 | 按父节点折叠:样本取成员并集,条数求和。 |
| 噪音标记 | 标在有效模板上(第 6 节)。 |
| 模板 | 模板内容 | 告警 | 规则 |
|---|---|---|---|
m:3f2a91c0d7e4 合并 · 2 个模板 | 作业 <*> 告警 Ended not OK | 57 | 已确认 |
s:e1c0a7b2f5d9 | 作业 JOB_A<N> 告警 Ended not OK | 40 | 随父节点 |
s:7b44d02c9a13 | 作业 nightly_check 告警 Ended not OK | 17 | 随父节点 |
s:90ad3e17c2b8 噪音 | 巡检脚本 ntp-check 退出码 <N> | 36 | 仅全局 |
5.3 发起与审批(T13、T17)
合并记录只有一个创建接口:给出同一监控系统下的几个模板号(可以含已有父节点)、合并依据,可附正则和样本引用作证据。请求带「直接确认」时创建即生效,不带时是一条待确认记录。
- 人:解析规则列表多选模板 →「合并」→ 对话框列出成员的模板号、展示文本、条数,填依据 →「确认合并」。一步完成,不经过待确认。
- 治理智能体:调同一个接口、不带「直接确认」,请求进「待确认 › 模板合并」,人在抽屉里看成员的展示文本和样本、依据、证据,确认或驳回。
- 已确认的合并可以在父节点的抽屉里撤销。
- 成员各有已确认的解析规则时,确认前必须选定保留哪一条(或带上合并后的规则一起确认)。
- 治理智能体的身份只能创建待确认记录,不能直接确认。
6. 噪音
- 去掉「告警主题 › 噪音」页签、待确认里的「噪音」一类、噪音审批和噪音规则表;待治理清单去掉「噪音候选」。
- 解析规则列表和规则抽屉里加「标记为噪音 / 取消」,填一句说明,立即生效、不审批,记下操作人和时间。标在有效模板上,父节点标了等于全部成员都标了。
- 分析时剔除这些模板的告警,结果包里完全不出现,简报也不写(T14)。摄入照旧统计,取消标记后之前的数据还在。
- 标为噪音的模板不进待治理清单。
7. 冲突、「依赖候选」与待确认页签
- 去掉冲突:摄入时不再把标识、关系标为冲突,去掉冲突列表、裁决接口和待确认里的「冲突」页签。中债两个试跑库里的 335 条冲突基本都是假冲突(占位 IP
0.0.0.0挂在多台主机上;应用集群对象运行在多台主机上)。 - 「依赖候选」改名为「对象关系」(T16),页签保留。现在没有任何代码会产生它,等治理智能体提对象之间的关系后再优化。
待确认的页签(T18):
| 页签 | 内容 | 谁产生 |
|---|---|---|
| 解析规则 | 告警字段的提取规则:对象、主机、应用等字段怎么从某一类告警里取,按模板(分组)写。不是模板的生成规则 | 治理智能体提交;人在规则抽屉里写的可以直接确认 |
| 模板合并 | 把同类的几个模板并到一个 m: 父节点(第 5 节) | 治理智能体提交;人在列表里合并的直接生效,不进这里 |
| 对象关系 | 对象之间的关系,原「依赖候选」 | 治理智能体(第 3 期),现在为空 |
| 语义约定 | IP 规划、系统别名、错误码格式等,作用于全库 | 人手工新建或导入;治理智能体以后提 |
| 谓词 | 告警分类用的受控词表;建库时预置 12 个已确认 | 人手工新增 |
8. 待治理清单(这一阶段的产出)
治理智能体经 worklist 读,kb 读取时现算、不存表。改完后的内容:
| 部分 | 内容 |
|---|---|
new | 有效模板(父节点折叠成员)里没有已确认、也没有待确认规则的;不含标为噪音的。每项带:监控系统、模板号(有父节点的给父节点号和成员号)、代表文本与展示文本、首末次、告警条数、没有对象的条数、要提取的字段、最近一次驳回或撤销的说明,以及「相似但没过阈值的模板」(T15):同一监控系统里相似度最高、但低于阈值的前 3 个,给出模板号、代表文本、相似度,供治理智能体判断要不要合并。先放没有对象的,再按条数从多到少。 |
drifted | 已确认规则的字段命中率下降、没有待确认新版本的。 |
manual | 连续驳回两次、转人工的。 |
(去掉)noiseCandidates | 噪音不再由治理智能体处理。 |
分组详情另由按分组查询的接口取:样本(每条带全局规则取到的各字段值)、变体、统计。
8.1 功能正确性(有确定的通过条件)
这一节的结果由逻辑决定,每条写明检查方法和通过条件,全部通过才算验收。效果好坏和处理速度现在定不了标准,放在 8.2 只记录。单测只用虚构数据(seed 7 和单测里内联的数据),中债数据只在本机跑,结果写进 daily_task/rca/中债/trial-results.md。
| # | 验什么 | 检查方法 | 通过条件 |
|---|---|---|---|
| A1 | 模板号确定:分批方式不影响结果 | 单测:同一份虚构数据(去掉模板号)一次摄入,与按时间切成 2 批、3 批(切点不同)分别摄入,比每条告警的模板号。本机:中债 8 份按时间合成一份离线处理一次,与逐份带已有模板处理,比每条告警的模板号 | 两种做法每条告警的模板号 100% 相同;同一批数据再摄入一次,模板号和分组数不变 |
| A2 | 中债跨批次「换号」都有规则可解释 | 脚本:对库 B 里每一次「某客户模板在后一份没沿用前面的生成号」,取那条告警剔除后的文本,按当时库里同监控系统的全部代表文本重算相似度和关键词序列 | 每一次换号都满足「与所有已有代表文本的相似度都低于阈值,或关键词序列不同」,没有例外。换号的次数、稳定的比例属于效果,见 8.2 |
| A3 | 变量剔除不受字段取值影响 | 单测:同一句告警内容放在有对象列、没有对象列的两份文件里分别摄入 | 两份得到同一个模板号;剔除后的文本里不出现 <OBJ> |
| A4 | 参数生效且没有隐藏规则 | 单测:分别改占位符(加一条正则)、分词正则、三类关键词、阈值、关键词开关,看剔除后的文本和模板数;保存非法正则 | 每种改动都按参数改变结果:加一条能命中某个变量的占位符后,只差这个变量的两个模板变成一个;去掉一个关键词后,只差这个关键词的两条告警能归为同一模板;关键词开关关掉后不再检查关键词序列。非法正则 422 且不保存;没有保存过参数的库与内置值结果相同 |
| A5 | 改参数换代 | 单测 + 页面:库里有 kb 生成模板时改参数 | 预览给出新模板数;不输库代号 422;输入后代次加 1;保留期内每份上传文件各排一个重新摄入任务;每条已确认的解析规则在新一代对应的模板上各有一个待确认版本。用客户模板号的库改参数不换代 |
| A6 | 两层模板号 | 单测:两组合并后查解析规则列表、分组详情、待治理清单、分析结果包;再撤销 | 父节点号以 m: 开头;以上四处只出现父节点,条数等于成员之和;解析规则挂在父节点上对成员生效;撤销后恢复成两组、统计不丢;跨监控系统合并、父节点再挂父节点都被拒绝 |
| A7 | 合并的两个入口 | 单测 + 页面:人在列表多选两组「确认合并」;同一接口不带「直接确认」提交;治理智能体身份调用 | 人的合并立即生效、待确认里没有;不带确认的进「待确认 › 模板合并」,确认后生效、驳回后不生效;治理智能体身份带「直接确认」被拒绝;成员各有已确认解析规则时不选保留哪条就不能确认 |
| A8 | 噪音标记 | 单测 + 页面:标记一个模板为噪音后分析同一份文件;再取消 | 结果包所有文件(简报、告警明细、信号、模板、时间线等)里都没有这个模板的告警,简报里也没有任何关于噪音的字样;待治理清单不含这个模板;取消后再分析恢复 |
| A9 | 冲突去掉、待确认页签 | 单测 + 页面:摄入中债任意一份 | 标识、关系的状态里没有 conflict;冲突接口不存在;待确认只有解析规则、模板合并、对象关系、语义约定、谓词五个页签,告警主题下没有噪音页签 |
| A10 | 待治理清单内容(本阶段产出) | 在重建的库 B 上取一次清单,用独立脚本按 kb 的数据重算后逐项对比 | 见下面 A10 明细,全部一致 |
| A11 | 回归 | kb semantic 单测、PostgreSQL 回归、平台 semantic 单测、端到端用例 semantic-management(按新页签、设置卡片更新后) | 全部通过 |
A10 待治理清单的明细(库 B:8 份中债告警去掉模板号、按时间逐份摄入;先人工标 1 个模板为噪音、合并 1 组模板、驳回 1 组的解析规则两次,再取清单):
new的条目数 = 解析规则列表里「规则状态为仅全局、未标噪音」的有效模板数(父节点折叠成员)。- 被合并的成员不单独出现,父节点作为一项出现,带成员模板号;被标噪音的模板不出现;连续驳回两次的那组在
manual里,不在new里。 - 每项都有:监控系统、模板号、代表文本、展示文本、首末次、告警条数、没有对象的条数、要提取的字段、最近一次驳回说明(没有时为空)、相似模板。
- 排序:没有对象的条数大于 0 的全部排在前面,各段内按告警条数从多到少;脚本逐项检查相邻两项。
- 要提取的字段 = 模板层能写的标准字段 − 本监控系统全局规则已覆盖的字段;脚本按库里的全局规则重算后逐项相同。
- 相似模板:每项不超过 3 个,都在同一监控系统、相似度低于阈值、按相似度从高到低;脚本用同一套参数独立重算后相同。
- 告警条数、没有对象的条数与该模板在小时统计里的合计相同(注意 35 天保留只算仍在保留期内的天)。
8.2 效果与性能(现在定不了标准,只写内容和方法,结果照实记录)
这些结果取决于参数和数据,现在没有依据定门槛。实施后按下表的方法测,记进本机 trial-results.md,用户看过记录后再定标准或调参数。中债都用重建的库 B(8 份去掉模板号、按时间逐份摄入、内置参数)。
| # | 验收内容 | 方法 | 记录什么 |
|---|---|---|---|
| B1 | 生成模板与客户模板的对应 | 沿用 v1/template_compare.py:从结果包 templates.csv 经 template_key 取生成的模板号,按告警 id 和客户模板号对齐,客户模板按(监控系统, 客户模板号)计 | 在两份以上出现的客户模板里:每份号都相同 / 部分沿用 / 全换新号各多少(改前是 91 / 19 / 44);一个生成号混进多个客户模板的个数和告警占比(改前 42 个、45%);一个客户模板在一份里拆成多个生成号的个数;生成模板总数(改前 520,客户模板 491) |
| B2 | 换号的原因分布 | A2 的脚本,按原因分类计数 | 相似度低于阈值、关键词序列不同各多少;每类附 3 个例子(模板号、两边的代表文本,留在本机) |
| B3 | 相似度阈值的影响 | 库 B 的数据离线处理,阈值取 0.6、0.7、0.75、0.8、0.9 各跑一次,其余参数用内置值 | 每个阈值下 B1 的各项数字,供选默认阈值 |
| B4 | 待治理清单的规模 | A10 那次取的清单 | new、drifted、manual 的条目数;new 里没有对象的占多少;有相似模板的条目占多少、相似度分布 |
| B5 | 处理耗时 | 本机单进程 kb,库 B 逐份摄入;设置卡片的预览;换代后的重新摄入;确认一条解析规则 | 每份摄入的秒数(改前 3 月那份 9056 条 99 s);预览的秒数;换代到重新摄入完成的总时间;确认解析规则的秒数(改前 65–99 s,会超过平台到 kb 的代理超时) |
9. 影响面
| 位置 | 改动 |
|---|---|
| aimp-kb 算法包 | text.py 变量剔除可配、去掉 <OBJ>;cluster.py 代表文本匹配;records.py 分组与有效键;aggregate.py 去掉噪音规则、加噪音剔除;ALGO_VERSION 升 2.0.0。 |
| aimp-kb 服务 | 设置校验与换代;合并表与审批;分组表 parent_id、噪音标记列;去掉冲突、噪音表与接口;清单改造。需要一个迁移,旧数据不兼容(库 A、库 B 删除后重建)。 |
| aimp-platform 页面 | 设置页签加卡片;解析规则列表与抽屉显示父节点、噪音标记,多选后「合并」→「确认合并」;待确认整理为五个页签(去掉冲突、噪音,加模板合并,「依赖候选」改名对象关系);去掉告警主题下的噪音页签。 |
| aimp-meta | 端到端用例;流程稿、数据标准、设计文档同步(接上原任务单的 W1)。 |
| aimp-ops-skills | 算法包副本第 4 期再同步。 |
10. 原未决问题的结论(2026-10-11 用户)
| # | 问题 | 结论 |
|---|---|---|
| 1 | 「依赖候选」的新名字 | 「对象关系」 |
| 2 | 关键词里的内置规则是否可配 | 可配;所有规则清晰可见,代码里不藏规则(T11)。分词正则一并可配 |
| 3 | 变体骨架是否去掉本条告警自己的标识 | 去掉 |
| 4 | 人能否手工发起合并 | 要做,和治理智能体调同一个接口 |
| 5 | 噪音告警是否留在结果包里 | 不留,结果包里完全不出现 |
| 6 | 清单是否附相似但没过阈值的模板 | 附,前 3 个 |
11. 实施记录与交接(新会话从这里开始)
11.1 已实施(2026-10-11,都在本地 main,未推送)
| 仓库 | 提交 | 内容 |
|---|---|---|
| aimp-kb | 429d009 | 算法包 2.0.0(规则参数化、去掉 <OBJ>、代表文本匹配、有效键、噪音剔除);迁移 0092;噪音改为标记模板 |
| aimp-kb | ce7ecef | 模板合并的提交、审批、撤销;列表、详情、清单、概览按父节点折叠 |
| aimp-kb | 6869c1c | 去掉冲突 |
| aimp-kb | 03daa67 | 模板生成规则的保存、预览、换代、规则带到新一代 |
| aimp-kb | 0bc08da | 清单附相似模板,各类条目字段一致 |
| aimp-kb | 65bfb0b、8819a04 | 候选只取不晚于本条告警建的模板(3.2);PostgreSQL 回归按全部语义迁移升降级 |
| aimp-platform | 7be1d613 | 设置卡片、解析规则的合并与噪音标记、待确认五个页签、去掉噪音页签 |
| aimp-meta | 00cfdfe | 端到端用例 semantic-management 按新流程改写 |
| aimp-kb | 801ef2f | 实施后用户改(11.2):算法包 2.1.0,变体按剔除变量后的文本分;分组详情只列最近出现的 100 个变体并给总数 |
| aimp-platform | 6eeb0267、6e138a97 | 解析规则抽屉的变体页签改为表格:剔除变量后的文本、所属成员、可读的首次与最近出现时间、保留样本(可展开) |
| aimp-platform | c244bb0b | 实施后用户改(11.2):抽屉的「样本」「统计与命中率」合成「相关告警」,上面按天的告警数量,下面保留的样本;字段命中率改为字段表的「取值率」列 |
| aimp-kb | 5f47506 | 实施后用户改(11.2):算法包 2.2.0,去掉通用调用失败词和从正文抽调用目标,调用失败与目标只按解析规则;去掉 /stopword 动作 |
| aimp-platform | ca10ee6a | 静态阶段去掉未解析目标的入口:抽屉页签、解析规则页的筛选与列、告警对象的子页、设置页的引用停用词 |
本机部署:迁移前快照 .runtime/backups/kb-20261010T231656Z(UTC 时间命名),kb 迁到 0092,清空全部 21 张 tb_sem_* 和旧语义库的存储目录,平台前端重新构建。当前的中债库 B 是 zz-gen-20261011:8 份去掉模板号、按时间逐份摄入、内置参数,只有静态处理的结果,没有任何确认、合并、标记。端到端用例跑三遍留下 6 个虚构库(3 个 sem-ui-*、3 个 sem-ro-*),都已停用,照惯例保留。库 ID 在本机 daily_task/rca/中债/v2/results/state.json。
test_sem_merges、test_sem_ui_contract、test_sem_alertalgo_v12)里核过。确认解析规则、确认模板合并现在的流程、耗时拆分和问题见 docs/semantic-confirm-and-merge-flow.md,下一阶段决定怎么改。验收:8.1 的 A1–A11 全部通过,8.2 的 B1–B5 已测完,数字记在本机 daily_task/rca/中债/trial-results.md 第 5 节。汇总:
- A1:中债 28618 条,逐份带已有模板处理、合成一份一次处理、kb 库 B 逐份摄入、同一批再摄入一次,四种做法每条模板号都相同。
- A2:58 次换号都能用规则解释(相似度低于阈值 36 次,关键词序列不同 15 次,匹配到更像的另一个模板 7 次)。
- A10:在纯静态的库 B 上,独立脚本直接读 kb 的表重算清单,539 项逐项一致。
- B1:两份以上出现的客户模板 154 个,每份号都相同 / 部分沿用 / 全换新号由 91 / 19 / 44 变为 103 / 23 / 28;生成模板 539 个(改前 520);混进多个客户模板的生成号 41 个、覆盖 41.6% 的告警(改前 42 个、45%)。阈值 0.6–0.9 的对照在 B3。
- B5:3 月那份 9056 条摄入 67–71 s(改前 99 s);设置卡片预览 3–6 s;换代到 8 份重新摄入做完约 170 s。确认解析规则、确认合并的耗时属于治理阶段,记在
docs/semantic-confirm-and-merge-flow.md。
测试:kb semantic 单测 159 passed(63 个 PostgreSQL 专用用例在 sqlite 下跳过),PostgreSQL 回归 63 passed,平台 semantic 单测 57 passed,端到端用例 2 passed。
变体改口径(2.1.0,11.2)之后:kb semantic 单测 163 passed(65 个在 sqlite 下跳过),PostgreSQL 回归 64 passed,平台 semantic 单测 58 passed。库 B 先拍快照 .runtime/backups/kb-20261011T055546Z,删掉后按同样做法重建(代号不变):变体 1997 个,和离线算的一致;模板号与离线逐条比 0/28618 不同,A10 清单 539 项独立脚本 0 处问题,和改口径前相同。数字在 trial-results.md 5.3 节。
去掉通用目标抽取(2.2.0,11.2)之后:kb semantic 单测 164 passed(65 个在 sqlite 下跳过),PostgreSQL 回归 64 passed,平台 semantic 单测 62 passed。合成数据里三处调用失败(URL、target=、jdbc:)改由规则的 relations 写明,测试改走规则这条路。库 B 拍快照 .runtime/backups/kb-20261011T064917Z 后删掉重建(代号不变):模板 539、变体 1997、样本 3955、对象 2941,和 2.1.0 相同;未解析目标由 363 个变为 0,调用失败关系 0(2.1.0 也是 0);模板号与离线逐条比 0/28618 不同,B1 仍是 103 / 23 / 28,A10 清单 539 项 0 处问题。
11.2 实施时定下的细节
标「用户」的由用户在实施中决定(2026-10-11),其余是方案没写、按方案意图定的缺省做法。
| 事项 | 做法 | 定的人 |
|---|---|---|
| 候选模板的范围 | 只比不晚于本条告警建的模板(3.2) | 用户 |
| 换代后几条已确认规则落到同一个新模板 | 取落到这个模板的告警最多的那条,并列取较早确认的;计数跨重新摄入的各份文件累加;一个旧模板的告警散到几个新模板时,每个新模板各挂一个待确认版本 | 用户 |
| 治理智能体的身份 | 只在服务层判:合并的创建接口只有用户主体能带「直接确认」,其他主体只能建待确认记录(单测模拟集成主体)。HTTP 路由这一期仍只收用户主体,第 2 期治理工具族接通路时再放开 | 用户 |
| 撤销合并后成员的规则 | 恢复成员合并前各自的已确认规则:合并期间成员的规则只是不生效,不作废 | 用户 |
| 变体的分法 | 同一模板下剔除变量后的文本不同就是不同变体(和生成模板用同一套剔除规则),不再用中文短语 + 受保护错误码:中文绑定没有道理,英文告警分不出变体,用中文写的机构名反被拆成变体。算法包升到 2.1.0(按 1.2.0 的先例记次版本,库 B 随之重建)。中债库 B 上变体由 824 个变为 1997 个,单个模板最多 66 个;分组详情只列最近出现的 100 个并给总数,界面按表格显示、时间可读 | 用户 |
| 规则抽屉的统计 | 「样本」与「统计与命中率」合成「相关告警」:上面是落到这个模板的告警按天的条数(多个对象合计、列出各小时条数,统计只计上传声明的时段、保留最近一次导入日往前 34 天,没有统计时写明最近出现时间),下面是保留的样本。字段命中率挪到「规则与预览」字段表,加「取值率」列,只有已确认的本模板规则写了的字段有值 | 用户 |
| 通用调用失败与目标抽取 | 去掉。原来正文里出现「失败」「failed」「超时」这类词就判调用失败,再从正文里抽 IP、主机:端口、URL、jdbc: 串当调用目标,规则在代码里、界面上看不到。中债库 B 上抽出 363 个目标、匹配成功 0 个,其中 167 个是 Java 堆栈的「文件名:行号」(形如 Xxx.java:133),102 个是正文开头的来源主机自己的另一个地址。算法包升到 2.2.0(次版本,库 B 重建);调用失败与目标只按解析规则的 classify.call_fail、relations,synonym 约定和引用停用词现在没有地方用,治理阶段再定 | 用户 |
| 成员带噪音标记再合并 | 合并后只看父节点的标记,成员自己的标记不生效,撤销后恢复;合并对话框提示哪些成员标了噪音 | 用户 |
| 两个哈希 | s: = sha1(监控系统 + \x1f + 代表文本) 前 12 位;m: = sha1(监控系统 + \x1f + 合并记录 ID) 前 12 位 | 缺省 |
| 两个父节点合并 | ID 小的父节点留下,另一个的成员挂过来,它自己作废;它的已确认合并记录记为历史版本 | 缺省 |
| 合并时只有一条已确认规则 | 自动带到父节点;一条都没有时父节点没有规则(仅全局) | 缺省 |
| 相似但没过阈值的模板 | 候选是同一监控系统的其他有效模板(包括标了噪音的);不列相似度为 0 的;并列取较早创建的;父节点取成员代表文本里最高的一对;客户模板号没有代表文本,用展示文本去掉 <*> 比。转人工的条目也带要提取的字段、最近一次驳回说明和相似模板 | 缺省 |
| 展示文本 | 成员文本逐条按 LCS 合并,不同之处记 <*>;两段文本词数乘积超过 25 万的那条跳过(只影响展示) | 缺省 |
| 换代后的重新摄入 | 旧一代里每份做完摄入、仍在保留期的上传文件排一个任务,窗口取这份文件各次摄入窗口的并集,按数据时间先后排队 | 缺省 |
| 用客户模板号的库改规则 | 不换代,按保留样本立即重算展示文本,不加规则版本号 | 缺省 |
| 分析时剔除噪音 | 简报的「读入行数」也不计这些告警,结果包里看不出剔除过;alerts.csv、signals.csv 去掉 noise_rule 列,简报的段名【范围与噪音】改为【范围】 | 缺省 |
| 结果包里的模板号 | templates.csv、信号、时间线按有效模板(父节点);alerts.csv 的 template_id 列仍是原始的标准字段(客户模板号),有效模板在 monitor_group、template_key | 缺省 |
| 快照 | noise.csv 换成 noise.json(有效模板号),新增 parents.json;templates.json 每项带 since(创建它的告警) | 缺省 |
11.3 已知问题与下一步
- 确认规则、确认合并超过代理超时(治理阶段):确认规则约 96 s、确认合并约 86 s(保留 8 份文件时)。流程、耗时拆分、问题和可选改法见
docs/semantic-confirm-and-merge-flow.md,第 2 期治理工具接批量确认之前要定。 - ops-skills 里的算法包副本还是 1.2.0。kb 现在导出的快照是 2.2.0,副本按主版本不一致拒用快照(
major_mismatch)。第 4 期同步副本前,本地按快照处理用不了。 - 导入带
template一段的配置。库里有 kb 生成的模板时会触发换代、要库代号;导入的差异预览(dry-run)没有提示这一点。 - 补摄更早的数据(3.2 已知限制)照旧:已经分好的晚期告警不会回头改。
- W1 文档同步已做完(2026-10-11):数据标准、设计、总纲、流程稿(4.5、4.8a 节)、语义管理界面方案(文首「2026-10-11 同步」)、交接文档文首。下一步是第 2 期,见交接文档。
daily_task/rca/中债/;不调外部模型;默认不开子 Agent。这一阶段不验证语义相关的结果(谁写解析规则、能不能指向根因)。