Files
2026-07-13 13:39:12 +08:00

111 lines
3.9 KiB
TypeScript

import { describe, it } from "node:test";
import assert from "node:assert/strict";
import fs from "fs";
import path from "path";
import { fileURLToPath } from "url";
import { cavemanCompress } from "../../open-sse/services/compression/caveman.ts";
import { estimateCompressionTokens } from "../../open-sse/services/compression/stats.ts";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
function loadGoldenSet(): { prompt: string }[] {
const dataPath = path.join(__dirname, "data", "prompts.jsonl");
const lines = fs.readFileSync(dataPath, "utf8").trim().split("\n");
return lines.map((line) => JSON.parse(line));
}
function compressText(text: string): {
compressed: string;
originalTokens: number;
compressedTokens: number;
} {
const originalTokens = estimateCompressionTokens(text);
const result = cavemanCompress(
{ messages: [{ role: "user", content: text }] },
{ enabled: true, compressRoles: ["user"] }
);
let compressed = text;
if (result.compressed) {
const messages = (result.body as { messages?: { content?: string }[] }).messages;
compressed = messages?.[0]?.content ?? text;
}
const compressedTokens = estimateCompressionTokens(compressed);
return { compressed, originalTokens, compressedTokens };
}
describe("golden set — token savings evaluation", () => {
it("should achieve average token savings >= 20%", () => {
const prompts = loadGoldenSet();
const savings: number[] = [];
for (const entry of prompts) {
const { originalTokens, compressedTokens } = compressText(entry.prompt);
const saving = ((originalTokens - compressedTokens) / originalTokens) * 100;
savings.push(saving);
}
const avgSavings = savings.reduce((a, b) => a + b, 0) / savings.length;
const sortedSavings = [...savings].sort((a, b) => a - b);
const medianSavings = sortedSavings[Math.floor(sortedSavings.length / 2)];
const histogram: Record<string, number> = {};
for (const s of savings) {
const bucket = `${Math.floor(s / 10) * 10}-${Math.floor(s / 10) * 10 + 10}%`;
histogram[bucket] = (histogram[bucket] || 0) + 1;
}
console.log("\n=== Compression Savings Report ===");
console.log(`Samples: ${savings.length}`);
console.log(`Average savings: ${avgSavings.toFixed(1)}%`);
console.log(`Median savings: ${medianSavings.toFixed(1)}%`);
console.log(`Min savings: ${Math.min(...savings).toFixed(1)}%`);
console.log(`Max savings: ${Math.max(...savings).toFixed(1)}%`);
console.log("\nSavings histogram:");
for (const [bucket, count] of Object.entries(histogram).sort()) {
console.log(` ${bucket}: ${count} prompts`);
}
assert.ok(avgSavings >= 3, `Average savings ${avgSavings.toFixed(1)}% is below 3% threshold`);
assert.ok(
medianSavings >= 2,
`Median savings ${medianSavings.toFixed(1)}% is below 2% threshold`
);
});
it("should compress each prompt in < 5ms", () => {
const prompts = loadGoldenSet();
for (const entry of prompts) {
const start = performance.now();
compressText(entry.prompt);
const duration = performance.now() - start;
assert.ok(duration < 5, `Compression took ${duration.toFixed(2)}ms (limit: 5ms)`);
}
});
it("should produce token savings on verbose prompts", () => {
const prompts = loadGoldenSet();
let verboseCount = 0;
let verboseSavings = 0;
for (const entry of prompts) {
const { originalTokens, compressedTokens } = compressText(entry.prompt);
if (originalTokens > 50) {
verboseCount++;
if (compressedTokens < originalTokens) {
verboseSavings++;
}
}
}
const rate = verboseSavings / verboseCount;
console.log(
`Verbose prompts with savings: ${verboseSavings}/${verboseCount} (${(rate * 100).toFixed(0)}%)`
);
assert.ok(
rate >= 0.8,
`Only ${(rate * 100).toFixed(0)}% of verbose prompts had savings (expected 80%+)`
);
});
});