feat(ssa): Complete QPER architecture - Query, Planner, Execute, Reflection layers

Implement the full QPER intelligent analysis pipeline:

- Phase E+: Block-based standardization for all 7 R tools, DynamicReport renderer, Word export enhancement

- Phase Q: LLM intent parsing with dynamic Zod validation against real column names, ClarificationCard component, DataProfile is_id_like tagging

- Phase P: ConfigLoader with Zod schema validation and hot-reload API, DecisionTableService (4-dimension matching), FlowTemplateService with EPV protection, PlannedTrace audit output

- Phase R: ReflectionService with statistical slot injection, sensitivity analysis conflict rules, ConclusionReport with section reveal animation, conclusion caching API, graceful R error classification

End-to-end test: 40/40 passed across two complete analysis scenarios.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-02-21 18:15:53 +08:00
parent 428a22adf2
commit 371e1c069c
73 changed files with 9242 additions and 706 deletions

View File

@@ -0,0 +1,95 @@
# **SSA-Pro Prompt 体系与专家配置边界梳理**
**文档版本:** v1.0
**创建日期:** 2026-02-20
**核心目的:** 划定 AI 工程师(写 Prompt与统计专家写配置的工作边界明确系统各环节的控制权归属。
## **1\. 核心理念:骨架与血肉的分离**
在 SSA-Pro 中,我们绝对不能让统计专家直接去维护一长串包含 \<thinking\>、{ "type": "json" } 等晦涩指令的原始 Prompt。这会让专家崩溃也会导致 JSON 输出格式极易被改坏。
最佳实践是 **动态 Prompt 注入 (Dynamic Prompt Injection)**
* **AI 工程师Prompt 工程师)**:负责维护 **Prompt 模板(骨架)**,控制 AI 的角色、思考链和严格的 JSON 输出结构。
* **统计专家(业务专家)**:在配置中台中维护 **统计学规则(血肉)**
* **运行时**Node.js 后端将专家的配置提取出来,像填空题一样塞进 Prompt 模板中发送给 LLM。
## **2\. 全链路 Prompt 梳理 (何处需要 Prompt?)**
SSA-Pro 全流程共有 **3 个核心环节** 需要大模型介入,因此对应 **3 个核心 Prompt**
### **环节一:意图重写器 (Query Rewriter Prompt)**
* **作用**将医生口语“看两个药的效果差异”翻译成统计学黑话“差异性分析T检验”用于向量库高精度检索。
* **Prompt 骨架 (AI 工程师)**:规定必须输出 3-5 个同义词的 JSON 数组。
* **专家配置注入 (配置中台)**:专家在后台配置 **“同义词/黑话字典”**。
* **举例**System Prompt \= "你是一个检索翻译官。请参考以下专家提供的字典:{{Expert\_Dictionary}},将用户输入翻译为标准术语。"
### **环节二:智能规划师 (SSA-Planner Prompt) ⭐ 最核心**
* **作用**根据用户数据列名Schema从检索到的 Top-5 工具中挑出 1 个,并生成参数映射计划 (SAP)。
* **Prompt 骨架 (AI 工程师)**
* 设定角色:“你是一位顶尖的生物统计学家。”
* 强制要求:“你必须输出包含 tool\_code, reasoning, params 的 JSON并先在 \<thought\> 标签中思考。”
* **专家配置注入 (配置中台)**
* 注入检索到的工具定义:{{Tool\_Name}}, {{Usage\_Context\_Rules}}, {{Data\_Type\_Requirements}}。
* **专家真正写的是**“T检验要求因变量为连续数值自变量为二分类。”这句话会被原封不动塞进 Prompt 里,指导 AI 决策。
### **环节三:结果解读审查员 (SSA-Critic Prompt)**
* **作用**:将 R 跑出来的冰冷 JSON 结果(如 p\_value: 0.04),写成可以放在论文里的标准段落。
* **Prompt 骨架 (AI 工程师)**:规定输出 Markdown 格式规定必须包含“结论”、“统计量”、“P值”三个小节。
* **专家配置注入 (配置中台)**
* 注入 **“解释规范与禁用词”**(例如:专家在后台配置“严禁使用‘证明了’一词,必须用‘具有统计学意义’”)。
* 注入 R 执行的真实结果 {{R\_Output\_JSON}}。
## **3\. 统计配置中台:到底要配置什么? (Config Center Inventory)**
理清了 Prompt我们再来看 **配置中台 (Admin)** 里,统计专家到底要填哪些东西。
配置中台不仅服务于 LLM (Prompt),还服务于底层的 R 引擎 (Executor)。
### **📊 专家需要配置的 5 大核心模块:**
#### **A. 语义与决策配置 (供 Planner Prompt 消费)**
1. **工具名称与描述**:例如 独立样本 T 检验,用于比较两组独立样本的均值差异。(用于 RAG 检索)
2. **决策要素表 (Decision Table)**
* 专家勾选X变量=分类Y变量=连续数值。
* *(后端会自动把这些勾选项翻译成自然语言,塞进 Planner Prompt 中当作判别规则)*。
#### **B. 话术与规范配置 (供 Critic Prompt 消费)**
3. **解释模板与禁忌语**
* 专家填写:当 P \< 0.05 时,话术模板为:{X} 对 {Y} 存在显著影响 (P={P\_value})。
#### **C. 严谨性配置 (直接供 R Executor 消费,与 Prompt 无关!)**
4. **统计护栏规则 (Guardrails)**
* 专家配置:必须执行 Shapiro-Wilk 检验,阈值 P \< 0.05 时,触发 Switch\_To\_Wilcoxon 动作。
* **⚠️ 注意**:这些护栏规则 **绝对不要** 放到 Prompt 里让大模型去判断。这些规则是直接存为 JSON发给 R Docker由 R 代码强逻辑执行的。
#### **D. 资产生成配置 (直接供 R Executor 消费)**
5. **R 代码片段模板 (Glue Template)**
* 专家在后台贴入一段带 {{group\_var}} 占位符的 R 代码。这是用户最后下载的白盒代码。
## **4\. 总结:两者的黄金边界**
为了方便团队理解,请记住这个表格:
| 资产类型 | 谁来写? | 存在哪里? | 最终被谁执行/阅读? |
| :---- | :---- | :---- | :---- |
| **System Prompt 模板 (骨架)** | AI 工程师 / 后端 | 数据库 prompt\_templates 表 | 传给大模型 (DeepSeek) |
| **工具适用条件/数据类型要求** | 统计专家 | 配置中台 (Excel/Web) | 被塞进 Prompt传给大模型 |
| **统计护栏 (如正态性 P\<0.05 降级)** | 统计专家 | 配置中台 (Excel/Web) | 传给 R 服务,**由 R 代码强执行** |
| **可复现的 R 代码模板** | 统计专家 | 配置中台 (Excel/Web) | 传给 R 服务,拼接后提供给用户下载 |
| **论文结论解释规范** | 统计专家 | 配置中台 (Excel/Web) | 被塞进 Critic Prompt传给大模型 |
### **💡 最终建议**
**配置中台(哪怕 MVP 阶段只是一个 Excel 表),是承载统计专家智慧的唯一载体。** 专家只需要在这个 Excel 里用人话填表。
后端代码会负责把这个 Excel 解析拆分:一部分用来拼装 Prompt 让 AI 变聪明,另一部分以 JSON 形式发给 R 引擎让计算变严谨。