5.1 KiB
LLM 友好型质控报告评估与优化方案
评估对象: qc-report-test0102-pd-study-2026-02-08.xml
评估目的: 确定该格式是否适合作为 Context 喂给 LLM 以回答用户提问。
评估日期: 2026-02-08
📊 一、 现状评估 (Current State Analysis)
1. 评分卡
| 维度 | 评分 (1-10) | 评价 |
|---|---|---|
| 结构化程度 | 9/10 | XML 结构清晰,解析容易。 |
| Token 效率 | 3/10 | 极差。重复信息太多(如 rule_name 重复 64 次)。 |
| 信息完整性 | 4/10 | 缺失核心证据。只说了“错”,没说“值为多少”。 |
| 语义清晰度 | 5/10 | rule="unknown" 对 AI 毫无帮助,缺乏语义标签。 |
2. 核心缺陷分析
❌ 缺陷 1:缺乏“原始值” (The "Evidence Gap")
-
现状:
<message>年龄不在 25-35 岁范围内</message>
<field>age</field> -
LLM 的困惑:"我知道年龄不对,但这个病人到底几岁?是 24 岁(轻微偏差)还是 80 岁(严重偏差)?用户如果问我‘为什么报错’,我只能复读 Message,无法解释原因。"
❌ 缺陷 2:Token 冗余 (The "Echo Chamber")
- 现状:
13 条记录都有“年龄”问题,rule_name 和 message 重复了 13 次。 - LLM 的困惑:"为什么要让我读 13 遍同样的一句话?这浪费了宝贵的上下文窗口。"
❌ 缺陷 3:逻辑扁平 (Lack of Hierarchy)
- 现状:
所有问题平铺在 <critical_issues> 下,没有按 Record ID 聚合。 - LLM 的困惑:"如果用户问‘001号病人有哪些问题?’,我得遍历整个列表去挑出 record=1 的项,容易看漏。"
🚀 二、 优化方案:Context Protocol v2.0
根据我们的 CRA Agent 深度设计,我们需要将报告重构为 “以实体为中心,以证据为支撑” 的结构。
2.1 理想的 Context 结构 (Gold Standard)
建议采用 混合模式:XML 定义边界,Markdown 描述详情。
<qc_context project_id="test0102" generated="2026-02-08">
<!-- 1. 宏观统计 (Aggregate) -->
<overview>
- 总记录数: 13 | ❌ 严重违规: 13人 (100%)
- 主要问题: 年龄超标 (13), 未签知情同意书 (13), 疼痛评分不达标 (13)
</overview>
<!-- 2. 规则定义 (Reference) - 只定义一次,省 Token -->
<rule_definitions>
<rule id="R_AGE" tag="#demographics">年龄应在 25-35 岁之间</rule>
<rule id="R_ICF" tag="#ethics">必须签署知情同意书</rule>
</rule_definitions>
<!-- 3. 问题详情 (Grouped by Record) -->
<issues_list>
\<record id="1" status="CRITICAL"\>
\<summary\>存在 5 个严重违规\</summary\>
\<details\>
\- \[R\_AGE\] ❌ \*\*年龄违规\*\*: 当前值 \`45\` (不在 25-35 范围内)。
\- \[R\_ICF\] ❌ \*\*伦理违规\*\*: \`informed\_consent\` 为空。
\- \[R\_VAS\] ❌ \*\*入排不符\*\*: VAS评分 \`2\` (要求 \>= 4)。
\</details\>
\</record\>
\<record id="10" status="CRITICAL"\>
\<summary\>存在 5 个严重违规\</summary\>
\<details\>
\- \[R\_AGE\] ❌ \*\*年龄违规\*\*: 当前值 \`52\`。
\<\!-- 省略重复描述,仅列出差异或关键点 \--\>
\</details\>
\</record\>
</issues_list>
</qc_context>
🛠️ 三、 实施建议 (Action Items)
3.1 后端代码调整 (QcService / ReportGenerator)
你需要修改生成 XML 的逻辑,不仅要查 iit_qc_logs,还要关联 原始数据。
- 补充 value 字段:
在存入 iit_qc_logs 时,或者在生成报告时,必须把触发报错的 具体数值 写进去。- Bad: { "message": "Age error" }
- Good: { "message": "Age error", "evidence": { "value": 45, "threshold": "25-35" } }
- 补充 rule_id 和 tag:
目前的 rule="unknown" 是不可接受的。- 在 HardRuleEngine 里,每条规则必须有一个唯一的 code (例如 AGE_CHECK)。
- 在 iit_skills 配置中,关联 Tags。
- 按受试者聚合 (Group By Record):
不要输出扁平的 List,要输出 Map:Map<RecordId, Issues[]>。
3.2 优化后的 LLM 交互流程
当用户问:“为什么 1 号病人不合格?”
- 旧 XML:LLM 看到 "年龄不在范围内",只能回答“因为年龄不对”。
- 新 XML:LLM 看到 当前值 45 (要求 25-35),可以回答:
“1号病人不合格主要有 3 个原因:- 年龄不符:患者 45岁,超出了研究要求的 25-35 岁范围。
- 疼痛评分不足:VAS 评分为 2分,未达到入组要求的 4分。
- 伦理缺失:系统中未查询到知情同意书签署记录。”
3.3 总结
现有报告是给程序员调试用的,不是给 LLM 用的。
请按照 Context Protocol 规范,增加 Evidence (原始值),增加 Grouping (聚合),并消除冗余文本。