feat(server): KB prompt优化、字幕修复、S2S重连、助手配置API

- assistantProfileConfig: KB answer prompt改为分层策略(严格产品信息+灵活常识补充)
- nativeVoiceGateway: S2S upstream自动重连(最多50次)、event 351字幕debounce(800ms取最长文本)
- toolExecutor: 确定性query改写增强、KB查询传递session上下文
- contextKeywordTracker: 支持KB话题记忆优先enrichment
- contentSafeGuard: 新增品牌安全内容过滤服务
- assistantProfileService: 新增助手配置CRUD服务
- routes/assistantProfile: 新增助手配置API路由
- knowledgeKeywords: 扩展KB关键词词典
- fastAsrCorrector: ASR纠错规则更新
- tests/: KB prompt测试、保护窗口测试、Viking性能测试
- docs/: 助手配置API文档、系统提示词目录
This commit is contained in:
User
2026-03-24 17:19:36 +08:00
parent 57a03677a9
commit 9567eb7358
34 changed files with 7076 additions and 46 deletions

View File

@@ -222,6 +222,9 @@ const ROUTE_TOPIC_KEYWORDS = [
'慈善',
'慈善事业',
'社会责任',
'Rolf Sorg',
'RolfSorg',
'斯派尔',
'不上市',
'汽车奖励',
'退休金',
@@ -359,6 +362,8 @@ const ROUTE_TOPIC_KEYWORDS = [
'直销还是传销',
'合不合法',
'正不正规',
'正规吗',
'合法吗',
'层级分销',
'非法集资',
'拉人头',
@@ -410,6 +415,8 @@ const ROUTE_TOPIC_KEYWORDS = [
'区别',
'哪个好',
'多久见效',
'见效',
'多久能见效',
'哪里买',
'怎么买',
'保质期',
@@ -466,6 +473,110 @@ const ROUTE_TOPIC_KEYWORDS = [
'搭配吃',
'吃药',
'药物',
// 产品剂型/形态(用户质疑/纠正时常提及)
'粉末',
'粉剂',
'粉状',
'冲剂',
'冲泡',
'片剂',
'药片',
'胶囊',
'软胶囊',
'颗粒',
'口服液',
'膏状',
// 质疑/纠正/确认/怀疑/复查类口语词(全覆盖)
// 直接否定
'不是的',
'才不是',
'不是不是',
'不是这么回事',
// 指出错误
'搞错了',
'说错了',
'弄错了',
'记错了',
'搞混了',
'搞反了',
'记岔了',
'说反了',
'张冠李戴',
'答非所问',
// 说AI不对
'不对',
'不是这样',
'不准确',
'不正确',
'有误',
'说的不对',
'回答有误',
'不太对',
'不太准',
// 与认知矛盾
'不一样',
'不一致',
'前后矛盾',
'自相矛盾',
// 怀疑/不信
'不信',
'骗人',
'忽悠',
'吹牛',
'太夸张',
'离谱',
'扯淡',
'瞎扯',
// 确认/复查
'你确定吗',
'确定吗',
'真的吗',
'当真',
'再查一下',
'再确认一下',
'再核实',
'重新查',
'核实一下',
'查清楚',
'搞清楚',
// 委婉质疑
'好像不是',
'好像不对',
'我觉得不对',
'恐怕不是',
'感觉不对',
// 质问来源
'谁说的',
'谁告诉你',
'有什么根据',
'有什么依据',
'有证据吗',
'有依据吗',
// 不可能/反问
'怎么可能',
'不可能',
'不会吧',
'不是吧',
'开玩笑',
'别逗了',
'胡说',
'瞎说',
'乱说',
// 纠正句式
'到底是',
'究竟是',
'应该是',
'明明是',
'其实是',
'本来是',
'怎么变成',
'不应该是',
// 产品形态/使用方式
'冲着喝',
'泡着喝',
'直接吞',
'是喝的',
'是吃的',
];
const CANONICAL_KNOWLEDGE_TERMS = [
@@ -896,6 +1007,7 @@ const SCIENCE_TRAINING_ROUTE_KEYWORDS = uniqueKeywords([
const KNOWLEDGE_ROUTE_KEYWORDS = uniqueKeywords([
...KNOWLEDGE_ENTITY_KEYWORDS,
...ROUTE_TOPIC_KEYWORDS,
...FAQ_ROUTE_KEYWORDS,
]);
const TRACKER_KEYWORD_GROUPS = [