diff --git a/modules/story-summary/generate/prompt.js b/modules/story-summary/generate/prompt.js index d3bcb8f..88ee49b 100644 --- a/modules/story-summary/generate/prompt.js +++ b/modules/story-summary/generate/prompt.js @@ -36,6 +36,7 @@ const RECENT_ORPHAN_MAX = 5000; // [待整理] 独立预算 const TOTAL_BUDGET_MAX = 15000; // 总预算(用于日志显示) const L3_MAX = 2000; const ARCS_MAX = 1500; +const TOP_N_STAR = 5; // 相似度前N条加⭐ // ───────────────────────────────────────────────────────────────────────────── // 工具函数 @@ -466,7 +467,9 @@ async function buildVectorPrompt(store, recallResult, causalById, queryEntities const selectedDirect = []; // { event, text, tokens, chunk, hasEvidence } const selectedSimilar = []; // { event, text, tokens, chunk, hasEvidence } - for (const e of candidates) { + for (let candidateRank = 0; candidateRank < candidates.length; candidateRank++) { + const e = candidates[candidateRank]; + if (total.used >= total.max) break; const isDirect = e._recallType === "DIRECT"; @@ -494,9 +497,9 @@ async function buildVectorPrompt(store, recallResult, causalById, queryEntities // 写入 if (isDirect) { - selectedDirect.push({ event: e.event, text, tokens: cost, chunk: chosenChunk, hasEvidence }); + selectedDirect.push({ event: e.event, text, tokens: cost, chunk: chosenChunk, hasEvidence, candidateRank }); } else { - selectedSimilar.push({ event: e.event, text, tokens: cost, chunk: chosenChunk, hasEvidence }); + selectedSimilar.push({ event: e.event, text, tokens: cost, chunk: chosenChunk, hasEvidence, candidateRank }); } injectionStats.events.selected++; @@ -533,8 +536,15 @@ async function buildVectorPrompt(store, recallResult, causalById, queryEntities selectedDirect.sort((a, b) => getEventSortKey(a.event) - getEventSortKey(b.event)); selectedSimilar.sort((a, b) => getEventSortKey(a.event) - getEventSortKey(b.event)); - const selectedDirectTexts = selectedDirect.map((it, i) => renumberEventText(it.text, i + 1)); - const selectedSimilarTexts = selectedSimilar.map((it, i) => renumberEventText(it.text, i + 1)); + const selectedDirectTexts = selectedDirect.map((it, i) => { + const numbered = renumberEventText(it.text, i + 1); + return it.candidateRank < TOP_N_STAR ? `⭐${numbered}` : numbered; + }); + + const selectedSimilarTexts = selectedSimilar.map((it, i) => { + const numbered = renumberEventText(it.text, i + 1); + return it.candidateRank < TOP_N_STAR ? `⭐${numbered}` : numbered; + }); details.directCount = selectedDirect.length; details.similarCount = selectedSimilar.length;