/** * RVW 提示词协议固化层(动静分离) * * 设计原则: * - 动态部分(业务标准):来自 PromptService(运营管理端可编辑) * - 静态部分(输出协议):由研发在代码中固化,运营端不可编辑 */ export type RvwPromptChannel = 'editorial' | 'methodology' | 'clinical' | 'data_validation'; const RVW_PROTOCOLS: Record = { editorial: `【系统输出协议(研发固化,不可更改)】 请严格仅输出 JSON(不要 Markdown、不要代码块、不要解释文字),结构如下: { "overall_score": 0, "summary": "总体评价", "items": [ { "criterion": "检查项名称", "status": "pass", "score": 0, "issues": ["问题1"], "suggestions": ["建议1"] } ] } 约束: 1) overall_score、items[].score 必须是 0-100 数字 2) status 只能是 "pass" | "warning" | "fail" 3) issues/suggestions 必须是数组,无内容时返回 [] 4) items 至少包含 1 项`, methodology: `【系统输出协议(研发固化,不可更改)】 请严格仅输出 JSON(不要 Markdown、不要代码块、不要解释文字),结构如下: { "overall_score": 0, "summary": "总体评价", "conclusion": "小修", "checkpoints": [ { "id": 1, "item": "设计类型界定", "status": "major_issue", "finding": "该检查点的发现", "suggestion": "可执行建议" } ], "parts": [ { "part": "科研设计评估", "score": 0, "issues": [ { "type": "问题类型", "severity": "major", "description": "问题描述", "location": "位置(如:方法学第2段)", "suggestion": "可执行修改建议" } ] } ] } 约束: 1) overall_score、parts[].score 必须是 0-100 数字 2) severity 只能是 "major" 或 "minor" 3) 若某 part 无问题,issues 返回 [] 4) conclusion 必须是以下之一:"直接接收" | "小修" | "大修" | "拒稿" 5) 必须包含 "科研设计评估"、"统计学方法描述评估"、"统计分析与结果评估" 三个 part 6) checkpoints 必须严格包含 20 项(id = 1..20 且不重复,不可缺失) 7) checkpoints[].status 只能是 "pass" | "minor_issue" | "major_issue" | "not_mentioned" 8) 若某检查点未发现问题,finding 也要给出简短判断依据,不可空`, clinical: `【系统输出协议(研发固化,不可更改)】 请严格按以下结构输出(可用 Markdown): 1. 总体评价 2. 详细问题清单与建议(按“严重问题”“一般问题”分组) 3. 审稿结论(仅限:直接接收 / 小修 / 大修 / 拒稿) 要求: - 用中文 - 不要输出与上述结构无关的前后缀话术`, data_validation: `【系统输出协议(研发固化,不可更改)】 请逐表输出,每个表必须以“## 表N: <表格标题>”开头(N 从 1 开始连续编号)。 每个表按以下结构输出: 1. 核心发现与问题清单 - 计算错误 - 方法误用 - 逻辑矛盾 - 规范性建议 2. 最终核查结论 - [ ] 通过 - [ ] 条件通过 - [ ] 未通过 注意:除上述结构外,不要输出无关前后缀。`, }; /** * 组装 RVW 最终系统提示词(动静分离) */ export function composeRvwSystemPrompt(channel: RvwPromptChannel, businessPrompt: string): string { const protocol = RVW_PROTOCOLS[channel]; return `${businessPrompt}\n\n${protocol}`; } export function getRvwProtocol(channel: RvwPromptChannel): string { return RVW_PROTOCOLS[channel]; }