Integrate LLM support into the application, enhancing the rule management system with a new matcher mode. Update the frontend to handle LLM configurations, including API key management and prompt definitions. Modify the backend to support LLM event matching alongside existing keyword matching, ensuring seamless integration and improved event detection capabilities.

This commit is contained in:
Xin Wang
2026-07-17 22:18:29 +08:00
parent 4caa9e9ee8
commit c23ef80d3a
42 changed files with 1248 additions and 454 deletions

View File

@@ -1,14 +1,14 @@
# 实时通话 ASR 事件监控
一个基于 Spring BootReact 和 AC 自动机的实时通话关键词监控系统。
前端持续提交市民与坐席的 ASR Final 文本,后端按通话维护上下文,匹配当前生效规则,并返回本次新增告警和通话累计结果。
一个基于 Spring BootReact 的实时通话事件监控系统。
前端持续提交市民与坐席的 ASR Final 文本,后端按通话维护共享上下文,可选择 AC 关键词匹配或大模型事件匹配,并返回本次新增告警和通话累计结果。
## 技术栈
| 模块 | 技术 |
| --- | --- |
| 后端 | Java 21、Spring Boot 4、Spring MVC、Spring Data JPA |
| 匹配 | Aho-Corasick 自动机 |
| 后端 | Java 21、Spring Boot 4、Spring MVC、Spring Data JPA、Spring AI 2 |
| 匹配 | Aho-Corasick 自动机 / OpenAI 兼容大模型 |
| 数据库 | H2 文件数据库 |
| 前端 | React 19、TypeScript、Vite、Tailwind CSS、Motion |
| Excel | ExcelJS |
@@ -22,7 +22,7 @@
│ ├── api/ # REST 接口
│ ├── application/ # 监控、规则和会话服务
│ ├── domain/ # 请求、响应和领域模型
│ ├── matcher/ # AC 自动机及匹配器
│ ├── matcher/ # AC、LLM 匹配器及路由
│ ├── repository/ # 规则版本和会话存储
│ ├── job/ # 过期会话清理
│ └── support/ # 异常、文本标准化等
@@ -48,6 +48,15 @@
./mvnw spring-boot:run
```
如需使用“大模型事件匹配”,先设置模型服务的 API Key
```bash
export LLM_API_KEY="your-api-key"
./mvnw spring-boot:run
```
API Key 只从后端环境变量读取,不会进入浏览器、规则数据库或版本历史。模型服务地址、模型名、超时、最大输出 Token 和提示词在前端页面配置。
后端默认地址:`http://localhost:8080`
健康检查:
@@ -146,11 +155,13 @@ flowchart TD
B -- 是 --> D{"callId + seq 是否重复?"}
D -- 是 --> E["返回 duplicate=true"]
D -- 否 --> F["写入该通话的共享上下文窗口"]
F --> G["拼接最近 N 条 Final"]
G --> H["文本标准化"]
H --> I["AC 自动机匹配全部关键词"]
I --> J["合并事件并进行通话级去重"]
J --> K["返回 newAlerts 和 currentResults"]
F --> G{"当前匹配方式"}
G -- AC --> H["拼接、标准化并扫描关键词"]
G -- LLM --> I["注入规则、已发送事件和带角色上下文"]
H --> J["还原业务事件"]
I --> J
J --> K["后端进行通话级最终去重"]
K --> L["返回 newAlerts 和 currentResults"]
```
### 1. 通话隔离与并发
@@ -159,7 +170,7 @@ flowchart TD
### 2. 共享上下文窗口
市民和坐席文本进入同一个、按 `seq` 排序的最近 N 条窗口。默认保留 5 ,能够识别被 ASR 切分到相邻 Final 中的关键词。
市民和坐席文本进入同一个、按 `seq` 排序的通话上下文,默认最多保留 200 轮。AC 只扫描最近 5 ,能够识别被 ASR 切分到相邻 Final 中的关键词LLM 使用当前保留的完整上下文
### 3. 文本标准化
@@ -178,9 +189,26 @@ E M S → ems
匹配结果按业务事件聚合。同一个事件在同一次通话中只进入一次 `newAlerts`,重复命中仍保留在累计状态中,但不会重复提醒。
### 6. 大模型事件匹配
每条规则包含两个标识:
- `id`:系统内部 UUID用于规则管理和版本关联
- `eventId`:简短、稳定的业务事件 ID例如 `E001`
后端把启用规则压缩为 `事件ID|名称|辅助关键词`,并把本通话已经发送的事件 ID 一并放入提示词。模型只允许输出 JSON 字符串数组,例如 `["E001"]``[]`,不输出置信度、证据和原因。后端校验短 ID、还原事件名称并继续执行权威去重。
为提高支持自动 Prompt/KV Cache 的模型服务的缓存命中率,后端会把规则和指令放在稳定前缀中,把每次变化的通话上下文强制追加到提示词最末尾。上下文格式为:
```text
1|citizen|市民发言
2|agent|坐席发言
3|citizen|市民发言
```
## 规则管理与版本回溯
规则保存采用完整文档发布,并携带 `baseVersion` 做乐观并发控制。事务提交成功后才切换运行时 AC 自动机快照。
规则保存采用完整文档发布,并携带 `baseVersion` 做乐观并发控制。匹配方式和大模型配置与规则一起版本化;事务提交成功后才切换运行时快照。
主要接口:
@@ -200,10 +228,12 @@ E M S → ems
| 配置 | 默认值 | 说明 |
| --- | --- | --- |
| `server.port` | `8080` | HTTP 端口 |
| `monitor.recent-final-window-size` | `5` | 每通话保留的最近 Final 数量 |
| `monitor.recent-final-window-size` | `5` | AC 每次扫描的最近 Final 数量 |
| `monitor.max-conversation-turns` | `200` | 每通话最多保留的共享上下文轮数 |
| `monitor.max-processed-seqs` | `500` | 幂等序列号历史上限 |
| `monitor.session-ttl` | `PT2H` | 会话空闲过期时间 |
| `monitor.session-cleanup-interval` | `PT10M` | 过期会话清理周期 |
| `monitor.llm.api-key` | 环境变量 `LLM_API_KEY` | 大模型服务密钥 |
规则数据库默认保存在项目运行目录的 `data/rules.mv.db`
@@ -215,7 +245,7 @@ E M S → ems
### 扩展匹配算法
当前 `matcher` `ac-keyword`可以继续实现正则、语义分类或大模型匹配器,并通过统一的匹配接口进行组合。建议将确定性关键词匹配保持在同步主链路,将耗时模型调用放入异步链路
当前支持 `ac-keyword``llm`。匹配器由统一路由调用,后续可以继续增加正则、高频事件分类、向量检索或组合策略。大模型当前采用同步调用,适合单实例、低流量场景;流量增加后可增加超时降级、隔离线程池、限流、指标和异步结果通道
### 扩展事件处理
@@ -239,6 +269,6 @@ E M S → ems
## 其他说明
- 前端对话中的关键词高亮是本地视觉提示。
- 关键词模式下,前端对话中的关键词高亮是本地视觉提示;大模型模式不做本地关键词高亮
- 真实告警始终以后端 `/api/v1/asr-events` 响应为准。
- 更完整的设计背景见 `asr_event_monitor_confirmed_technical_solution.md`