From 2456c5e8188a82a39558ec3192add9227ad38aa0 Mon Sep 17 00:00:00 2001 From: rqi14 Date: Sun, 10 May 2026 21:34:01 +0800 Subject: [PATCH] =?UTF-8?q?feat(boss):=20rubric=20=E8=AF=84=E5=88=86?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20=E2=80=94=20passThreshold=20=E4=BC=98?= =?UTF-8?q?=E5=85=88=E8=AF=BB=20rubric=20=E5=AF=B9=E8=B1=A1=EF=BC=8C?= =?UTF-8?q?=E6=B3=A8=E5=85=A5=20=5Fscoring=5Fnote=20=E5=88=B0=20prompt=20(?= =?UTF-8?q?#4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - chat-page-processor: passThreshold 从 rubric.passThreshold 读取,不再硬编码 75 - llm-rubric: _scoring_note 存在时追加到 system prompt,确保两步评分法和例外规则对 LLM 可见 Co-authored-by: Claude Sonnet 4.6 (1M context) --- packages/boss-auto-browse-and-chat/chat-page-processor.mjs | 3 ++- packages/boss-auto-browse-and-chat/llm-rubric.mjs | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/boss-auto-browse-and-chat/chat-page-processor.mjs b/packages/boss-auto-browse-and-chat/chat-page-processor.mjs index 3cf5963..83e6c51 100644 --- a/packages/boss-auto-browse-and-chat/chat-page-processor.mjs +++ b/packages/boss-auto-browse-and-chat/chat-page-processor.mjs @@ -705,7 +705,8 @@ export default async function startBossChatPageProcess (hooksFromCaller, options result = await evaluateResumeByRubric(resumeText, { knockouts: llmConfig.rubric?.knockouts, dimensions: llmConfig.rubric?.dimensions, - passThreshold: llmConfig.passThreshold ?? 75 + passThreshold: llmConfig.rubric?.passThreshold ?? llmConfig.passThreshold ?? 75, + _scoring_note: llmConfig.rubric?._scoring_note }) pass = result.isPassed filterReason = result.reason || '' diff --git a/packages/boss-auto-browse-and-chat/llm-rubric.mjs b/packages/boss-auto-browse-and-chat/llm-rubric.mjs index 8227d3a..15fa438 100644 --- a/packages/boss-auto-browse-and-chat/llm-rubric.mjs +++ b/packages/boss-auto-browse-and-chat/llm-rubric.mjs @@ -87,7 +87,7 @@ export function getEnabledLlmClient (purpose = 'resume_screening', preferModelId /** * 根据 Rubric 评估简历。 * @param {string} resumeText - 简历全文 - * @param {{ knockouts?: string[], dimensions?: Array<{ name: string, weight: number, criteria: Record }>, passThreshold?: number }} rubricConfig + * @param {{ knockouts?: string[], dimensions?: Array<{ name: string, weight: number, criteria: Record }>, passThreshold?: number, _scoring_note?: string }} rubricConfig * @param {{ modelId?: string | null }} [options] * @returns {Promise<{ isPassed: boolean, totalScore: number, reason: string }>} 失败时默认通过 */ @@ -100,6 +100,7 @@ export async function evaluateResumeByRubric (resumeText, rubricConfig, options const knockouts = Array.isArray(rubricConfig?.knockouts) ? rubricConfig.knockouts : [] const dimensions = Array.isArray(rubricConfig?.dimensions) ? rubricConfig.dimensions : [] const passThreshold = typeof rubricConfig?.passThreshold === 'number' ? rubricConfig.passThreshold : 75 + const scoringNote = typeof rubricConfig?._scoring_note === 'string' ? rubricConfig._scoring_note : null if (dimensions.length === 0) { return { isPassed: true, totalScore: 100, reason: '无评分维度,默认通过' } @@ -132,6 +133,10 @@ ${dimensionsDesc} "reasoning": "简要判断理由" }` + if (scoringNote) { + systemContent += `\n\n【评分说明】\n${scoringNote}` + } + try { logInfo(LOG, 'evaluateResumeByRubric start', { model: client.model,