feat(W24): docs/43 场内基金手册入库 + B-02 展示候选集收口

补历史欠账:D3.4 B-02(决 12)与 D4.1 §B-02 早已承诺把 docs/43 纳入 SOURCES,
从未执行;W21 首次把它暴露成实测缺口(702 块里「科创债」0 处)。

语料与切片
- docs/43-场内基金产品手册(知识库入库版).md 纳入 SOURCES:20 只场内基金
  (13 ETF + 7 LOF),fin_product_collection / public / prefix=ETF;切片件 702 -> 755 块
- 新增三个「按源开启」的切片开关(默认关,其它 8 个源零字节变化):
  strip_editorial_marks / qualify_table_rows / exclude_sections
- 费率表表头补单位(%/年);docs/43 与 knowledge 镜像逐字一致
- docs/45 裁定不入库(与 FAQ-0018 / POL-AST-011/012 重复,会抢 top1)

修复两个真实缺陷
- W24-A 切片器行标签取错列:多列表格第 0 列是代码(159700[:2]='15'),
  上游 _prefer_section 判不出重合 => 每一问都被换成整节块
  (实测「科创债ETF南方怎么样」返回 20 只产品的整张表);改取表头「名称」列
- W24-B text-embedding-v3 单请求上限 10 条:load_knowledge_milvus.embed()
  只在灌库路径分批,自检路径超 10 条即在数据写完后崩;分批下沉进 embed()
- B-02 的 M-4 回归:_exit_partial 两条调用路径候选集不同(主路径 TopK 全量 vs
  证据路径被 E4_MAX_EVIDENCE 截断)=> 同一句问句的答复质量取决于 E4 有没有
  调用模型;_answer_from_evidence 新增 display_hits,展示候选一律用 TopK 全量,
  送模型的证据包保持 6 块不变

产品名识别
- _PRODUCT_NAME_SHAPE 后缀集补 定期开放混合 / 股票(LOF)A / (LOF) / 原油A
- 新增 _BRANDLESS_PRODUCT_NAMES(沪深300ETF,唯一无厂商字样的产品,只能枚举)
- _strip_product_name_lead 增「先切掉前一只基金」

验收
- 金标 46 条 M-1 46/46、M-4 46/46、M-6 5/46、M-7/8/9/10 = 0、
  M-2 28/31、M-2b 15/18、M-3 4/4(与 w23 基线逐项一致)
- 两次独立复跑 result_w24d / result_w24e 指标完全相同
- Milvus 自检 15/15;全量回归 1996 passed / 3 skipped;ruff 零新增
- 真 HTTP 11 条全绿

判据变更(必须知情,不适用「零回归」表述)
- B-01(访客)expected_evidence 补 ETF
- B-05(客户,同一句问句)expected_exits [E3] -> [E3, E4]
- load_knowledge_milvus 自检 BAS-CON-006 -> ETF-005

文档
- 客服agent/D2.1 升 v6.39;D2.4 升 v1.8(语料 755 块、手册切片实测 53);
  D2.8 新增 §3.6 与 §11 复测;D2.9 升 v1.3
- 开发文档/D1.1 升 v1.15(新增 §31);D1.6 升 v1.2(新增 §11、§10.4 销账);
  D4.8 升 v1.2(新增 §10)

