docs(W25): D2.9 手动测试用例按实测重建 + 展示层误删正文真缺陷修复

- D2.9 v1.3→v1.4:46 条金标追加「2026-09-21 实测(出口 · top1)」列与逐条答复原文,
  §3 边界 11 条 / §4 安全 4 条 / §1.3 / §5 指标表实测列刷新,新增 §2.10 场内基金演示线(5 条),
  §3.1 缺口由三个扩为四个(新增 ④ A-06),§3.2 整段重写,§8 新增 D-5 与 DEC-W20-8 细化
- D2.5 §4.7 出口口径更正:场内基金第 1 条 E3→E4、第 2 条 E3→E5b(内容逐字正确,出口偏保守)
- 修复 drop_yield_claims() 误删「业绩比较基准」公式行:收益词与百分比间出现
  乘号 / 指数 等公式标记时判为基准公式豁免,两种语序的真实收益数值照删
- 新增回归测试 test_drop_yield_claims_keeps_the_benchmark_formula_but_drops_both_word_orders
- D2.1 v6.39→v6.40 / D1.1 v1.15→v1.16(新增第二十八轮)/ D1.6 新增 §12 / D4.8 v1.2→v1.3(新增 §11)

实测:46 条金标全部 succeeded,HTTP 非 200 = 0;转人工 5 条(均白名单内);
M-1 46/46、M-4 46/46、M-6 5/46、M-2 28/31、M-2b 15/18、M-3 4/4、M-7/M-8/M-9/M-10 = 0;
pytest 1997 passed / 3 skipped;ruff 零新增告警。
This commit is contained in:
张胜宇
2026-09-21 15:27:18 +08:00
parent 29da85d010
commit 35109af96f
8 changed files with 692 additions and 125 deletions
@@ -1,7 +1,7 @@
# D4.8 · 客服 Agent 智能度体检与整改报告(`W21`)
> **体系编号**:`D4.8` · 域:四、重构与清除留痕
> **编号**:CS-RPT-2026-024 | **版本**:v1.2 | **日期**:2026-09-21 | **状态**:现行
> **编号**:CS-RPT-2026-024 | **版本**:v1.3 | **日期**:2026-09-21 | **状态**:现行
> **性质**:**留痕报告**。回答甲方一句质疑 —— 「客服 Agent 不智能,很多问题强制转人工」。
> 本文只做三件事:**取实测证据**、**定位根因**、**登记整改与未整改项**。不改需求、不立新任务。
@@ -483,3 +483,50 @@ E4 生成稿里出现「收益率 / 七日年化」等 YIELD_METRIC_TERMS
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` §权威声明)。
---
## 11. `W25` · 手动测试用例按实测重建 + 展示层误删真缺陷修复(2026-09-21)
> **本轮做什么**:用户要求「**按照所有的问题帮我更新测试用例 我要看 我要依据测试用例去演示**」⇒ 用**当前实现**把 `D2.9` 的 46 条金标(含多轮)+ 11 条边界 + 安全 4 条 + 场内基金 5 条**全部重跑真 HTTP**,逐条回填**客户可见的答复原文**;过程中发现并修掉一处**展示层净化误删答复正文**的真缺陷。
> **性质**:**取证 + 回填 + 顺手修复**,不新增需求、不新增任务号。
### 11.1 落地清单(文件级)
| 文件 | 改动 |
|---|---|
| `_w25_http_manual.py`(新增,工作区根,**不入库**) | 一次跑完 46 金标(含 `chain` 多轮,同会话)+ 11 条 `Z` + 安全 4 条 + 场内基金 5 条 ⇒ `_w25_http_manual.json` / `.txt`(答复**全文** + `intent` / `transfer_required` / 工具 / 耗时) |
| `app/service/agent/implementations/customer_service.py` | `drop_yield_claims()` 增加**业绩基准权重豁免**:收益词与百分比之间出现 `×` / `✕` / `✖` / `*` / `乘` / `指数` ⇒ 判为「业绩基准公式」,不算收益数值;抽出 `_is_yield_claim()` 承载判据 |
| `tests/unit/service/test_customer_service_agent.py` | 新增 `test_drop_yield_claims_keeps_the_benchmark_formula_but_drops_both_word_orders`(公式**保留** + 两种语序的真实收益数值**照删**,一次钉两个方向) |
| `_eval_harness/result_w25.json`、`score_w25.json`(工作区根,不入库) | 46 条金标的出口与检索命中明细、十项指标判分 |
| `客服agent/D2.9-…md`(**v1.3 → v1.4**)+ 仓库镜像 | §2 每条金标「基线」列 → **本轮实测(出口 · top1)**;**每组表格后追加该组逐条实测答复原文**(46 条全量);§3 / §4 / §1.3 / §5 实测列刷新;**新增 §2.10 场内基金演示线**;§3.1 由「三个缺口」扩为**四个**(新增 ④) |
| `客服agent/D2.5-…md` §4.7 + 仓库镜像 | **出口口径更正**:场内基金演示线第 1 条 `E3 → E4`、第 2 条 `E3 → E5b`(内容是逐字正确的,只是套了「公开资料里的口径是」这句开场白);第 3 / 4 条确为 `E3`、第 5 条确为 `E4` |
### 11.2 本轮修复的真实缺陷(`W25-A`)
| 项 | 内容 |
|---|---|
| **现象** | 真 HTTP 问 `A-06`「什么是业绩比较基准?」⇒ 答复**只有一行**「问:什么是业绩比较基准?」,「**答:…**」整段消失 |
| **根因(已定因)** | 展示层 `drop_yield_claims()` 的判据是「**整行含收益数值就不输出**」;`FAQ-0022` 的答案行里有「沪深300指数收益率×60%+中证全债指数收益率×40%」,其中的 `60%` / `40%` 是**权重**、不是收益数值,却被同一条正则命中 ⇒ **整行被删** |
| **为什么金标没抓到** | `A-06` 的 `key_facts` 是「业绩比较基准」这个**纯词**,而它**在「问:」那一行里还在** ⇒ `M-4` 照样判过。这是「**事实判据通过、但客户看到的东西是坏的**」的典型 —— 只有逐条人工比对答复原文才看得出来 |
| **修复** | 收益词与百分比之间出现乘号或指数名 ⇒ 判为业绩基准公式**豁免**;两种语序的真实收益数值(`近一年收益率 7.60%` / `7.60% 的近一年收益率`)**照删** |
| **附带改善** | `Z-04`(英文问句 `hello, what is the subscription fee?`)从 `E5b` 兜底抬到 **`E4`** —— **未**为英文问句单独加任何召回路 |
### 11.3 验收(可复算)
| 项 | 结果 |
|---|---|
| 金标 46 条(`score_w25.json`) | `M-1 46/46`、`M-4 46/46`、`M-6 5/46`、`M-2 28/31`、`M-2b 15/18`、`M-3 4/4`、`M-7/M-8/M-9/M-10 = 0` —— **与 `w24e` 逐项相同** |
| 真 HTTP(46 条) | 全部 `succeeded`,HTTP 非 200 **0 条**;转人工 **5 条**(`F-05` / `G-01` / `G-03` / `G-04` / `G-05`,全在白名单内) |
| 边界 11 条 | `Z-01`/`Z-02` 预期 422 ✓、`Z-07` 预期 404 ✓、`Z-08` 三轮形状全 `E1` ✓ |
| 全量 `pytest` | **1997 passed / 3 skipped**(上一轮 `1996`,`+1` 条新回归测试) |
| `ruff check app tests tools` | **零新增**(27 条既有告警全部落在**本次未改动**的行上,逐条核对过) |
### 11.4 诚实留痕(本轮新增,别漏)
1. **本轮只改了一处代码**(展示层净化),**没有**动检索、阈值、出口选择、语料 —— `M-1` / `M-2` / `M-2b` / `M-3` 的分布因此**逐项不变**。
2. **`E-02` / `H-01`(「那风险高吗?」)实测只回 28 字**(`E3` 原文直返一个单行块:「南方稳健增利债券 A〔示例〕:风险等级 R2(中低风险)」)—— **内容正确但偏短**,本轮**没做厚**,登记为**可选优化**。
3. **`D2.9` §2 的「期望出口 / 期望要点 / 禁止出现」三列逐字沿用旧文**(它们是 `D3.7` 的判据,不是实测结果);本轮只换「实测」列并追加答复原文。
4. **出口仍在进程内 harness 判**(`result_w25.json`):HTTP 响应里没有 `Top1` 与引用可解析信息,**拿答复形状猜出口会假判** —— 上一轮已有 13 条假阴性的教训。
5. 本轮**未做**(继续挂账):① `_exit_partial` **仍按分数挑块**;② `D-2` 残余(同句重问**候选会变**);③ 金标仍 **46 条**(`DEC-W20-9`)。
6. 改动只落在 `客服agent/` 与 `开发文档/` 的**权威副本** + 仓库同名**镜像**,三处一致。