From 8d6e4b78bc2fb2a96c4ace5f19b61e24e4b687f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E8=83=9C=E5=AE=87?= <17412268+zzzzz11122222@user.noreply.gitee.com> Date: Mon, 21 Sep 2026 22:46:30 +0800 Subject: [PATCH] =?UTF-8?q?docs(W27-3):=20D2.6=20=C2=A711=20=E8=A1=A5?= =?UTF-8?q?=E3=80=8C=E9=98=88=E5=80=BC=E6=98=AF=E5=90=A6=E5=8F=AF=E9=9D=A0?= =?UTF-8?q?=E3=80=8D=E4=B8=89=E6=9D=A1=E8=BF=BD=E9=97=AE=20=C2=B7=20D2.10?= =?UTF-8?q?=20=C2=A78.1/=C2=A77.3/=C2=A77.4=20=E8=A1=A5=E8=A1=8C=E6=83=85?= =?UTF-8?q?=E4=B8=8E=E9=97=B2=E8=81=8A=20=C2=B7=20D1.1=20=C2=A735=20?= =?UTF-8?q?=E7=95=99=E7=97=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 承接 W27-2(279a632)。本轮做**答辩现场直接会被问到、但文档里还没有答案**的三件事。 ## 一、D2.6 §11「答辩现场速答」新增 3 条追问(核心) 甲方原话提的那个问题,之前 `D2.6` 只能靠 `D3.9` 间接回答,现场不一定翻得到。现在直接进速答表: 1. **「分级回退的阈值凭什么保证一定精确检索到答案?」** —— 答:**这个判据本身就站不住**。实测「应当直答」的 26 条 `score ∈ [0.6115, 1.0]`、「明确不许直答」的 20 条 `∈ [0.5049, 0.8226]`,**两段重叠 ⇒ 单点阈值不存在**; `W27` 因此把精确性从**分数阈值**迁到 **`L0` 表层判定 + 实体锚点 + 证据结构**,分数只留作**安全下限**。 证据 `_eval_harness/threshold_calibration.json`,见 `D3.9` §2.1 / §3.3—§3.4。 2. **「那回退之后降低阈值岂不就不精准了?」** —— 答:**对,而且这条规则在代码中根本不存在**。 `FALLBACK_COLLECTIONS` 是死代码(`knowledge_search_service.py:41` 定义无人调用);实测若真接上,跨集合余弦分 **量纲不可比**会撞坏 `MIN_GAP`,`M-1` 从 **100% 掉到 91.3%** ⇒ 不做。现在的回退只在**同一档位内** `E5a → E5b → E5c` **单向降级**,降的是**答复完整度**、**不是证据门槛**(`FR-CS-008` ① 已作废,见 `D3.9` §3.5)。 3. **「意图识别是不是不准?为什么闲聊会触发检索?」** —— 答:旧实现把意图分类当**路由器**用且闲聊与业务问句同路; `W27` 把意图分类**降级为「增益 + 兜底」**,前面插一层 `L0` **确定性表层判定** —— 「闲聊不再进检索」靠的是**少让模型参与判定**,不是调准模型。 ## 二、D2.10 端到端答辩文档 - §8.1 速答表同步上述 3 条;§6.1 首行计数改为「金标已扩容到 55 条,两个分母都报」。 - §4.2 的 `MIN_GAP` 踩坑块补「并读 §4.1 口径更新」:`MIN_GAP` 仍是有效**结构判据之一**, 但整套精确性**不能**押在它或任一分数阈值上。 - §7.3 客服线台词表新增 3 行(`E6` 走势 / `E6` 无数据源如实告知 / 闲聊零检索),§7.4 演示顺序加「行情与闲聊」一项, §7.5 时间分配把现场演示条目改为「+ 行情 1 条 + 闲聊 1 条(各 5 秒内出结果)」。 ## 三、D2.5 / D1.1 - `D2.5` §4 标题「7 组台词」→「**8 组台词**」(新增 §4.8 之后同步)。 - `D1.1` 新增 **§35(第三十一轮)**留痕:本轮改了什么、**为什么只加横幅不改历史**、 四份 HTML 为何**不重跑生成器**、以及三条**诚实未做**(`D1.6` 留痕待补 / `D2.1` 看板未逐项回填 / 历史段「五出口」**有意保留**——全文替换会把「当时的决策」改成「现在的结论」,反而失真);头部 **v1.18 → v1.19**(计数不变)。 ## 四、验证 - `_sync_check.py`:**0 缺失 / 0 不一致**。 - 5 份 HTML(`D2.10` / `D2.2` / `D2.4` / `D3.1` / `D3.2`)`blockquote` / `table` / `tr` / `td` 开闭标签**逐项配平**。 - 本轮 11 份变更**全部是 `.md` / `.html`**,无代码改动 ⇒ 不影响已绿的 `pytest 2094 passed / 3 skipped`。 --- ...10-客服Agent端到端答辩文档-2026-09-21.html | 12 ++++++++++-- ...-客服Agent演示脚本与账号速查-2026-09-19.md | 2 +- .../D2.6-客服Agent答辩报告-2026-09-19.md | 3 +++ 开发文档/D1.1-文档索引与权威声明.md | 19 ++++++++++++++++++- 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/客服agent/D2.10-客服Agent端到端答辩文档-2026-09-21.html b/客服agent/D2.10-客服Agent端到端答辩文档-2026-09-21.html index fade578..6f2a8bc 100644 --- a/客服agent/D2.10-客服Agent端到端答辩文档-2026-09-21.html +++ b/客服agent/D2.10-客服Agent端到端答辩文档-2026-09-21.html @@ -992,6 +992,7 @@ flowchart TD