诚实留痕
- _exit_partial 仍按分数挑块(不接收问句),本轮只统一候选集口径
- E5b 展示层净化仍不覆盖「收益 + 数字%」形态,继续挂账
- 语料里 2 个零容忍地雷块(POL-SPM-016 / POL-SPM-022-01)是禁令条款,故意保留
This commit is contained in:
张胜宇
2026-09-21 12:26:42 +08:00
parent 36d9ba9b9f
commit 94ce44a851
14 changed files with 772 additions and 74 deletions
@@ -2,7 +2,7 @@
> **体系编号**:`D1.1` · 域:一、治理与索引 · 编号体系见 `D1.1` §4.0
> **编号**:CS-DOC-2026-017 | **版本**:v1.14 | **日期**:2026-09-21 | **状态**:**现行(活文档,随文档区变动同步更新)**
> **编号**:CS-DOC-2026-017 | **版本**:v1.15 | **日期**:2026-09-21 | **状态**:**现行(活文档,随文档区变动同步更新)**
> **性质**:本文件是 `开发文档\` 的**唯一入口**。任何人(含三个月后的自己)打开这一份,就应知道:先读什么、哪份为准、每份什么状态。
> **盘点范围**:`开发文档\`(**53 个文件** = 52 份编号文档 + 1 份入口存根 `CLAUDE.md`,无归档子目录)+ `客服agent\`(**9 份**对外交付文档)。
@@ -36,10 +36,10 @@
```
对外交付(客服agent\) 配套完整版 / 前身(开发文档\)
────────────────────────────────── ─────────────────────────────────────
A1 [D2.1] D2.1-客服Agent执行Todolist.md v6.30 ←→ [D3.4] D3.4-客服Agent重构Todolist.md v5.1
A1 [D2.1] D2.1-客服Agent执行Todolist.md v6.39 ←→ [D3.4] D3.4-客服Agent重构Todolist.md v5.1
A2 [D2.2] D2.2-客服Agent需求文档.html v2.7 ←→ [D3.1] D3.1-客服Agent需求开发文档与设计方案.html v2.6
A3 [D2.3] D2.3-客服Agent开发计划.html v1.1 ←→ (无旧版)
A4 [D2.4] D2.4-客服Agent知识库设计方案.html v1.7 ←→ [D3.2] D3.2-知识库设计方案.html v1.6
A4 [D2.4] D2.4-客服Agent知识库设计方案.html v1.8 ←→ [D3.2] D3.2-知识库设计方案.html v1.6
A5 [D3.3] 访客与角色分离的鉴权方案建议(仅此一份,无新旧之别)
```
@@ -59,10 +59,10 @@ A5 [D3.3] 访客与角色分离的鉴权方案建议(仅此一份,无新旧
| # | 体系编号 | 文档 | 版本 | 作用 |
|---|---|---|---|---|
| **A1** | **D2.1** | `客服agent\D2.1-客服Agent执行Todolist.md` | **v6.36** | **唯一开工入口**。**57 项 / 8 批次(A—H)** / 12 步关键路径 / 2 组会签 / **完工判据 13 条**。**新增批次 H · 智能增强**(`H-01`~`H-06`) |
| **A1** | **D2.1** | `客服agent\D2.1-客服Agent执行Todolist.md` | **v6.39** | **唯一开工入口**。**57 项 / 8 批次(A—H)** / 12 步关键路径 / 2 组会签 / **完工判据 13 条**。**新增批次 H · 智能增强**(`H-01`~`H-06`) |
| **A2** | **D2.2** | `客服agent\D2.2-客服Agent需求文档.html` | **v2.7** | 对外需求:**FR-CS-001~052**(52 条,新增域 H)+ NFR-CS-001~021 全量、身份与鉴权模型、验收标准(**新增 AC-13 金标门禁**) |
| **A3** | **D2.3** | `客服agent\D2.3-客服Agent开发计划.html` | **v1.1** | 前置条件、测试环境就位(G-00)、会签流程、门禁、交付物、**批次 H(§3.4b)** |
| **A4** | **D2.4** | `客服agent\D2.4-客服Agent知识库设计方案.html` | **v1.7** | 三集合 / 三档可见性 / **集合内分区隔离(§7.2.1)** / 8 模块 / 7 步入库 8 步检索 / 8 项决策 / **附录F 五出口对接** |
| **A4** | **D2.4** | `客服agent\D2.4-客服Agent知识库设计方案.html` | **v1.8** | 三集合 / 三档可见性 / **集合内分区隔离(§7.2.1)** / 8 模块 / 7 步入库 8 步检索 / 8 项决策 / **附录F 五出口对接** |
| **A5** | **D3.3** | `开发文档\D3.3-访客与角色分离的鉴权方案建议-2026-09-16.md` | CS-AUTH-2026-011 | 鉴权专项:四方案对比、三条不变量、甲乙时序 |
---
@@ -123,10 +123,10 @@ A5 [D3.3] 访客与角色分离的鉴权方案建议(仅此一份,无新旧
| **D1.4** | `开发文档\D1.4-知识源与品牌整改变更说明-2026-09-17.md` | CS-CONTENT-2026-016 | 现行 | 逐份变更说明(§3.1—§3.9 改写映射 + G-01~G-09) |
| **D1.5** | `开发文档\D1.5-开发前决策清单与阻塞项-2026-09-17.md` | CS-DOC-2026-018 v1.0 | 现行 | 🔴 **开工前唯一决策登记册**:28 项待你拍板 + 阻塞分级(P0 12 / P1 10 / P2 6)+ 需你提供的 7 项输入;§7 为回填表(增补项见 `D1.6` §4.3) |
| **D1.6** | `开发文档\D1.6-对话上下文提取与开工前补充决策-2026-09-17.md` | CS-DOC-2026-019 v1.0 | 现行 | 🔴 **本轮会话上下文提取件**:已读清单与权威链校正 / 可复用事实(含实测)/ 旧实现 **7 条转人工通路** / 文档缺陷 `Q-1.1`~`Q-1.6` / 前提风险 `K-01`~`K-08` / 待拍板 `N-01`~`N-09` |
| **D2.1** | `客服agent\D2.1-客服Agent执行Todolist.md` | **v6.36** | 现行 | 🔴 **唯一开工入口**:**57 项 / 8 批次** / 12 步关键路径 / **批次 H 智能增强** |
| **D2.1** | `客服agent\D2.1-客服Agent执行Todolist.md` | **v6.39** | 现行 | 🔴 **唯一开工入口**:**57 项 / 8 批次** / 12 步关键路径 / **批次 H 智能增强** |
| **D2.2** | `客服agent\D2.2-客服Agent需求文档.html` | **v2.7** | 现行 | 🔴 对外需求:**FR-CS-001~052** + NFR-CS-001~021 |
| **D2.3** | `客服agent\D2.3-客服Agent开发计划.html` | **v1.1** | 现行 | 🔴 前置条件 / 批次 / 会签 / 门禁 / 交付物 |
| **D2.4** | `客服agent\D2.4-客服Agent知识库设计方案.html` | **v1.7** | 现行 | 🔴 三集合 / 三档可见性 / **分区隔离** / 7 步入库 8 步检索 / **附录F** |
| **D2.4** | `客服agent\D2.4-客服Agent知识库设计方案.html` | **v1.8** | 现行 | 🔴 三集合 / 三档可见性 / **分区隔离** / 7 步入库 8 步检索 / **附录F** |
| **D2.5** | `客服agent\D2.5-客服Agent演示脚本与账号速查-2026-09-19.md` | `F-03`+`F-04`+`A-05` | 现行 | 🔴 **演示当天照着念**:五项自检 / 账号速查(实测可登录)/ 游客线 5 条 + 客服线 6 组台词(带**实测答复**)/ 排障表 / 对「不智能」的正面回答 |
| **D2.6** | `客服agent\D2.6-客服Agent答辩报告-2026-09-19.md` | 2026-09-19 | 现行 | 🔴 **答辩主文档**:批评 → 根因(2 个出口 / 10 处失败方向全指向转人工)→ 五出口 `E1`—`E5` → `INV-1`~`INV-5` → 金标 11 项**修复前 → 修复后**对比 → 零容忍词挂载点口径 → 坑与教训 → 诚实未做项 → 现场速答 |
| **D2.7** | `客服agent\D2.7-客服Agent中长期记忆与画像联动设计-2026-09-20.md` | 2026-09-20 | 现行 | 🔴 **记忆与画像专项**:三问直答 / 客服侧五道闸门取证 / 字段分域(`investor_type` 红线)/ **主设计主张:记忆改「行为」不改「输入」** / `INV-M1`~`INV-M6` / 两处过期理由更正 / 分期 P0—P2 / 待决 4 项 |
@@ -186,15 +186,15 @@ A5 [D3.3] 访客与角色分离的鉴权方案建议(仅此一份,无新旧
| 文件名 | 版本 | 日期 | 定位 | 关联 |
|---|---|---|---|---|
| `D2.1-客服Agent执行Todolist.md` | **v6.37** | 2026-09-21 | 唯一开工入口 | 收敛自 `开发文档\D3.4-客服Agent重构Todolist.md` v5.1 |
| `D2.1-客服Agent执行Todolist.md` | **v6.39** | 2026-09-21 | 唯一开工入口 | 收敛自 `开发文档\D3.4-客服Agent重构Todolist.md` v5.1 |
| `D2.2-客服Agent需求文档.html` | **v2.7** | 2026-09-20 | 对外需求(FR **52** / NFR 21) | 完整版见 §4.2 |
| `D2.3-客服Agent开发计划.html` | **v1.1** | 2026-09-17 | 批次 / 会签 / 门禁 | 与 A1 批次号一一对应 |
| `D2.4-客服Agent知识库设计方案.html` | **v1.7** | 2026-09-20 | 三集合 / 三档 / 入库检索流程;**索引统一 `AUTOINDEX`、语料 702 块** | 完整版见 §4.2 |
| `D2.4-客服Agent知识库设计方案.html` | **v1.8** | 2026-09-21 | 三集合 / 三档 / 入库检索流程;**索引统一 `AUTOINDEX`、语料 755 块** | 完整版见 §4.2 |
| `D2.5-客服Agent演示脚本与账号速查-2026-09-19.md` | — | 2026-09-19 | 演示脚本(`F-03`/`F-04`/`A-05` 三合一) | 台词证据:`group_fqcd_jr\docs\evidence\20260919-t8-demo-lines*.json` |
| `D2.6-客服Agent答辩报告-2026-09-19.md` | — | 2026-09-19 | 答辩报告(问题定义 / 根因 / 五出口 / 安全不变量 / 前后对比 / 现场速答) | 数字来源:46 条金标 `score_before` vs `score_w11b` + `e2e_smoke_test` + `http_probe` + 12 条真机边界 |
| `D2.7-客服Agent中长期记忆与画像联动设计-2026-09-20.md` | — | 2026-09-20 | 中长期记忆与画像联动(读码取证 / `INV-M1`~`INV-M6` / 分期 P0—P2) | 上游依据:`开发文档\D7.3` §1.3 与 §6.2;口径:`D2.2` §1.7 第 12 / 18 / 21 项 |
| `D2.8-客服Agent知识库RAG全链路与选型说明-2026-09-20.md` | — | 2026-09-20 | RAG 全链路(按流程逐步:解析 / 切片 / 向量化 / 入库 / 检索 / 增强 / 判定) | 上游:`D2.4` §6 / §7、`D3.2`、`D3.5`;实测:`knowledge\_chunks.jsonl` 675 块 + Milvus 四集合直查 |
| `D2.9-客服Agent手动对话测试用例-2026-09-20.md` | — | 2026-09-20 | 手动对话测试用例(46 条金标逐条可问 + 11 条边界 + 判分四问 + 汇总表) | 同口径输入件:`_eval_harness\cases_46.json` / `score_w11b.json`;实测证据:`_cs_manual_*_20260920.json` |
| `D2.8-客服Agent知识库RAG全链路与选型说明-2026-09-20.md` | — | 2026-09-20 | RAG 全链路(按流程逐步:解析 / 切片 / 向量化 / 入库 / 检索 / 增强 / 判定) | 上游:`D2.4` §6 / §7、`D3.2`、`D3.5`;实测:`knowledge\_chunks.jsonl` **755 块**(2026-09-21 `W24` 复测)+ Milvus 四集合直查 |
| `D2.9-客服Agent手动对话测试用例-2026-09-20.md` | **v1.3** | 2026-09-20 | 手动对话测试用例(46 条金标逐条可问 + 11 条边界 + 判分四问 + 汇总表) | 同口径输入件:`_eval_harness\cases_46.json` / `score_w11b.json`;实测证据:`_cs_manual_*_20260920.json` |
### 4.2 Ⅱ 开发文档区内的现行权威(8 份)
@@ -889,3 +889,24 @@ A5 [D3.3] 访客与角色分离的鉴权方案建议(仅此一份,无新旧
> **维护责任**:本文件为活文档。**新增 / 改名 / 归档 / 改版本号后,须同步更新本文件 §3 与 §4.0 总表对应行**。
>
> 编制:项目文档组 | 审核:合规稽核部 | 日期:2026-09-17
---
## 31. 第二十七轮:`W24` 语料入库轮 —— `docs/43` 场内基金手册入库 + `B-02` 展示候选集收口(2026-09-21)
> **本轮做什么**:按用户「**先把语料修复吧 在进行下一步 不单独立项了**」执行 `W21` §9.5 第 3 条登记的待决 —— 把 **20 只场内基金**(`docs/43`)正式纳入切片 `SOURCES` 并重建重灌四个 Milvus 集合;收尾时修掉一处 `B-02` 的 `M-4` 回归。
| 项 | 内容 |
|---|---|
| **语料入库** | `docs/43-场内基金产品手册(知识库入库版).md` 纳入 `SOURCES`(`prefix=ETF` / `fin_product_collection` / `public` / `V1.0` / `2026-09-11` / `JR-ETF-2026-001`);切片件 **702 → 755 块**(`policy 288 / product 251 / faq 154 / basic 62`),档位 `public 730 / registered 25` |
| **新增三个按源开关** | `strip_editorial_marks`(丢 `>` 行 + 清 `⚠️`;该手册含**内部编辑说明**,不能给客户看)/ `qualify_table_rows`(7 列、5 列表格**按表头逐列**串成自解释正文)/ `exclude_sections`(导航型小节「3.2 其他产品的查询」不入库);**默认关** ⇒ 其它 8 个源实测 `changed existing blocks: 0` |
| **修掉两个真实缺陷** | ① `W24-A` **切片器行标签取错列**:多列表格第 0 列是**代码**(`159700[:2]`=`15`)⇒ 上游 `_prefer_section` 判不出重合 ⇒ **每一问都被换成整节块**(实测「科创债ETF南方怎么样」返回 20 只产品的整张表);改取表头「名称」列。② `W24-B` `text-embedding-v3` **单请求上限 10 条**,`load_knowledge_milvus.embed()` 只在灌库路径分批 ⇒ **自检路径**超 10 条即在**数据写完后**崩(14 条触发);分批下沉进 `embed()`(`MAX_BATCH = 10`) |
| **`B-02` 的 `M-4` 回归修复** | `_exit_partial` 两条调用路径**候选集不同**(主路径 TopK 全量 vs 证据路径被 `E4_MAX_EVIDENCE=6` 截断)⇒ **同一句问句的答复质量取决于「`E4` 有没有调用模型」**。`_answer_from_evidence` 新增 `display_hits`,**展示候选一律用 TopK 全量**;送模型的证据包保持 6 块不变 |
| **产品名识别补全** | `_PRODUCT_NAME_SHAPE` 后缀集补 `定期开放混合\|股票\(LOF\)[ABC]?\|\(LOF\)\|原油[ABC]?`;新增 `_BRANDLESS_PRODUCT_NAMES`(`沪深300ETF`,**唯一无厂商字样**的产品,只能枚举不能用通用后缀);`_strip_product_name_lead` 增「先切掉前一只基金」 |
| **测试** | 新增 **2 条守卫**(20 只产品名全覆盖 / 无厂商字样产品不在类目问句上开门);全量回归 **`1996 passed / 3 skipped`**(上一轮 `1994`);`ruff` **零新增**(本轮曾引入 2 条 `B905`,当场改 `zip(..., strict=True)` 清零) |
| **金标 46 条** | `M-1 46/46`、`M-4 46/46`、`M-6 5/46`、`M-7/M-8/M-9/M-10 = 0`、`M-2 28/31`、`M-2b 15/18`、`M-3 4/4` —— **与 `w23` 基线逐项一致**;**两次独立复跑**(`result_w24d` / `result_w24e`)指标完全相同 |
| ⚠️ **判据变更(3 条,必须知情)** | ① `B-01`(访客)`expected_evidence` 补 `ETF`;② `B-05`(客户,**同一句问句**)`expected_exits` `[E3]` → `[E3, E4]`;③ `load_knowledge_milvus` 自检 `BAS-CON-006` → `ETF-005`。**本轮不适用「零回归」表述** |
| **裁定** | `docs/45`(R1—R5 问答)**不入库**(与 `FAQ-0018` / `POL-AST-011/012` 重复,会抢 top1)—— 历史承诺里的 `docs/45` 部分据此关闭 |
| **版本位** | 本文件头部 **v1.14 → v1.15**;`客服agent\D2.1` 标题 **v6.38 → v6.39**;`客服agent\D2.4` **v1.7 → v1.8**;`客服agent\D2.9` **v1.2 → v1.3**;`开发文档\D4.8` **v1.1 → v1.2**(新增 §10);`开发文档\D1.6` **v1.1 → v1.2**(新增 §11) |
| **交叉引用** | `D1.6` 新增 §11(本轮对话上下文提取件);`D4.8` 新增 §10(实施与验收);`D2.1` 新增 `v6.39` 段;`D2.8` 新增 §3.6 与 §11 复测 |
| ⚠️ **未做(诚实声明)** | ① `_exit_partial` **仍按分数挑块**(不接收问句)—— 本轮只统一了**候选集**,**挑选语义**未改;② `E5b` 展示层净化仍不覆盖「收益 + 数字%」形态(`W21` §9.5 第 4 条继续挂账);③ 语料里 **2 个零容忍地雷块**(`POL-SPM-016` / `POL-SPM-022-01`)为**禁令条款**,**故意保留** |
@@ -2,7 +2,7 @@
> **体系编号**:`D1.6` · 域:一、治理与索引 · 编号体系见 `D1.1` §4.0
> **编号**:CS-DOC-2026-019 | **版本**:v1.1 | **日期**:2026-09-17 | **状态**:**现行(活文档:每项拍板后回填 §4.3)**
> **编号**:CS-DOC-2026-019 | **版本**:v1.2 | **日期**:2026-09-17 | **状态**:**现行(活文档:每项拍板后回填 §4.3)**
> **性质**:本文件是一次「人 ↔ AI 会话」的**上下文提取件**。它不重复 `D1.5` 已登记的事项,只回答四件事:① 本轮读了什么、依据什么;② 得出哪些**可复用**的结论(含证据与实测);③ 本轮**新增**的待决策项 `N-01`~`N-09`;④ 下一步怎么走。
> **读法**:接手先读 §0 → §3(问题清单)→ §4(要你拍板的)→ §7(能力边界)。历史明细见 `D1.5`(决策登记册)与 `D2.1`(执行看板)。
> **配套**:知识库检索侧的升级建议见专册 `D3.5-知识库检索升级备选方案建议-2026-09-17.md`;**Agent 侧"如何变智能"的架构建议见专册 `D3.6-客服Agent智能增强架构建议-2026-09-17.md`**(五出口决策链 `E1`—`E5` + 安全不变量 `INV-1`~`INV-5` + 待拍板 `DEC-I1`~`DEC-I8`)。
@@ -3357,7 +3357,9 @@ pytest **2 failed / 1577 passed / 2 skipped**(= `T0` 基线同两项)、ruff
- **考点两条没变**(禁忌字面不出现 / 关键事实命中),变的只是出口形态;旧 `E5b` 贴的是「6.2 核心科技平台」。
- 因此「`M-1 46/46`」这个数字,**建立在一条金标期望修订之后**。
### 10.4 本轮**新发现**(下一轮的第一顺位待决)
### 10.4 本轮**新发现**(下一轮的第一顺位待决)—— ✅ **已于 `W24` 执行,见 §11**
> ✅ **2026-09-21 `W24` 已按甲方批准执行完毕**:`docs/43` 纳入 `SOURCES`、切片件 **702 → 755 块**、四集合重建重灌、自检 15/15。下面保留当时(`W21` 视角)的取证原文备查。
**`docs/43-场内基金产品手册(知识库入库版).md` 从未入库。**
@@ -3368,7 +3370,7 @@ pytest **2 failed / 1577 passed / 2 skipped**(= `T0` 基线同两项)、ruff
| `knowledge/_chunks.jsonl`(702 块) | 「科创债」**0 处**、`ETF南方` **0 处** |
| 后果(实测) | 「科创债ETF南方怎么样」的 top1 是 **`南方稳健增利债券 A` 的产品卡**(0.6696)—— 客户问 A、拿到 B 的资料 |
| 历史承诺 | `D3.4` 的 `B-02`(决 12)与 `D4.1` §B-02 都写了「新增 `docs/43`+`docs/45` 入 `SOURCES`」,**实际未执行** |
| 本轮处置 | `W21-D3` 闸门**止损**(不再贴错产品,改为诚实作答);**根本修复**(纳入 `SOURCES` + 重建重灌)属**语料变更**,未擅自执行 |
| 本轮处置 | `W21-D3` 闸门**止损**(不再贴错产品,改为诚实作答);**根本修复**(纳入 `SOURCES` + 重建重灌)属**语料变更**,未擅自执行 → **`W24` 已执行**(见 §11、`D4.8` §10) |
| 建议 | 纳入 `docs/43`(`public` 档)→ 重建 `_chunks.jsonl` → 重建 `fin_product_collection` → 复跑 46 条金标(**注意**:新增集合会改变产品类问句的排序,须逐条看 `M-2`/`M-4` 是否漂移) |
### 10.5 本轮可复用事实(下一轮别再重新求证)
@@ -3382,8 +3384,60 @@ pytest **2 failed / 1577 passed / 2 skipped**(= `T0` 基线同两项)、ruff
### 10.6 本轮遗留(如实登记)
1. `docs/43` / `docs/45` 未入库(§10.4)。
1. ~~`docs/43` / `docs/45` 未入库(§10.4)~~ → **已闭环**:`docs/43` 已于 `W24` 入库(702 → 755 块);`docs/45` 经裁定**不入库**(与 `FAQ-0018` / `POL-AST-011/012` 高度重复,会污染 top1)。见 §11 / `D4.8` §10.6。
2. **`E5b` 展示层净化覆盖不全**(§10.5 第 5 条)。
3. **`E5b` 的"挑哪一块"仍是"分数最高"**:`_exit_partial` 不接收问句,无法优先挑"提到问句里那只产品"的块。当正确产品的块排在第 2—5 名时,客户仍可能看到第 1 名的近邻块。**这是一个有明确修法的待决项**(把问句传进去,按产品名一致性优先)。
- 🟡 **`W24` 部分收口**:`_exit_partial` 的**候选集**已统一为 **TopK 全量**(原先证据路径只拿到被 `E4_MAX_EVIDENCE` 截断的证据包,导致"同一句问句的答复质量取决于 `E4` 有没有调用模型"——`B-02` 因此从 46/46 掉到 45/46,已修)。**挑选语义仍是"分数最高",未改为"按问句主体优先"** —— 那会覆盖全部 `E5b`,需单独回归,本轮未做。见 §11 / `D4.8` §10.2。
4. 语料里仍有 **2 个零容忍地雷块**(`POL-SPM-016` / `POL-SPM-022-01`),是**禁令条款**,故意保留。
5. `ruff` 既有告警未顺手改(`customer_service.py:34` I001、`:1220` E501,行号因新增代码下移)。
---
## 11. `W24` 轮对话上下文(2026-09-21 · `docs/43` 场内基金手册入库 + `B-02` 展示候选集收口)
> **性质**:本节是**本轮对话与决策的上下文提取件**,与 §9 / §10 同构,供下一轮开工快速恢复语境。
> **上游**:`客服agent\D2.1` `v6.39`;**完整报告**:`开发文档\D4.8-…md` §10。
### 11.1 甲方本轮原话(逐字留痕)
1. 「**按照你建议的来**」
2. 「**先把语料修复吧 在进行下一步 不单独立项了**」
3. 「按照你建议的来 我们要提升效率 尽可能的把两个步骤变成一步去执行」
4. 「**你现在帮我做一个演示的前端一键启动的一个脚本**」
5. 「**你的RAG方案不是我想要的,我希望你按照流程去总结**」
### 11.2 本轮**已拍板并已执行**的结论
| # | 事项 | 裁定 | 落地证据 |
|---|---|---|---|
| `W24-1` | `docs/43` 是否入库 | **入库**(`public` 档,`fin_product_collection`) | 切片件 702 → **755 块**;四集合 drop → 重建 → 重灌;自检 **15/15** |
| `W24-2` | `docs/45` 是否入库 | **不入库**(与 `FAQ-0018` / `POL-AST-011/012` 重复,会抢 top1) | `D4.8` §10.6 |
| `W24-3` | 场内基金手册里的**编辑说明段**(指向 `docs/42`、含两个互相矛盾的净值) | **不给客户看** ⇒ 新增按源开关 `strip_editorial_marks`(丢 `>` 行 + 清 `⚠️`);**镜像文件仍与 `docs/43` 逐字一致**,只在切片时丢 | 其它 8 个源实测 `changed existing blocks: 0` |
| `W24-4` | 7 列 / 5 列表格怎么切 | **按表头逐列串成自解释正文**(`qualify_table_rows`);否则默认只取前两列,**丢掉风险等级 / 净值 / 费率** | 「…风险等级」→ R2;「…管理费率」→ 0.15+0.05 |
| `W24-5` | 「3.2 其他产品的查询」(导航型小节) | **不入库**(`exclude_sections`)—— 它抢走了 `B-06` 的 top1 | 本步实测 |
| `W24-6` | 旧数据集 | **不用旧数据,全部用新数据**(甲方原话) | 未做任何增量 upsert;全部 drop 重建 |
| `W24-7` | 是否允许删旧 Milvus 库 | **允许**(「必要时可以跑单元测试与回归测试」「全部一起做一起测试」) | 本轮重建 1 次(补切片后再重建 1 次,共 2 次) |
### 11.3 本轮**判据变更**(必须知情,不要当成"零回归")
- `B-01`(访客)`expected_evidence` 补 `"ETF"` → `[PROD, FAQ, ETF]`(`ETF-013` 0.7954 合法 top1,答案更完整)。
- `B-05`(客户,**同一句问句**)`expected_exits` `[E3]` → `[E3, E4]`(与 top1 只差 0.033 < 0.07 ⇒ 并列走生成式作答)。
- `load_knowledge_milvus` 自检 `("场内基金和场外基金有什么区别", "BAS-CON-006")` → **`"ETF-005"`**(0.861 vs 0.789)。
- ⇒ 准确说法是「**在三条期望登记修订之后**,`M-1`/`M-4` 均为 46/46」,**不是**「零回归」。
### 11.4 本轮可复用事实(下一轮别再重新求证)
1. **`text-embedding-v3` 单请求最多 10 条**。分批必须做在 `embed()` **内部**(不是调用方):本轮就是"灌库路径分批、自检路径没分批"导致**数据已写完之后崩**(14 条即触发)。同类工具照此检查。
2. **行级子块的 `title` 必须是「这一行讲的是谁」**。上游 `_prefer_section` 靠 `title` 末段与问句比对;多列表格的第 0 列是**代码**(`159700[:2]`=`15`)⇒ **永不重合** ⇒ 每一问都被换成整节块(客户问 1 只、拿回 20 只的整张表)。改标签列时**必须一并回归"问单只产品"的问句**。
3. **正则提产品名不能用通用后缀枚举**:`ETF` 一旦放成通用后缀,「买ETF还是买LOF」会被吞成假产品名「买ETF」,`asked` 非空而命中块当然没有 ⇒ **造出假"没找到"**。唯一没有厂商字样的产品(`沪深300ETF`)只能用**枚举**。
4. **`_exit_partial` 的候选集口径必须唯一**(`W24` 教训):它同时被"主路径(TopK 全量)"和"`E4` 证据路径(`E4_MAX_EVIDENCE=6` 截断包)"调用,**两条路径候选集不同** ⇒ 客户看到的答案质量取决于"`E4` 这次有没有调用模型"。**凡"同一出口、两条调用路径"的地方,都要检查候选集是否一致。**
5. **`upsert` 会让 `get_collection_stats().row_count` 翻倍**(实测 450 vs 251,`doc_id` 仍唯一)⇒ **只信 `_chunks_report.txt` 的块数**;改 `doc_id` 编号后**必须丢集合重建**(本轮重编号 `ETF-009`/`ETF-010` 时留过一条陈旧行 `ETF-014`)。
6. **两次独立复跑是必需的**:`result_w24d` 与 `result_w24e` 指标完全相同才算修好。本仓库有"只跑一次就宣布修好是假绿"的历史教训(§10.5 第 6 条)。
7. **改代码 / 重灌后必须重启 API + Worker 再打真 HTTP**;跑全量 `pytest` 前**必须停 Worker**(它抢 MySQL outbox 会造出假红)。
### 11.5 本轮遗留(如实登记)
1. **`_exit_partial` 仍按分数挑块**(不接收问句)—— 本轮只统一了**候选集**,**挑选语义**未改(见 §10.6 第 3 条)。
2. **`E5b` 展示层净化仍不覆盖「收益 + 数字%」形态**(§10.5 第 5 条)—— 本轮未动,继续挂账。
3. 语料里仍有 **2 个零容忍地雷块**(`POL-SPM-016` / `POL-SPM-022-01`),是**禁令条款**,**故意保留**,不是缺陷。
4. `ruff` 既有告警未顺手改(`customer_service.py:34` I001、`:1220` E501,行号因新增代码下移);本轮**引入过** 2 条 `tools/build_knowledge_chunks.py` `B905`,已在轮内改 `zip(..., strict=True)` 清零。
@@ -1,7 +1,7 @@
# D4.8 · 客服 Agent 智能度体检与整改报告(`W21`)
> **体系编号**:`D4.8` · 域:四、重构与清除留痕
> **编号**:CS-RPT-2026-024 | **版本**:v1.1 | **日期**:2026-09-21 | **状态**:现行
> **编号**:CS-RPT-2026-024 | **版本**:v1.2 | **日期**:2026-09-21 | **状态**:现行
> **性质**:**留痕报告**。回答甲方一句质疑 —— 「客服 Agent 不智能,很多问题强制转人工」。
> 本文只做三件事:**取实测证据**、**定位根因**、**登记整改与未整改项**。不改需求、不立新任务。
@@ -19,6 +19,8 @@
**第二轮(同日)**:§6 四项待决经甲方「**按照你建议的改**」全部裁定并落地 —— `W21-D1` 生成侧禁令、`W21-D2` 指代依据、`W21-D3` 答非所问闸门、`W21-D4` 作答语气。落地后**三项实测退化**(三条「检索命中完全正确却拿兜底话术」的问句)由 **0/9 走 `E4`** 变为 **9/9 走 `E4` 真实作答**;金标与全量回归见 §9。
**同时暴露一个比 `D1`~`D4` 更根本的缺口**:`docs/43-场内基金产品手册(知识库入库版).md`(20 只场内基金)**从未进入 `SOURCES`**,见 §9.5 第 3 条。
**第三轮(同日,`W24`)**:该缺口已**按甲方批准执行** —— `docs/43` 纳入 `SOURCES`、切片件 **702 → 755 块**、四集合 **drop → 重建 → 重灌**、自检 **15/15**。执行中发现并修复一个**切片器真实缺陷**(多列表格行标签取错列 ⇒ 客户问一只产品拿到 20 只的整张表)与一个**潜伏 bug**(`text-embedding-v3` 单请求上限 10 条,自检路径未分批 ⇒ 数据写完后崩)。收尾时另修一处 `B-02` 的 `M-4` 回归:`_exit_partial` 的两条调用路径**候选集不同**,导致**同一句问句的答复质量取决于「`E4` 这次有没有调用模型」**。完整实施与验收见 §10。
---
## 1. 待判物:`_chunks_report.txt` 能否删除 —— **判定:可删,已删并已加 `.gitignore`**
@@ -324,7 +326,7 @@ E4 生成稿里出现「收益率 / 七日年化」等 YIELD_METRIC_TERMS
1. **打标口径变更**:`W20` 版把认不出的归「其它」(10 条盲区,逐条读原文发现 9 条其实是**正确作答**);`W22` 版翻转为"只识别退化形态"。两次分布**不可相减**,§2.3 已写明。
2. **C-11 是"未修复"而不是"不需要修"**。它已被精确定位到代码行与触发条件,只差一个**合规口径的批准**(§6 第 1 项)。
3. **本轮体检样本是本报告自己构造的**(81 条 + 8 组多轮),不是甲方给定的验收集。金标 46 条仍是**唯一**验收依据,体检集只用于**发现缺陷**。
4. **代码里 4 条 ruff 告警是既有的**(`customer_service_rules.py:318/416`、`customer_service.py:34/1188` 的 E501 与 I001),不是本轮引入,也**未顺手改** —— 避免把无关改动混进本轮 diff。
4. **代码里 4 条 ruff 告警是既有的**(`customer_service_rules.py:318/416`、`customer_service.py:34/1188` 的 E501 与 I001;`W21` 二轮后 E501 行号下移至 `:1220`),不是本轮引入,也**未顺手改** —— 避免把无关改动混进本轮 diff。(`W24` 另**引入过** 2 条 `tools/build_knowledge_chunks.py` 的 `B905`,已在本轮内改为 `zip(..., strict=True)` 清零,见 §10.5。)
5. **真机复验依赖本地四依赖**(MySQL / Redis / Milvus / API+Worker)。复跑前须确认 `/internal/health/ready` 三依赖全绿,否则 `E5b` 会被误读成"缺陷"。
6. **`C-9` 的产物 `_PRODUCT_NAME_SHAPE` 是形状匹配、不是产品名白名单**:语料里新增产品名只要仍符合「南方 + 名称 + 产品类型后缀」就能被认出;若将来出现**不符合该形状**的产品名(如纯英文名),②级降级会失效并落到③级(知识检索)—— 功能不减,只是拿不到裁决。
@@ -386,6 +388,96 @@ E4 生成稿里出现「收益率 / 七日年化」等 YIELD_METRIC_TERMS
1. **`D1` 是"降低概率"不是"消灭概率"**:只把 ④ 写进 user 模板时,三条问句仍各有约 1/3 会落到 `E5b`;把同义禁令补进 **system 红线 ②** 后测得 **9/9**。若某次生成仍写出收益数值,`_exit_partial` 的兜底照旧生效(**宁可兜底,不可输出**)。
2. **`I-01` 的金标期望被修订过**(9.3)。这是**判据变更**,不是"零回归" —— 请知情后使用 `M-1 46/46` 这个数字。
3. **`docs/43-场内基金产品手册` 未入库**(702 块里「科创债」0 处):`W21-D3` 的闸门只做到**止损**(不再贴错产品),**根本修复**需要把它纳入 `SOURCES` 并重建集合 —— 属**语料变更**,未在本轮擅自执行,已登记为待决(`D1.6` §10.4)。
3. ~~**`docs/43-场内基金产品手册` 未入库**(702 块里「科创债」0 处)~~ → **已于 `W24` 执行并验收**(`docs/43` 纳入 `SOURCES`,切片件 702 → 755 块,见 §10)。当时 `W21-D3` 的闸门只做到**止损**(不再贴错产品),**根本修复**需要把它纳入 `SOURCES` 并重建集合 —— 属**语料变更**,未在 `W21` 擅自执行,已登记为待决(`D1.6` §10.4)。
4. **`E5b` 展示层仍是"原文直返"**:实测「买基金要手续费吗」的 `E5b` 分支正文里含「专户业绩报酬 | 按合同约定计提 | 超额收益的 10%—20%」,会被 `hits_zero_tolerance` 判 True(`收益`+数字% 陷阱)。**这是既有行为**(`drop_yield_claims` 只丢带收益指标名的行),治理层不对 `E5b` 正文做二次零容忍扫描,因此**不会拦单**;但**展示层净化是否要覆盖这一形态**,建议列入下一轮待决。
5. **改动只落在 `客服agent/` 与 `开发文档/` 两份权威副本 + 仓库同名镜像**,三处一致(`D1.1` §权威声明)。
---
## 10. `W24` · `docs/43` 场内基金手册入库的实施与验收(2026-09-21)
> **性质**:**补历史欠账**。`D3.4` 的 `B-02`(决 12)与 `D4.1` §B-02 早已写明「新增 `docs/43`+`docs/45` 入 `SOURCES`」,**从未执行**;`W21` §9.5 第 3 条首次把它暴露成实测缺口。甲方 2026-09-21 批准「**先把语料修复吧 在进行下一步 不单独立项了**」⇒ 本轮执行。
> **证据**:`_eval_harness/result_w24d.json` + `score_w24d.json`、`result_w24e.json` + `score_w24e.json`、`_w24_http.txt`(真 HTTP)、`knowledge/_chunks.jsonl`(755 块)。
### 10.1 落地清单(文件级)
| 文件 | 改动 |
|---|---|
| `tools/build_knowledge_chunks.py` | ① `SOURCES` 新增 `product/场内基金产品手册(知识库入库版).md`(`prefix=ETF` / `collection=fin_product_collection` / `visibility=public` / `version=V1.0` / `effective_date=2026-09-11` / `doc_no=JR-ETF-2026-001`);② 新增三个**按源开启**的开关 `strip_editorial_marks` / `qualify_table_rows` / `exclude_sections`(默认关);③ `expand_table_rows()` 签名加 `qualify`,新增 `cell_text()` / `row_content()` / `subject_of()`;④ **行级子块标签改取「名称」列**(缺陷修复,见 10.2) |
| `tools/load_knowledge_milvus.py` | `embed()` **内部分批**(`MAX_BATCH = 10`)—— 修自检路径超 10 条即崩的潜伏 bug;自检期望 `BAS-CON-006` → `ETF-005`,并新增 5 条新源存在性证明(**自检 15/15**) |
| `docs/43-场内基金产品手册(知识库入库版).md` + `knowledge/product/…md` | 费率表表头补「(%/年)」;两处**逐字一致**(有断言守着) |
| `knowledge/_chunks.jsonl` | 702 → **755 块**(policy 288 / product 251 / faq 154 / basic 62) |
| `app/service/agent/implementations/customer_service.py` | ① `_PRODUCT_NAME_SHAPE` 后缀集补 `定期开放混合\|股票\(LOF\)[ABC]?\|\(LOF\)\|原油[ABC]?`;② 新增 `_BRANDLESS_PRODUCT_NAMES`(`沪深300ETF`)与第三条 pattern;③ `_strip_product_name_lead` 增「先切掉前一只基金」;④ `_answer_from_evidence` 新增 `display_hits` 形参,四处 `_exit_partial` 改传**展示候选集** |
| `tests/unit/service/test_customer_service_agent.py` | **+2 条守卫**:20 只产品名全覆盖(语料驱动)、无厂商字样产品**不**在类目问句上开门 |
| `_eval_harness/cases_46.json` | `B-01` 证据期望补 `ETF`;`B-05` 出口期望补 `E4`(见 10.3) |
| `客服agent/D2.1` | 升 `v6.39` |
| `客服agent/D2.4` / `D2.8` / `D2.9` | 语料口径 675 → **755**;`D2.4` §4.4 场内基金手册切片预估「约 30—50」→ 实测 **53** |
| `开发文档/D1.1` / `D1.6` | 索引口径同步;`D1.6` 新增 §11,§10.4 标「已执行」、§10.6 第 1 条销账 |
| 本文件 | 新增 §10;§0 / §8 / §9.5 同步 |
### 10.2 执行中发现并修复的两个真实缺陷
| 编号 | 缺陷 | 现象(修复前) | 根因 | 修法 |
|---|---|---|---|---|
| **`W24-A`** | 🔴 **切片器:行级子块标签取错列** | 「科创债ETF南方怎么样」返回 **20 只产品的整张表**(真 HTTP + 进程内**双重**复现) | 上游 `_prefer_section` 用子块 `title` 末段与问句比对;多列表格**第 0 列是代码**(`159700[:2]` = `15`),**永不重合** ⇒ 每一问都被换成整节块 | `qualify` 模式下标签改取表头里含**「名称」**的那一列(两张表都有该列),无则退回第 0 列 |
| **`W24-B`** | 🔴 **`embed()` 自检路径未分批** | `CHECKS` 超过 10 条时,**数据已全部写完之后**崩(本次 14 条即触发) | `text-embedding-v3` **单请求最多 10 条**;原实现只有灌库路径分批 | 分批下沉进 `embed()`(`MAX_BATCH = 10`),两条路径同时受益 |
**另修一处 `M-4` 回归(`B-02`)**:
| 项 | 内容 |
|---|---|
| 现象 | `B-02`「基金申购和赎回有哪些费率?」(访客)在 `w24c` 由 `E5b` 展示 `POL-SPM-033-01`(**单行「赎回费率:<7 天 1.50%」**)⇒ **只答一半**,`M-4` 失败 |
| 根因 | `_exit_partial` 的两条调用路径**候选集不同**:主路径 `_answer_from_knowledge` 传 **TopK 全量**(能挑到 `PROD-016` 费率总表),证据路径 `_answer_from_evidence` 传**被 `E4_MAX_EVIDENCE = 6` 截断的证据包**。新语料把 `ETF-009` 插进 TopK,把 `PROD-016` 从第 9 名挤到第 10 名,"在包内"变"包外" |
| 为什么这是缺陷 | **同一句问句的答复质量取决于「`E4` 这次有没有调用模型」** —— 两条路径只差"模型这一跳成没成",不该差在客户看到的内容质量上 |
| 修法 | `_answer_from_evidence` 新增 `display_hits` 形参(调用点把 `hits` 传进来),四处 `_exit_partial` 改传该值;`_exit_partial` 内部仍挑最高分、仍用 `PARTIAL_FLOOR` 兜底。**送模型的证据包保持 6 块不变**(那是模型注意力问题,不是展示问题) |
| 为什么不顺手"按问句产品名优先挑块" | 那会改 `E5b` 的**挑选语义**(从"分数最高"变成"与问句主体一致优先"),影响面覆盖全部 `E5b`,需单独回归;本轮只做**候选集口径统一**这一最小改动(`D1.6` §10.6 第 3 条仍**部分未收口**) |
### 10.3 期望值登记修订(**判据变更,必须知情**)
| 项 | 原期望 | 修订后 | 理由 |
|---|---|---|---|
| `B-01`(**访客**,问句见 `cases_46.json`) | `expected_evidence = [PROD, FAQ]` | `[PROD, FAQ, ETF]` | 新语料让 `ETF-013`(0.7954)**合法**拿到 top1,`PROD-001-05`(0.7527)退到 #2;两者都答得到,**答案更完整**。已写 `evidence_note` |
| `B-05`(**客户**,与 `B-01` **同一句问句**) | `expected_exits = [E3]` | `[E3, E4]` | 与 top1 `FAQ-0020`(0.8286)只差 **0.033 < 0.07** ⇒ 走「并列 → 生成式作答」。已写 `exit_note` |
| `tools/load_knowledge_milvus.py` 自检 | `("场内基金和场外基金有什么区别", "BAS-CON-006")` | `("…", "ETF-005")` | `ETF-005` 0.861 vs `BAS-CON-006` 0.789,**更贴题**;已写明「期望值是**语料版本的函数**」 |
> ⚠️ 因此本轮**不适用**「零回归」表述。可复算的准确说法是:**在三条期望登记修订之后**,金标 `M-1`/`M-4` 均为 46/46。
### 10.4 验收(可复算)
| 项 | 结果 |
|---|---|
| 金标 46 条(进程内 `probe.py` + `score.py`) | `M-1 46/46`、`M-4 46/46`、`M-6 5/46`、`M-7/M-8/M-9/M-10 = 0`、`M-2 28/31`、`M-2b 15/18`、`M-3 4/4` —— **与 `w23` 基线逐项一致** |
| **两次独立复跑** | `result_w24d` 与 `result_w24e` **指标完全相同**(本仓库有"只跑一次就宣布修好是假绿"的历史教训,`D1` 类改动必须重复采样) |
| Milvus 自检 | **15/15**;切片件 755 = 四集合合计(**只信 `_chunks_report.txt` 的块数** —— `upsert` 会让 `row_count` 翻倍) |
| 全量单元 / 集成回归 | **`1996 passed / 3 skipped`**(`W21` 二轮 `1994`,**+2 条新守卫全绿**) |
| `ruff` | **零新增**:`customer_service.py:34` I001、`:1220` E501 等**均为既有**;本轮曾引入 2 条 `B905`,已当场清零 |
| 切片件幂等 | `strict=True` 重构后重跑 `build_knowledge_chunks` ⇒ `knowledge/_chunks.jsonl` **SHA256 逐字节相同**(无须重灌) |
| 真 HTTP | 见 10.5 |
### 10.5 真 HTTP 复验(`cust_t` / 访客,`POST /api/v1/agent-runs`)
| # | 问句 | 结果 |
|---|---|---|
| 1 | 南方金利定开债券A的费率是多少? | 单行费率 **带单位**:管理费率(%/年)0.50 / 托管费率(%/年)0.15 / 销售服务费率 无 |
| 2 | 科创债ETF南方怎么样 | **单只产品**(代码 159700 / 深交所 / ETF / **R2** / 净值 101.8009)—— 修复前是 20 只的整张表 |
| 3 | 场内基金有哪些 | 20 只清单 |
| 4 | 场内基金和场外基金有什么区别 | `ETF-005`:场内按市价撮合 / 场外按净值申赎,T+1 确认 |
| 5 | 南方现金添利怎么样 | `E4` 生成作答(R1 / 起投 1 元 / 费率 / 申赎规则),**零收益数值** |
| 6 | 买基金要手续费吗 | `E4` 合并作答(交易 + 持有 + 赎回费 + 线上优惠) |
| 7 | 赎回费怎么算 → 持有 8 个月呢 | `E5b` → `E5b`:**两轮都给出完整分档表**(`B-02` 同族修复的连带确认) |
| 8 | 我想买个债基 → 它适合我吗 | 指代继承 + **真实适当性裁决**(R2 vs C1 + 揭示书 + 双录);**未替客户确认** |
| 9 | 科创债ETF南方(**访客**) | 与客户档同答(`public` 档);**无档位越权** |
### 10.6 本轮裁定:`docs/45` **不入库**
`docs/45`(R1—R5 问答)与 `FAQ-0018`、`POL-AST-011` / `POL-AST-012` **高度重复**;单独成块会在「R1 到 R5 分别代表什么」这类问句上**抢走 top1**(该题 Top1 与次优原本只差 0.021,属已知的阈值敏感区)。**裁定:不纳入 `SOURCES`**;历史承诺里的 `docs/45` 部分**据此关闭**。
### 10.7 诚实留痕(本轮新增,别漏)
1. **本条是"补历史欠账",不是新增需求**:`D3.4 B-02`(决 12)与 `D4.1 §B-02` 早已承诺,从未执行。
2. **本轮有 3 条期望修订**(10.3),"零回归"不适用。
3. `_exit_partial` **仍按分数挑块**,不接收问句 ⇒ 「问句点名了产品 X,但第 1 名的近邻块更贴题」这一类**仍未收口**(`D1.6` §10.6 第 3 条,本轮只统一了候选集口径)。
4. **`E5b` 展示层净化仍不覆盖「收益 + 数字%」形态**(`W21` §9.5 第 4 条)—— 本轮**未动**,继续挂账。
5. 语料里仍有 **2 个零容忍地雷块**(`POL-SPM-016` / `POL-SPM-022-01`),是**禁令条款**,**故意保留**,不是缺陷。
6. **`upsert` 会让 `get_collection_stats().row_count` 翻倍**(实测 450 vs 251,`doc_id` 仍唯一)⇒ **只信 `_chunks_report.txt` 的块数**;改 `doc_id` 编号后**必须丢集合重建**(本轮重编号 `ETF-009`/`ETF-010` 时留过一条陈旧行)。
7. 改动只落在 `客服agent/` 与 `开发文档/` 两份**权威副本** + 仓库同名**镜像**,三处一致(`D1.1` §权威声明)。