fix constraint coverage metric to count facts instead of rendered lines

This commit is contained in:
2026-02-15 19:07:11 +08:00
parent ab8f2c9f40
commit 22d3002786

View File

@@ -880,6 +880,13 @@ async function buildVectorPrompt(store, recallResult, causalById, focusCharacter
const constraintBudget = { used: 0, max: Math.min(CONSTRAINT_MAX, total.max - total.used) }; const constraintBudget = { used: 0, max: Math.min(CONSTRAINT_MAX, total.max - total.used) };
const groupedSelectedConstraints = selectConstraintsByBudgetDesc(groupedConstraints, constraintBudget); const groupedSelectedConstraints = selectConstraintsByBudgetDesc(groupedConstraints, constraintBudget);
const injectedConstraintFacts = (() => {
let count = groupedSelectedConstraints.world.length;
for (const facts of groupedSelectedConstraints.people.values()) {
count += facts.length;
}
return count;
})();
const constraintLines = formatConstraintsStructured(groupedSelectedConstraints, 'asc'); const constraintLines = formatConstraintsStructured(groupedSelectedConstraints, 'asc');
if (constraintLines.length) { if (constraintLines.length) {
@@ -891,7 +898,7 @@ async function buildVectorPrompt(store, recallResult, causalById, focusCharacter
injectionStats.constraint.filtered = allFacts.length - filteredConstraints.length; injectionStats.constraint.filtered = allFacts.length - filteredConstraints.length;
if (metrics) { if (metrics) {
metrics.constraint.injected = assembled.constraints.lines.length; metrics.constraint.injected = injectedConstraintFacts;
metrics.constraint.tokens = constraintBudget.used; metrics.constraint.tokens = constraintBudget.used;
metrics.constraint.samples = assembled.constraints.lines.slice(0, 3).map(line => metrics.constraint.samples = assembled.constraints.lines.slice(0, 3).map(line =>
line.length > 60 ? line.slice(0, 60) + '...' : line line.length > 60 ? line.slice(0, 60) + '...' : line
@@ -1243,9 +1250,9 @@ async function buildVectorPrompt(store, recallResult, causalById, focusCharacter
); );
metrics.timing.evidenceAssembly = metrics.evidence.assemblyTime; metrics.timing.evidenceAssembly = metrics.evidence.assemblyTime;
const totalFacts = allFacts.length; const relevantFacts = Math.max(0, allFacts.length - (metrics.constraint.filtered || 0));
metrics.quality.constraintCoverage = totalFacts > 0 metrics.quality.constraintCoverage = relevantFacts > 0
? Math.round(assembled.constraints.lines.length / totalFacts * 100) ? Math.round((metrics.constraint.injected || 0) / relevantFacts * 100)
: 100; : 100;
metrics.quality.eventPrecisionProxy = metrics.event?.similarityDistribution?.mean || 0; metrics.quality.eventPrecisionProxy = metrics.event?.similarityDistribution?.mean || 0;