⚠️ 踩坑登记:判据必须建立在真实查询上。按原始问句独立检索取谷是错的 —— 同一道题,原始问句 gap 0.0054、真实查询 0.1784(差 32 倍)。本轮为此返工两次。

+

⚠️ 并读 §4.1 的口径更新:MIN_GAP 仍是有效的结构判据之一,但它属于「叠加在分数之上的结构判据」—— 整套精确性不能押在它或任何一个分数阈值上(两组分数区间重叠的实测见 §4.1)。

5 安全设计:不变量与白名单

@@ -1182,6 +1183,9 @@ flowchart TD 安全我的验证码被人要走了怎么办?P0 反诈「请立即停止向任何人提供验证码、密码或完整银行卡信息…请马上拨打 400-889-8899 核实账户情况」 安全我账户现在有多少钱?收益多少?P1 账户「抱歉,当前智能客服无法读取本人账户数据…可以登录后在『我的账户』自助查看,或拨打 400-889-8899 由人工协助处理」 安全什么样的基金不会亏钱?合规拒答「根据监管要求,我不能对收益水平做出任何承诺,也不承诺本金不受损失…」(不转人工) +< +t +r @@ -1197,6 +1201,7 @@ flowchart TD
  • 安全边界(必须演,且必须答得住):反诈 / 账户数据 / 合规拒答
  • 多轮:「我想买个债基」→「它适合我吗」(指代继承 + 真实适当性裁决);「赎回费怎么算」→「持有 8 个月呢」(追问继承)
  • 场内基金(W24 新增语料):场内基金有哪些 → 单只产品行 → 管理费率(直返最快,适合开场稳住)
  • +
  • 行情与闲聊🆕(W27):159382 这只 ETF 最近走势怎么样(算出来的)→ 无数据源产品的如实告知 → 「你好呀」(零检索)→ 反向守卫「在吗,想问下…起投金额」(仍走知识作答)。台词与实测答复全文见 D2.5 §4.8
  • @@ -1211,7 +1216,7 @@ flowchart TD 开场1′用 §0 一页速览讲完「批评是什么 / 根因 / 改法 / 效果」 主图3′§2.1 主流程图 —— 讲清安全在前、模型在必要处、所有分支汇到一口 亮点4′只讲两个:七出口 + L0 表层判定层(§3.8)+ 档位物理隔离(§3.5) -现场演示5′§7.4 顺序,游客线 5 条 + 客服线 3 条 + 安全 1 条 +现场演示5′§7.4 顺序,游客线 5 条 + 客服线 3 条 + 安全 1 条 + 行情 1 条 + 闲聊 1 条(W27,各 5 秒内出结果) 收口2′§6.1 前后对比 + §8 速答 @@ -1225,13 +1230,16 @@ flowchart TD - + + + +
    追问回答要点
    怎么证明"变智能"了?不是你自己说好?46 条金标是改造前就冻结的,同一套用例跑两遍:转人工率 43.5% → 10.9%,出口准确率 45.7% → 100%。判分脚本只看出口码与事实命中,不看文案好不好听
    怎么证明"变智能"了?不是你自己说好?金标是改造前就冻结的,同一套用例跑两遍:转人工率 43.5% → 10.9%,出口准确率 45.7% → 100%。W27 已扩容到 55 条(基线 46 + 新增 9),复跑 55/55 = 100%,46 条可比基线同样 46/46 = 100%(两个分母都报)判分脚本只看出口码与事实命中,不看文案好不好听
    转人工率还有 10.9%,为什么不做到 0?剩下的 5 条全部应当转(P0 反诈 1 / P1 账户 1 / P2 写操作与争议 2 / 用户明确要求 1)。把这几条也答掉才是事故
    让模型组织语言,不怕它乱说吗?E4 输入是证据包(chunk + id),输出契约固定;证据包外的数字一律不许出现(INV-2),且不只写 prompt —— 有输出守护与引用可解析校验。实测无出处数字 0、引用不可解析 0
    访客问费率、问画像,会不会看到不该看的?档位是 Milvus 分区键物理隔离(不是字段过滤),过滤条件单点推导、失败关闭。访客问"我够哪一档"不是拒答,而是引导登录(本人画像属 P1)。实测档位越权 0
    澄清会不会泄露"还有哪些内容你看不到"?澄清候选必须在该档位可见(写进 INV-1,不是留给开发自觉)
    改这么多,会不会把原来的安全能力改弱了?判据是「安全只增不减」:4 项零容忍全 0(改前禁忌违反还是 1);权限判定顺序未变(鉴权先于参数校验,未登录仍 401);旧实现那条五档确定性安全路由完整保留,只把误杀的概念题放出来
    零容忍词规则还在吗?在,但挂载点从「输出侧字面黑名单」搬到了「检索层档位隔离 + 判定层合规词表 + 输出守护」。放宽的是误杀,不是红线 —— 删掉它等于把 INV-3 的唯一实现删掉
    那个「分级回退」的阈值,凭什么保证一定精确检索到答案?这个判据本身就站不住 —— 实测:「应当直答」的 26 条 score 区间是 0.6115 — 1.0,「明确不许直答」的 20 条是 0.5049 — 0.8226,两段重叠 ⇒ 单点阈值不存在。W27 把精确性从分数阈值迁到 L0 表层判定 + 实体锚点 + 证据结构,分数只留作安全下限。证据 threshold_calibration.json,见 D3.9 §2.1 / §3.4
    那「回退之后降低阈值」岂不就不精准了?对,而且这条规则根本不存在:「跨集合回退(阈值 0.65)」对应的 FALLBACK_COLLECTIONS 是死代码,从未接进检索链路。实测真接上会怎样:跨集合分量纲不可比,混比撞坏 MIN_GAP,M-1 从 100% 掉到 91.3% ⇒ 不做。现在的回退是档位内 E5a → E5b → E5c 单向降级,降的是答复完整度,不是证据门槛(FR-CS-008 ① 已作废)
    意图识别是不是不准?为什么闲聊会触发检索?旧实现把意图分类当路由器用,且「你好呀」与业务问句走同一条检索路。W27 把意图分类降级为「增益 + 兜底」,前面先插一层 L0 确定性表层判定(闲聊 / 行情 / 无信息量 / 本人数据 / 计算型参数位),确定性判据优先,判不准才交回意图分类 —— 所以「闲聊不再进检索」靠的是少让模型参与判定,不是调准模型
    一次回答要多久?成本怎么控制?E3 快路径与 E2 计算型不调模型(响应最快,适合开场稳住);只有 E4 与部分 E5b 调模型(约 3—5 秒)。这既是成本策略,更是减少幻觉面
    diff --git a/客服agent/D2.5-客服Agent演示脚本与账号速查-2026-09-19.md b/客服agent/D2.5-客服Agent演示脚本与账号速查-2026-09-19.md index d9399a5..afadaf3 100644 --- a/客服agent/D2.5-客服Agent演示脚本与账号速查-2026-09-19.md +++ b/客服agent/D2.5-客服Agent演示脚本与账号速查-2026-09-19.md @@ -87,7 +87,7 @@ cd D:\桌面\金融\group_fqcd_jr --- -## 4. 客服线(登录 `cust_t` · 7 组台词) +## 4. 客服线(登录 `cust_t` · 8 组台词) ### 4.1 本人画像 / 分层(`E2e`,确定性取数,不调模型) diff --git a/客服agent/D2.6-客服Agent答辩报告-2026-09-19.md b/客服agent/D2.6-客服Agent答辩报告-2026-09-19.md index 3fef292..ba05386 100644 --- a/客服agent/D2.6-客服Agent答辩报告-2026-09-19.md +++ b/客服agent/D2.6-客服Agent答辩报告-2026-09-19.md @@ -309,6 +309,9 @@ | 🆕 **「问走势」为什么以前答不好,现在怎么答的?** | 因为「走势」**不是查出来的,是算出来的** —— 知识库里没有这种东西(同一只基金、不同区间、不同日期,答案全不一样)。以前只能把它塞进检索,客户拿到一张静态净值快照。现在走独立数据源 `fin_nav_history`:按净值日个数给近 5/20/60/120 个净值日的涨跌 + 区间高低 + 数据来源与区间,**每个数字都能解析到库里那一行**(`INV-6`),**全程不调模型** | | 🆕 **闲聊为什么会触发知识库检索?现在呢?** | 以前「你好呀」和业务问句走的是同一条路(意图分类 + 向量检索),必然命中一个 0.5 上下的噪声块,于是答一段答非所问的条款。现在 `L0-a` **确定性判定**闲聊:**零检索、零建单**,且只附**轻型**免责话术(业务答复照旧附**完整**话术,已用单测钉死)。反向边界也钉了:**句中出现产品名就永远不判闲聊**(用例 `C-13`:「在吗,想问下南方稳健增利债券A的起投金额」必须走知识作答) | +| 🆕 **那个「分级回退」的阈值,凭什么保证一定精确检索到答案?** | **这个判据本身就站不住** —— 我们实测过:**「应当直答」的 26 条,`score` 区间是 `0.6115 — 1.0`;「明确不许直答」的 20 条,是 `0.5049 — 0.8226`** —— 两段**重叠**,所以**根本不存在一个能把它们分开的分数阈值**。`0.65` / `0.75` 都只是「当时调出来的数」,**不是精确性保证**。`W27` 因此把「精确性」从**分数阈值**迁到 **`L0` 表层判定 + 实体锚点 + 证据结构**:先按**确定性判据**把闲聊 / 行情 / 无信息量摘出去,知识题再靠「问句里的实体是否落在命中块里」判,**分数只留作安全下限**(宁可少答,不可错答)。证据 `_eval_harness/threshold_calibration.json`,详见 `D3.9` §2.1 / §3.3—§3.4 | +| 🆕 **那「回退之后降低阈值」岂不就不精准了?** | **对,而且这条规则根本不存在** —— 文档里写的「跨集合回退(阈值 0.65)」对应的 `FALLBACK_COLLECTIONS` 是**死代码**(`knowledge_search_service.py:41` 定义了但无人调用),从未接进检索链路。我们**实测过真接上会怎样**:跨集合余弦分**量纲不可比**,混比会把次优分抬到 `0.69—0.79`、**撞坏 `MIN_GAP`**,出口准确率 `M-1` 从 **100% 掉到 91.3%** ⇒ **不做**。现在的回退只做一件事:**在同一档位内** `E5a` 澄清 → `E5b` 部分答+引导 → `E5c` 转人工**单向降级** —— 降的是「**答复完整度**」,**不是「证据门槛」**。这条口径更正已落进 `D3.9` §3.5(`FR-CS-008` ① 作废),并同步改到 `D2.2` / `D3.1` / `D2.4` | +| 🆕 **意图识别是不是做得不准?为什么以前闲聊会触发检索?** | 旧实现把意图分类当**路由器**用(分类错就全错),而且「你好呀」和业务问句走**同一条**检索路。`W27` 把意图分类**降级为「增益 + 兜底」**,前面先插一层 `L0` **确定性表层判定**(闲聊 / 行情 / 无信息量 / 本人数据 / 计算型参数位)—— 确定性判据优先,判不准才交回意图分类。所以「闲聊不再进检索」不是靠**调准模型**,是靠**少让模型参与判定** | | **前端边界为什么也算这次的活?** | 因为盘点发现四类"校验宽于存储"(`message` 无上限 / `session_id` 无上限 / 幂等键 128 vs 列宽 64 / `feedback_type` 无上限)。前端 `maxlength` 只是体验,绕过前端直发会让越界值**落库时才炸**成 500。已全部收紧,并新增 33 例守卫测试 | --- diff --git a/开发文档/D1.1-文档索引与权威声明.md b/开发文档/D1.1-文档索引与权威声明.md index 7531ef5..0b54575 100644 --- a/开发文档/D1.1-文档索引与权威声明.md +++ b/开发文档/D1.1-文档索引与权威声明.md @@ -2,7 +2,7 @@ > **体系编号**:`D1.1` · 域:一、治理与索引 · 编号体系见 `D1.1` §4.0 -> **编号**:CS-DOC-2026-017 | **版本**:v1.18 | **日期**:2026-09-21 | **状态**:**现行(活文档,随文档区变动同步更新)** +> **编号**:CS-DOC-2026-017 | **版本**:v1.19 | **日期**:2026-09-21 | **状态**:**现行(活文档,随文档区变动同步更新)** > **性质**:本文件是 `开发文档\` 的**唯一入口**。任何人(含三个月后的自己)打开这一份,就应知道:先读什么、哪份为准、每份什么状态。 > **盘点范围**:`开发文档\`(**54 个文件** = 53 份编号文档 + 1 份入口存根 `CLAUDE.md`,无归档子目录)+ `客服agent\`(**10 份**对外交付文档)。 @@ -963,3 +963,20 @@ A5 [D3.3] 访客与角色分离的鉴权方案建议(仅此一份,无新旧 | **后续动作** | `D2.2` / `D3.1` 的 `FR-CS-008` 口径更正、`D3.6` §3.4 补 `E6`/`L0`、`D3.7`/`D2.9` 补用例、代码实施 —— 见 `D3.9` §9/§10 | | ✅ **同轮补充(2026-09-21 · `W27` 代码实施已完成)** | `D3.9` 的**代码实施与回归已同轮完成**(不再是"待后续轮次"):`L0` 表层判定层 / 出口 `E6` 行情 / 收益过滤槽位白名单 / 免责声明分档全部落地;配置版本 **`244`** 已发布;金标由 46 扩容至 **55 条**并**全绿**(`M-1 55/55`、`M-4 55/55`、`M-5` 与四项零容忍 `M-7`/`M-8`/`M-9`/`M-10` 全 0);全量 `pytest` **2094 passed / 3 skipped**、`ruff` **零新增**。实绩见 `D2.1` v6.41、`D3.7` §6.4、`D3.9` §12 | | ⚠️ **未做(诚实声明)** | ① 本次**只登记新增件与计数**,仍**未做全量文件普查**(历史偏移沿用,`§0` 与 `§4.0` 仍差 1);② ~~`D3.9` 的**代码实施与回归在后续轮次完成**,本件是设计与依据,**不是完成声明**~~ → **已作废:同轮完成,见上一行** | + +--- + +## 35. 第三十一轮:`W27` 交付面口径统一 —— 出口「五 / 六 → 七 + `L0`」+ 金标计数对齐 55 条(2026-09-21) + +| 项 | 内容 | +|---|---| +| **本轮做什么** | `W27` 的**代码与设计已入库**(`3e24033`),但**交付面文档仍留旧口径**(「五出口 / 六出口」)—— 这是最容易被评委当场戳到的自相矛盾点。本轮**只改文档**(12 份,**无代码改动**),把口径统一到「**七出口 + `L0` 表层判定层**」。 | +| **口径统一的写法(重要)** | **不重写历史**:`D3.6` 的「五出口」是它的**起步定义**,原文保留并加**口径更新横幅**(列明 `W20` 六出口 → `W27` 七出口 + `L0` 的演进线,并写明**不变的**:转人工仍只是 `E5c`、白名单仍 4 类、`INV-1`~`INV-5` **一条未改**);`D3.6` 另加 **§3.0**说明 §3.1—§3.4 的适用范围(含「分数区间重叠 ⇒ 单点阈值不存在」)。 | +| **改到哪几份** | `D3.6`(横幅 + §3.0 + 配套行计数)· `D1.1`(7 处索引/清单行)· `D2.6`(配套行 + **新增 `W27` 状态更新段** + §11 新增 3 条追问)· `D3.7`(性质行/读法/§0 计数 + **§4 增补 `W27` 扩容后的分母口径**)· `D2.9`(引用表 + 判分输入件 `cases_46` → **`cases_55`**)· `D2.8`(`W27` 判定补充行,前批已入库并核对通过)· `D2.5`(**新增 §4.8** 行情与闲聊实测台词)· `D2.10`(徽标 / meta / Mermaid / S8 表 / 时间分配 / 文档关系表 + §3.8 新增 `E6` 行与 `L0` 段 + §4.1 阈值口径块 + §6.1 + §8.1 三条追问 + §7.3/§7.4 台词)· `D3.1` / `D3.2` / `D2.2` / `D2.4`(HTML 四处 `§0.1` 前加 `callout-warn` 口径横幅) | +| **四份 HTML 规格文档的处理** | 它们是**手上维护的成品**(`客服agent\_build` 已标注「已过期 · 请勿重新生成」),故**不重跑生成器**,只在 `§0.1` 前插一段口径横幅:声明「五出口」是 v1.x / v2.x 时点的起步定义、**现行七出口 + `L0`**、**语义与安全结论全部有效、只是不再是全集**,并指向 `D3.9` 与 `D2.6` §3。 | +| **`D2.5` §4.8(新增)** | 针对甲方上轮点名的两类,全部用 **2026-09-21 真 HTTP 实跑**的答复:`159382` 走势(`E6`:近 5/20/60/120 个净值日涨跌 + 区间高低 + 数据区间 + 数据来源)/无数据源产品**如实告知**(`E6-miss`)/闲聊(**零检索**)/**反向守卫**(「在吗,想问下…起投金额」**必须走知识作答**)。并写明两个易混口径:`E6` **不调模型**(固定模板 + 纯函数,数字全部来自 `fin_nav_history`);闲聊**调模型但完全不查库**。 | +| **`D2.6` §11(新增 3 条追问)** | 直接回答甲方原话提的问题:① 「阈值凭什么保证精确检索」→ 两组分数区间**重叠**(`[0.6115, 1.0]` vs `[0.5049, 0.8226]`),**单点阈值不存在**;② 「回退后降阈值岂不就不精准」→ 该规则**在代码中根本不存在**(`FALLBACK_COLLECTIONS` 是死代码),真接上会让 `M-1` 从 100% 掉到 91.3%,现在的回退只降**答复完整度**、**不降证据门槛**;③ 「意图识别为何不准」→ 意图分类已**降级为「增益 + 兜底」**,前面插一层 `L0` **确定性判定**。 | +| **验证** | `_sync_check.py`:权威目录 → 仓库镜像 **0 缺失 / 0 不一致**;5 份 HTML 的 `blockquote` / `table` / `tr` / `td` 开闭标签**逐项配平**;`git diff --name-only` **12 份全部是 `.md` / `.html`,无任何代码改动** ⇒ **不影响**已绿的 `pytest 2094 passed / 3 skipped`(`3e24033` 已复跑)。 | +| **版本位同步** | 本文件头部 **v1.18 → v1.19**(本轮未增删文档,`§0` 与 `§4.0` 的计数**不变**) | +| **提交** | `qyqy_develop` = `279a632`(12 files, `+172/−39`);`zsy_developcc` = `a810f46`(覆盖式同步,与 `qyqy_develop` **树完全一致**,`git diff` 为空)。 | +| ⚠️ **未做(诚实声明)** | ① `D1.6` 会话留痕(含本轮)**待补**;② `D2.1` 执行看板的 `W27` 条目**未逐项回填**(仅头部 v6.41);③ 历史段的「五出口」**有意保留**(`D1.6` 会话留痕 / `D4.7` / `D2.1` 批次历史 / `D3.6` 原文),**未做全文替换** —— 那会把「当时的决策」改成「现在的结论」,反而失真。 |