92 lines
3.3 KiB
JavaScript
92 lines
3.3 KiB
JavaScript
|
|
const path = require('path');
|
||
|
|
const { performance } = require('perf_hooks');
|
||
|
|
|
||
|
|
require('dotenv').config({ path: path.join(__dirname, '../.env') });
|
||
|
|
|
||
|
|
const ToolExecutor = require('../services/toolExecutor');
|
||
|
|
|
||
|
|
const coldTestQueryTemplates = [
|
||
|
|
{ name: 'Product - Q10 Unique', template: 'Q10辅酵素氧修护有什么独特功效 ' },
|
||
|
|
{ name: 'Product - IB5 Unique', template: 'IB5口腔免疫喷雾如何正确使用 ' },
|
||
|
|
{ name: 'Product - CC胶囊 Unique', template: 'CC胶囊的主要适用人群有哪些 ' },
|
||
|
|
{ name: 'Company - 邓白氏 Unique', template: '德国PM邓白氏认证的具体含义是什么 ' },
|
||
|
|
{ name: 'Technology - 火炉原理 Unique', template: '请详细阐述一下火炉原理的核心思想 ' }
|
||
|
|
];
|
||
|
|
|
||
|
|
async function runColdStartTest() {
|
||
|
|
console.log('='.repeat(80));
|
||
|
|
console.log('VIKING COLD START PERFORMANCE TEST');
|
||
|
|
console.log('(No Cache - Real API Calls)');
|
||
|
|
console.log('='.repeat(80));
|
||
|
|
console.log('');
|
||
|
|
|
||
|
|
const allResults = [];
|
||
|
|
|
||
|
|
for (const { name, template } of coldTestQueryTemplates) {
|
||
|
|
console.log(`Testing (Cold): ${name}`);
|
||
|
|
const latencies = [];
|
||
|
|
const hits = [];
|
||
|
|
|
||
|
|
for (let i = 0; i < 3; i++) {
|
||
|
|
const uniqueQuery = template + Math.random();
|
||
|
|
const start = performance.now();
|
||
|
|
let result;
|
||
|
|
try {
|
||
|
|
result = await ToolExecutor.searchKnowledge({ query: uniqueQuery, response_mode: 'answer' }, []);
|
||
|
|
const latency = performance.now() - start;
|
||
|
|
latencies.push(latency);
|
||
|
|
hits.push(!!result.hit);
|
||
|
|
console.log(` Attempt ${i + 1}: ${latency.toFixed(2)}ms, hit=${result.hit}, source=${result.source}`);
|
||
|
|
} catch (e) {
|
||
|
|
console.log(` Attempt ${i + 1} error: ${e.message}`);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (latencies.length > 0) {
|
||
|
|
const avgLatency = latencies.reduce((a, b) => a + b, 0) / latencies.length;
|
||
|
|
const minLatency = Math.min(...latencies);
|
||
|
|
const maxLatency = Math.max(...latencies);
|
||
|
|
const hitRate = hits.filter(h => h).length / hits.length;
|
||
|
|
|
||
|
|
allResults.push({
|
||
|
|
name,
|
||
|
|
template,
|
||
|
|
avgLatency,
|
||
|
|
minLatency,
|
||
|
|
maxLatency,
|
||
|
|
hitRate,
|
||
|
|
latencies
|
||
|
|
});
|
||
|
|
|
||
|
|
console.log(` → Avg: ${avgLatency.toFixed(2)}ms, Min: ${minLatency.toFixed(2)}ms, Max: ${maxLatency.toFixed(2)}ms, Hit Rate: ${(hitRate * 100).toFixed(1)}%\n`);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
console.log('='.repeat(80));
|
||
|
|
console.log('COLD START SUMMARY');
|
||
|
|
console.log('='.repeat(80));
|
||
|
|
|
||
|
|
if (allResults.length > 0) {
|
||
|
|
const totalAvg = allResults.reduce((a, b) => a + b.avgLatency, 0) / allResults.length;
|
||
|
|
const totalMin = Math.min(...allResults.flatMap(r => r.latencies));
|
||
|
|
const totalMax = Math.max(...allResults.flatMap(r => r.latencies));
|
||
|
|
const totalHitRate = allResults.reduce((a, b) => a + b.hitRate, 0) / allResults.length;
|
||
|
|
|
||
|
|
console.log(`\nOverall Average Latency: ${totalAvg.toFixed(2)}ms`);
|
||
|
|
console.log(`Overall Min Latency: ${totalMin.toFixed(2)}ms`);
|
||
|
|
console.log(`Overall Max Latency: ${totalMax.toFixed(2)}ms`);
|
||
|
|
console.log(`Overall Hit Rate: ${(totalHitRate * 100).toFixed(1)}%`);
|
||
|
|
|
||
|
|
console.log('\nFastest queries:');
|
||
|
|
allResults.sort((a, b) => a.avgLatency - b.avgLatency).forEach((r, i) => {
|
||
|
|
console.log(` ${i + 1}. ${r.name}: ${r.avgLatency.toFixed(2)}ms`);
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
console.log('\n' + '='.repeat(80));
|
||
|
|
|
||
|
|
return allResults;
|
||
|
|
}
|
||
|
|
|
||
|
|
runColdStartTest().catch(console.error);
|