bookworm-smart-assistant/scripts/patches/patch-route-precision-10x-batch-b1.js

80 lines
2.6 KiB
JavaScript
Raw Permalink Normal View History

#!/usr/bin/env node
/**
* patch-route-precision-10x-batch-b1.js
* 路由精度10项改进 Batch B1: route-engine.js
* Item 1: 冷启动置信度上限 coldStartApplied=true gap_1_2 < 0.15 confidence 上限 0.65
*
* 安全性: .bak 备份 + sentinel 注释检查 + UTF-8 BOM 写入
*/
'use strict';
const fs = require('fs');
const path = require('path');
const SENTINEL = '// COLD_START_CONFIDENCE_CAP_v1_APPLIED';
const TARGET = path.join(__dirname, '..', 'route-engine.js');
const BAK = TARGET + '.bak';
if (!fs.existsSync(TARGET)) {
console.error('[ERROR] route-engine.js not found:', TARGET);
process.exit(1);
}
const src = fs.readFileSync(TARGET, 'utf8');
if (src.includes(SENTINEL)) {
console.log('[SKIP] Patch already applied (sentinel found).');
process.exit(0);
}
// 找到短查询置信度上限 patch 注释后面的正确插入点
// 我们需要在 _finalConfidence 计算结束后短查询cap之后插入冷启动cap
// 目标: 在 "CONFIDENCE_CAP_SHORT_QUERY_PATCH_2026_04_20" 块之后、
// "ALIAS_RESOLVER_INJECTED" 注释之前插入
const INSERT_AFTER = ` // === ALIAS_RESOLVER_INJECTED_PHASE2_2026_04_25 ===`;
if (!src.includes(INSERT_AFTER)) {
console.error('[ERROR] Anchor "ALIAS_RESOLVER_INJECTED_PHASE2_2026_04_25" not found. Cannot patch safely.');
process.exit(1);
}
const CAP_CODE = `
${SENTINEL}
// 冷启动置信度上限: coldStartApplied=true 且 rank1/rank2 分差 < 0.15 → cap 0.65
// 防止冷启动 boost 后 gap 较小时系统过度自信
if (coldStartApplied && normalized.length >= 2) {
const _n0 = normalized[0] ? (normalized[0].confidence || 0) : 0;
const _n1 = normalized[1] ? (normalized[1].confidence || 0) : 0;
const gap_1_2 = _n0 - _n1;
if (gap_1_2 < 0.15 && _finalConfidence > 0.65) {
_finalConfidence = 0.65;
try {
const _capLog = JSON.stringify({
t: Date.now(), event: 'cold_start_confidence_cap',
gap: Math.round(gap_1_2 * 1000) / 1000,
original: confidence, capped: 0.65,
primary: normalized[0] && normalized[0].name,
}) + '\\n';
fs.appendFileSync(path.join(DEBUG_DIR, 'confidence-cap.log'), _capLog);
} catch {}
}
}
`;
fs.writeFileSync(BAK, src, 'utf8');
console.log('[BAK] Backed up to', BAK);
const patched = src.replace(INSERT_AFTER, CAP_CODE + INSERT_AFTER);
if (patched === src) {
console.error('[ERROR] String replacement produced no change. Aborting.');
process.exit(1);
}
fs.writeFileSync(TARGET, patched, 'utf8');
console.log('[DONE] Item 1: cold-start confidence cap injected into route-engine.js');
console.log(' Sentinel:', SENTINEL);