refactor(server): optimize KB retrieval and voice context

This commit is contained in:
User
2026-03-31 09:46:40 +08:00
parent 56940676f6
commit 5b824cd16a
15 changed files with 3135 additions and 143 deletions

View File

@@ -1,8 +1,10 @@
/**
* 零 LLM 极速 ASR 修正器
* 纯字典映射 + 正则,< 5ms
* 纯字典映射 + 正则 + 拼音模糊匹配< 5ms
*/
const { pinyinMatchProducts } = require('./pinyinProductMatcher');
const PHRASE_MAP = {
'一城系统': '一成系统',
'逸城系统': '一成系统',
@@ -99,6 +101,45 @@ const PRODUCT_ALIAS_MAP = {
'德国PM营养素': 'PM细胞营养素',
};
// ============ 谐音纠错:产品名同音字变体正则 ============
// ASR 常把产品名个别字识别为同音/近音字,用正则匹配常见变体并纠正
// 4字产品优先匹配避免3字子串误匹配
const PHONETIC_CORRECTIONS = [
// --- 5字产品 ---
[/[细希西系息][胞苞包宝][抗康][氧养仰样][素速]/, '细胞抗氧素'],
// --- 4字产品 ---
[/[胶交教焦角][原圆远元源][蛋旦但淡][白百柏拍]/, '胶原蛋白'],
[/[白百柏][藜梨黎离莉丽力利理礼里][芦炉路鹿鲁卢露陆][醇纯唇]/, '白藜芦醇'],
[/[好号浩耗][转赚砖专][反返犯翻范][应映影英]/, '好转反应'],
[/[阿啊][育玉域遇雨宇御][吠废费肺飞非][陀驼拖脱托]/, '阿育吠陀'],
[/[骨谷古鼓][骼格隔革各阁][健剑键建][康慷抗]/, '骨骼健康'],
// --- 3字产品 ---
[/[活火获霍货][力利立厉励历丽][健剑键建见件]/, '活力健'],
[/[倍被背贝备辈杯北][力利立厉励历丽][健剑键建见件]/, '倍力健'],
[/[氨安暗按胺][基机鸡积极几计][酸算]/, '氨基酸'],
[/[益意易亿以][生声胜升省圣][菌军均君]/, '益生菌'],
[/[辅付副附府腐][酵教叫觉较角][素速诉]/, '辅酵素'],
[/[葡铺浦蒲][萄逃淘桃陶][籽子紫]/, '葡萄籽'],
[/[排牌拍派][毒独度读督][饮引印隐]/, '排毒饮'],
[/[乳如入][酪烙络落][煲包保宝]/, '乳酪煲'],
[/[草操曹][本苯奔][茶查差]/, '草本茶'],
[/[异意易][黄皇荒慌][酮铜同桐]/, '异黄酮'],
[/[骨谷古鼓][骼格隔革各阁][健剑键建见]/, '骨骼健'],
[/[舒书叔输][采彩菜蔡][健剑键建见]/, '舒采健'],
[/[衡横恒亨][醇纯唇春][饮引印隐]/, '衡醇饮'],
[/[纤先鲜仙][萃翠脆粹催]/, '纤萃'],
];
function phoneticCorrectProducts(text) {
let result = text;
for (const [regex, product] of PHONETIC_CORRECTIONS) {
if (regex.test(result)) {
result = result.replace(regex, product);
}
}
return result;
}
function escapeRegExp(text) {
return String(text || '').replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}
@@ -132,6 +173,12 @@ function correctAsrText(text) {
result = replaceOrderedMappings(result, PHRASE_MAP);
result = replaceOrderedMappings(result, WORD_MAP);
// 谐音纠错:同音字变体 → 正确产品名(在字典替换之后、别名扩展之前)
result = phoneticCorrectProducts(result);
// 拼音模糊匹配:系统化方案,自动覆盖所有产品名的同音字变体
result = pinyinMatchProducts(result);
// 激进策略:所有"X+系统"格式(非常见系统词)一律转为"一成系统"
result = result.replace(/[一二三四五六七八九十壹贰叁肆伍陆柒捌玖拾百千万亿兆零两几单双半多少全数整这那某每各以已亦艺毅怡逸溢义忆益伊依乙翼奕弈邑佚颐译蚁屹役疫裔翊熠旖漪倚绮峄羿轶壹弋驿奕懿肄翌苡圯佾诒铱仡易]{1,2}(?:成|城|程|诚|乘|承|丞|呈|澄|橙|层|陈|趁|撑|称|秤|盛|剩|胜|生|声)系统/g, '一成系统');
@@ -146,7 +193,9 @@ function correctAsrText(text) {
module.exports = {
correctAsrText,
phoneticCorrectProducts,
PHRASE_MAP,
WORD_MAP,
PRODUCT_ALIAS_MAP,
PHONETIC_CORRECTIONS,
};