61 lines
1.8 KiB
JavaScript
61 lines
1.8 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* P1-B 补丁 — 将 rerankTopK 接入 route-interceptor.js 的 runRouteEngine()
|
|
*
|
|
* 用法: node scripts/patch-interceptor-p1b.js
|
|
* node scripts/patch-interceptor-p1b.js --dry-run
|
|
*/
|
|
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
const dryRun = process.argv.includes('--dry-run');
|
|
const HOOK_FILE = path.join(__dirname, '..', 'hooks', 'route-interceptor.js');
|
|
|
|
if (!fs.existsSync(HOOK_FILE)) {
|
|
console.error('错误: 找不到 route-interceptor.js');
|
|
process.exit(1);
|
|
}
|
|
|
|
let code = fs.readFileSync(HOOK_FILE, 'utf8');
|
|
let patchCount = 0;
|
|
|
|
// === 补丁: 归一化之前插入 reranking ===
|
|
// 匹配兼容 \r\n
|
|
const ANCHOR_RE = /( +\/\/ 归一化\r?\n const normalized = routeAnalyzer\.normalizeScores\(disambiguated\)\.slice\(0, 5\);)/;
|
|
|
|
const REPLACEMENT = ` // v5.8 P1-B: top-k reranking 精排
|
|
let reranked = disambiguated;
|
|
if (routeAnalyzer.rerankTopK) {
|
|
try {
|
|
reranked = routeAnalyzer.rerankTopK(disambiguated, queryTokens, index, 10);
|
|
} catch {}
|
|
}
|
|
|
|
// 归一化
|
|
const normalized = routeAnalyzer.normalizeScores(reranked).slice(0, 5);`;
|
|
|
|
if (ANCHOR_RE.test(code)) {
|
|
code = code.replace(ANCHOR_RE, REPLACEMENT);
|
|
patchCount++;
|
|
console.log('✓ reranking 已插入 runRouteEngine() (归一化之前)');
|
|
} else if (code.includes('P1-B: top-k reranking')) {
|
|
console.log('⊘ 已存在,跳过');
|
|
} else {
|
|
console.error('✗ 找不到锚点 (归一化行)');
|
|
}
|
|
|
|
if (patchCount === 0) {
|
|
console.log('\n无需变更。');
|
|
process.exit(0);
|
|
}
|
|
|
|
if (dryRun) {
|
|
console.log(`\n[dry-run] 将应用 ${patchCount} 个补丁,但未写入。`);
|
|
process.exit(0);
|
|
}
|
|
|
|
fs.writeFileSync(HOOK_FILE, code);
|
|
console.log(`已写入 ${patchCount} 个补丁到 route-interceptor.js`);
|
|
console.log('完成 ✓');
|