# 召回Top知识粒度保真检查
候选 id:`retrieval-topk-grain-guard`
## 诊断流程样例
### 场景
用户给出 242 条价格上下限咨询 case,要求按 `智能会话id` 从风神导出中补回当时召回的 `标注-知识Top1/2/3`。
### 输入
- `cases.xlsx`:242 行,242 个唯一 `智能会话id`,含 `对话原文`
- `fengshen_export.xlsx`:消息级导出,同一 `智能会话id` 可能多行,含 `标注-知识Top1`、`标注-知识Top2`、`标注-知识Top3`
### 检查步骤
1. 读取两张表,打印 case 行数、唯一 session 数、风神导出行数、风神中重复 session 的数量。
2. 对每个 case session,在风神导出中按原始顺序找第一条 Top1/2/3 任一非空记录。
3. 逐字复制这一条记录的 Top1/2/3 单元格,不做 `groupby().agg(join)`。
4. 扫描输出 Top 字段:如果出现 `[1]`、`[2]`、`[3]` 前缀,或同一单元格包含多段拼接文本,直接标记失败。
5. 抽样 10 个 session,把输出 Top 字段与风神原始行做逐字比对。
### 成功信号
- 输出为 242 行、242 个唯一 `智能会话id`
- 列名是 `智能会话id / 对话原文 / 标注-知识Top1 / 标注-知识Top2 / 标注-知识Top3`
- Top 字段与风神原始单元格逐字一致
- 没有旧版 `[1][2][3]` 拼接前缀
### 失败信号
- 输出行数变少或变多
- 一个 Top 字段里拼了多条召回记录
- 原始 JSON 被改写成二次整理文本
- Top 列名或字段含义被重命名导致不可回源
### 建议处理
失败时不要继续做召回质量分析,先回滚到风神原始导出,重新按“每个 session 取第一条 Top 非空原始记录”的规则生成 v2。