docs(W27-2): 出口口径统一为「七出口 + L0」· D2.5 新增行情/闲聊实测台词 · 金标计数对齐 55 条

本轮只改文档(12 份,无代码改动),把 `W27` 的代码实绩(`L0` 表层判定层 + 出口 `E6` 行情)在**全部交付面文档**上对齐。
此前工程侧已入库(3e24033),但答辩面文档仍留「五出口 / 六出口」旧口径,是最容易被评委当场戳到的自相矛盾点。

## 一、口径统一:五出口 → 七出口 + `L0`
- `D3.6`(被多处引为「五出口权威定义」):加**口径更新横幅**(列明 `W20` 六出口、`W27` 七出口 + `L0` 的演进线,
  并写明「不变的」——转人工仍只是 `E5c`、白名单仍 4 类、`INV-1`~`INV-5` 一条没改);§3 标题加「起步定义」;
  **新增 §3.0**说明 §3.1—§3.4 的适用范围;本页 `D3.7` 配套行的金标计数 46→55、10→11 项指标。
- `D1.1`:7 处索引/清单行对齐(`D2.6` / `D2.10` / `D3.6` 的描述与计数),其余「五出口」全部保留为**历史记录**。
- `D2.6`:配套行补 `D3.9` 指向;**新增 `W27` 状态更新段**(金标扩容到 55 条 + 第七个出口 + 三处真缺陷修复),
  并显式声明「上一条 `W24` 的『六个出口』口径已由本条扩为七个」。
- `D3.7`:性质行/读法/§0 计数对齐(46 → 55、十项 → 十一项指标);**§4 增补 `W27` 扩容后的分母口径表**
  (`M-1`/`M-4`/`M-5`/`M-6`/`M-10` = 55、`M-2` = 33、`M-2b` = 20、`M-3` 明示「考检索的 C 组」,门槛不变)。
- `D2.9`:引用表新增 `D3.9` 行;判分输入件由 `cases_46.json` 更新为 **`cases_55.json`**(附两个分母的产物名)。
- `D2.8`:`W27` 判定补充行(前批已入库,本轮核对通过)。

## 二、HTML 规格文档:只声明口径,不重写历史
`D3.1`(需求开发文档)/ `D3.2`(知识库方案)/ `D2.2`(需求收敛版)/ `D2.4`(知识库收敛版)
四处 `§0.1` 之前各加一段 `callout-warn` 口径更新:说明「五出口」是 v1.x/v2.x 时点的**起步定义**、
现行是「七出口 + `L0`」,并明确**语义与安全结论全部有效、只是不再是全集**,指向 `D3.9` 与 `D2.6` §3。
(`_build` 已标注「已过期·请勿重新生成」,故直接在成品上改,不重跑生成器。)

## 三、`D2.10`(端到端答辩文档)
`六出口` → **七出口 + `L0`**(徽标 / meta / Mermaid / S8 表 / 时间分配 / 文档关系表,共 5 处);
§3.8 出口表**新增 `E6` 行情行**,正文补 `L0` 段落;§4.1 阈值表后**新增口径更新块**
(区间重叠 ⇒ 单点阈值不存在;阈值降为安全下限;「跨集合回退 0.65」在代码中不存在);
§6.1 标题与「两个分母都报」的实测块对齐 55 条;§11 补 `D3.9` 与 `W27` 证据文件。

## 四、`D2.5` 演示脚本(答辩当天照着念的那份)
**新增 §4.8「行情走势与闲聊」**——针对上轮被点名的两类,全部用 **2026-09-21 真 HTTP 实跑**的答复:
- `159382这只ETF最近走势怎么样?` → `E6`,给出近 5/20/60/120 个净值日涨跌 + 区间高低 + 数据区间;
- `南方稳健增利债券A最近走势怎么样?` → `E6-miss`,如实说「查不到公开的净值序列」,**拒绝编造**;
- `你好呀` / `谢谢你` / `在吗` → 闲聊,**零检索**;
- **反向守卫**「在吗,想问下南方稳健增利债券A的起投金额是多少?」→ 必须走知识作答(证明 `L0` 判的是整句);
- 附「口径细节」:`E6` **不调模型**(固定模板 + 纯函数,数字全部来自 `fin_nav_history`),
  闲聊**调模型但完全不查库**(新跑 `_w27_probe_guard.py` 单独验证反向守卫,另有 `_w27_probe_trend/chat.txt`)。
§6 表补两行(闲聊不再进检索 / 走势是算出来的),金标计数行改为 55 条并附两个分母的指标表。

## 五、验证
- `_sync_check.py`:权威目录 → 仓库镜像 **0 缺失 / 0 不一致**(13 份同步)。
- `git diff --name-only`:12 份变更**全部是 `.md` / `.html`**,**无任何代码改动** ⇒ 不影响已绿的
  `pytest 2094 passed / 3 skipped`(3e24033 已复跑)。
- 本轮实测证据保留在 `D:\桌面\金融\_w27_probe_guard.py` / `.txt`(答辩后勿删)。
This commit is contained in:
张胜宇
2026-09-21 22:43:46 +08:00
parent 3e24033f72
commit 279a6327e3
12 changed files with 172 additions and 39 deletions
@@ -319,7 +319,7 @@ hr { border: none; height: 1px; background: linear-gradient(90deg, transparent,
<header id="topbar">
<div id="topbar-title">客服 Agent 端到端答辩文档</div>
<span id="topbar-badge">v1.0 · 十段流水线 · 六出口</span>
<span id="topbar-badge">v1.1 · 十段流水线 · 七出口 + <code>L0</code> 表层判定层</span>
</header>
<main id="main">
@@ -331,7 +331,7 @@ hr { border: none; height: 1px; background: linear-gradient(90deg, transparent,
<div class="doc-meta">
<div class="doc-meta-item">
<span class="doc-meta-label">文档版本</span>
<span class="doc-meta-value">v1.0(2026-09-21)</span>
<span class="doc-meta-value">v1.1(2026-09-21 · <code>W27</code> 口径对齐)</span>
</div>
<div class="doc-meta-item">
<span class="doc-meta-label">体系编号</span>
@@ -347,7 +347,7 @@ hr { border: none; height: 1px; background: linear-gradient(90deg, transparent,
</div>
<div class="doc-meta-item">
<span class="doc-meta-label">核心口径</span>
<span class="doc-meta-value">十段流水线 · 六个出口</span>
<span class="doc-meta-value">十段流水线 · 七出口 + <code>L0</code> 表层判定层</span>
</div>
<div class="doc-meta-item">
<span class="doc-meta-label">文档密级</span>
@@ -432,7 +432,7 @@ flowchart TD
S5["S5 身份与档位边界<br/>tiers 必填无默认值<br/>缺字段集合 = 排除"]
S6["S6 意图与槽位解析<br/>多轮指代继承 · 澄清判定"]
S7["S7 检索与增强<br/>分区裁剪 → 三路召回 → 三道去重<br/>→ 证据包"]
S8{"S8 出口决策<br/>六出口分流"}
S8{"S8 出口决策<br/>七出口 + L0 分流"}
E3["E3 知识直返<br/>原文 · 零模型调用"]
E4["E4 证据约束生成<br/>只用证据包内事实"]
E1["E1 澄清<br/>候选只取本档可见"]
@@ -508,7 +508,7 @@ flowchart TD
<tr><td><strong>S5</strong> 身份与档位</td><td><code>tiers_for_roles()</code> 单点推导可查 partition 白名单</td><td><strong>失败关闭</strong>:unknown 主体 → <code>{public}</code></td></tr>
<tr><td><strong>S6</strong> 意图与槽位</td><td>意图分类 + 多轮指代继承(四级降级链)</td><td>无上文无主语 → <code>E1</code> 澄清(<strong>不是</strong>转人工)</td></tr>
<tr><td><strong>S7</strong> 检索与增强</td><td>三路召回 + 三道去重 + 父块带回 + 证据包</td><td>任一步失败 ⇒ <code>degraded=True</code>,客户<strong>看不到错误</strong></td></tr>
<tr><td><strong>S8</strong> 出口决策</td><td>按「分数 + 间隙 + 形态」分流到六出口之一</td><td><code>E5a → E5b → E5c</code> <strong>单向降级</strong>,绝不放大权限</td></tr>
<tr><td><strong>S8</strong> 出口决策</td><td>按「<code>L0</code> 表层判定 + 实体锚点 + 证据形态」分流到七出口之一(含 <code>E6</code> 行情)</td><td><code>E5a → E5b → E5c</code> <strong>单向降级</strong>,绝不放大权限</td></tr>
<tr><td><strong>S9</strong> 输出守护</td><td>零容忍词 / 收益数值净化 / 数字一致性 / 引用可解析</td><td><strong>宁可兜底,不可输出</strong>:判失败即退 <code>E5b</code></td></tr>
<tr><td><strong>S10</strong> 治理层与返回</td><td>追加免责声明 / AI 标识 / 红线二次校验;落库 → 轮询取答复</td><td>知识类来源引用未完成时<strong>不得启用</strong>(会让整个 run 失败)</td></tr>
</tbody>
@@ -822,7 +822,7 @@ flowchart LR
<h2 id="3.8-S8-出口决策">3.8 S8 出口决策</h2>
<p>这是改造的<strong>核心</strong>:把出口从 2 个扩到 6 个。每个出口各自解决一类「不智能」:</p>
<p>这是改造的<strong>核心</strong>:出口从 <strong>2 个</strong>起步,扩到 <code>E1</code>—<code>E5</code> <strong>五个</strong>;<code>W20</code> 细分 <code>E2</code> 并加 <code>E2c-my</code>(<strong>六个</strong>);<code>W27</code> 再加 <strong><code>E6</code> 行情</strong> ⇒ <strong>现行为七出口</strong>。此外另加一层<strong>不产出事实</strong>的 <code>L0</code> 表层判定层。每个出口各自解决一类「不智能」:</p>
<table>
<thead><tr><th>出口</th><th>解决什么</th><th>典型问句(金标原句)</th><th>改造前</th><th>改造后</th></tr></thead>
@@ -833,11 +833,14 @@ flowchart LR
<tr><td><strong><code>E3</code></strong> 知识直返</td><td>保持确定性快路径</td><td>「七日年化是什么意思」</td><td>合规拒答</td><td>原文直返,<strong>不调模型</strong></td></tr>
<tr><td><strong><code>E4</code></strong> 证据约束生成</td><td><strong>会答</strong>:同族多块 / 组合问,组织语言而不是甩文档</td><td>「高净值客户有什么权益」</td><td>转人工</td><td>调模型,输入是<strong>证据包</strong>,输出契约固定</td></tr>
<tr><td><strong><code>E5</code></strong> 分级回退</td><td><strong>收口</strong>:逐级降级而不是一步跳到转人工</td><td>「r1 到 r5 分别代表什么」</td><td>转人工</td><td><code>E5b</code> 以已检索到的证据作部分作答 + 引导</td></tr>
<tr><td><strong><code>E6</code></strong> 行情(<code>W27</code> 新增)</td><td><strong>会算走势</strong>:走势是<strong>算出来的</strong>,不是某一句能检索到的</td><td>「159382这只ETF最近走势怎么样?」</td><td>只回一张<strong>静态净值快照</strong>(问走势却拿不到区间涨跌)</td><td>近 5/20/60/120 个净值日涨跌 + 区间高低 + 数据来源与区间,<strong>不调模型</strong>、每个数字来自 <code>fin_nav_history</code></td></tr>
</tbody>
</table>
<p><code>E2</code> 族细分(探针 / 评测用):<code>E2a</code> 类别费率试算 · <code>E2b</code> 单只产品赎回费 · <code>E2c</code> <code>C</code>—<code>R</code> 通用匹配规则 · <code>E2d</code> 适当性裁决(产品风险等级 × 客户档案等级)· <code>E2e</code> 本人画像分层。</p>
<p><strong><code>L0</code> 表层判定层(出口码 <code>E0</code>,<code>W27</code> 新增)</strong>:位置在<strong>确定性安全路由之后、意图分类之前</strong>,只做<strong>路由判定</strong>、<strong>不产出任何事实</strong>,判不准就交回主路径。<code>W27</code> 新增三条 —— <code>L0-a</code> 闲聊寒暄(<strong>零检索</strong>,但会调模型生成话术)、<code>L0-b</code> 行情走势(→ <code>E6</code>)、<code>L0-e</code> 无信息量短句(纯符号 / 表情,<strong>既不查库也不调模型</strong>);另有既有的 <code>L0-c</code> 本人数据与 <code>L0-d</code> 计算型参数位。<strong><code>L0</code> 不得越过安全红线</strong>:「有人让我把验证码给他,顺便说说走势」仍必须走 <code>P0</code> 反诈。</p>
<blockquote class="callout-design">
<p><strong><code>E2e</code> 为什么算「计算型」而不是「查库」</strong>:它的答案来自<strong>权威字段</strong>(受控画像位),取到后<strong>不调模型</strong>直接作答 —— 与「费率取档位内可见 chunk 再算」是同一模式:<strong>纯函数 + 参数来源受控</strong>。</p>
<p><strong><code>E2</code> 为什么重要</strong>:「买 10 万要交多少手续费」<strong>永远不可能</strong>是一份文档里的一句话,向量检索对它<strong>结构性失效</strong>。这类题在答辩现场被问到的概率很高。</p>
@@ -972,6 +975,10 @@ flowchart TD
</tbody>
</table>
<blockquote class="callout-warn">
<p>🔴 <strong>口径更新(<code>W27</code>):阈值只作<strong>安全下限</strong>,不再作主判据。</strong>实测发现「应直答」与「不许直答」两组的分数区间<strong>重叠</strong>(<code>[0.6115, 1.0]</code> vs <code>[0.5049, 0.8226]</code>)⇒ <strong>单点阈值不存在</strong>。因此 <code>W27</code> 把「精确性」从<strong>分数阈值</strong>迁到 <strong><code>L0</code> 表层判定 + 实体锚点 + 证据结构</strong>,阈值降级为兜底安全线。另:「跨集合回退(阈值 0.65)」在本版<strong>代码中根本不存在</strong>(<code>FALLBACK_COLLECTIONS</code> 是死代码),跨集合混比会把 <code>M-1</code> 从 100% 拉到 91.3% —— 更正见 <code>D3.9</code> §3.4 / §3.5。</p>
</blockquote>
<h2 id="4.2-MIN_GAP-为什么是-0.07">4.2 <code>MIN_GAP = 0.07</code> 是实测标定出来的,不是拍的</h2>
<table>
@@ -1053,7 +1060,7 @@ flowchart TD
<h1 id="6-实测效果与门禁">6 实测效果与门禁</h1>
<h2 id="6.1-金标-11-项前后对比">6.1 46 条金标 · 11 项指标(修复前 → 修复后)</h2>
<h2 id="6.1-金标-11-项前后对比">6.1 金标 55 条(基线 46 + <code>W27</code> 扩容 9)· 11 项指标(修复前 → 修复后)</h2>
<blockquote class="callout-info">
<p>金标集是<strong>改造前就冻结的</strong>(<code>D3.7</code>),同一套用例、同一台机器跑两遍。判分脚本<strong>只看出口码与事实命中,不看文案好不好听</strong>。</p>
@@ -1076,6 +1083,10 @@ flowchart TD
</tbody>
</table>
<blockquote class="callout-info">
<p><strong><code>W27</code> 扩容后的口径(两个分母都报)</strong>:上表是<strong>基线 46 条</strong>的可比口径。金标在 <code>W27</code> 扩容到 <strong>55 条</strong>后复跑 —— <code>M-1</code> <strong>55/55 = 100%</strong>(46 条可比基线仍 <strong>46/46 = 100%</strong>)、<code>M-2</code> 30/33 = 90.9%、<code>M-2b</code> 17/20 = 85.0%、<code>M-4</code> <strong>55/55 = 100%</strong>、<code>M-6</code> <strong>5/55 = 9.1%</strong>,<code>M-5</code> / <code>M-7</code> / <code>M-8</code> / <code>M-9</code> / <code>M-10</code> 全部为 <strong>0</strong>。(<code>W27</code> 追加的 9 条是 <code>Q-01</code>—<code>Q-05</code> / <code>C-10</code>—<code>C-13</code>,其中 <code>Q-05</code> 与 <code>C-13</code> 是<strong>反向守卫</strong>。)</p>
</blockquote>
<p><strong>剩下 5 条转人工,逐条查过,全部应当转</strong>:</p>
<table>
@@ -1199,7 +1210,7 @@ flowchart TD
<tbody>
<tr><td>开场</td><td>1′</td><td>用 §0 一页速览讲完「批评是什么 / 根因 / 改法 / 效果」</td></tr>
<tr><td>主图</td><td>3′</td><td>§2.1 主流程图 —— 讲清<strong>安全在前、模型在必要处、所有分支汇到一口</strong></td></tr>
<tr><td>亮点</td><td>4′</td><td>只讲两个:<strong>六出口</strong>(§3.8)+ <strong>档位物理隔离</strong>(§3.5)</td></tr>
<tr><td>亮点</td><td>4′</td><td>只讲两个:<strong>七出口 + <code>L0</code> 表层判定层</strong>(§3.8)+ <strong>档位物理隔离</strong>(§3.5)</td></tr>
<tr><td>现场演示</td><td>5′</td><td>§7.4 顺序,游客线 5 条 + 客服线 3 条 + 安全 1 条</td></tr>
<tr><td>收口</td><td>2′</td><td>§6.1 前后对比 + §8 速答</td></tr>
</tbody>
@@ -1323,12 +1334,13 @@ flowchart TD
<table>
<thead><tr><th>文档</th><th>它回答的问题</th><th>本文与它的关系</th></tr></thead>
<tbody>
<tr><td><code>D2.6</code> 客服 Agent 答辩报告</td><td>凭什么说改好了?</td><td>本文<strong>承接其结论</strong>(六出口 / 不变量 / 前后对比),不重复论证</td></tr>
<tr><td><code>D2.6</code> 客服 Agent 答辩报告</td><td>凭什么说改好了?</td><td>本文<strong>承接其结论</strong>(七出口 + <code>L0</code> / 不变量 / 前后对比),不重复论证</td></tr>
<tr><td><code>D2.8</code> RAG 全链路与选型说明</td><td>知识库这条链路怎么走的?</td><td>本文承接其 §7—§9(在线检索与判定),<strong>并把它挂到完整的端到端链路上</strong></td></tr>
<tr><td><code>D2.5</code> 演示脚本与账号速查</td><td>当天照着念什么?</td><td>本文 §7 摘其要点;<strong>台词以 <code>D2.5</code> 为准</strong>,两处不重复维护</td></tr>
<tr><td><code>D2.7</code> 中长期记忆与画像联动</td><td>Agent 跟画像什么关系?</td><td>本文 §5.2 引其不变量与主设计主张</td></tr>
<tr><td><code>D2.9</code> 手动对话测试用例</td><td>逐条怎么问、答什么?</td><td>本文 §7 的实测答复源自它,<strong>逐条可问的完整版在 <code>D2.9</code></strong></td></tr>
<tr><td><code>D3.6</code> 智能增强架构建议</td><td>为什么是这五个出口?</td><td>本文 §3.8 的上游依据(含代码取证)</td></tr>
<tr><td><code>D3.6</code> 智能增强架构建议</td><td>为什么是这五个出口?</td><td>本文 §3.8 的上游依据(含代码取证)。<strong>其 <code>E1</code>—<code>E5</code> 为起步定义</strong></td></tr>
<tr><td><code>D3.9</code> 智能路由与行情出口设计</td><td>为什么变成七出口?<code>E6</code> 与 <code>L0</code> 怎么回事?</td><td><strong>现行出口口径以此件为准</strong>:<code>L0</code> 表层判定层、出口 <code>E6</code> 行情、阈值不可分的实测、<code>FR-CS-008</code> 口径更正</td></tr>
<tr><td><code>D3.7</code> 金标集与判分规则</td><td>怎么判分?</td><td>本文 §6.1 的指标定义出处</td></tr>
<tr><td><code>D5.1</code> 业务流程 MVP 最终交付</td><td>业务怎么跑?</td><td>本文 §5.4 三条红线的出处</td></tr>
<tr><td><code>D7.5</code> 答辩须知</td><td>答辩怎么答?</td><td>本文的结构按其要求组织(15 分钟 / 优先思路与尝试 / 必问主观题)</td></tr>
@@ -1340,8 +1352,8 @@ flowchart TD
<table>
<thead><tr><th>事项</th><th>落点</th></tr></thead>
<tbody>
<tr><td>金标判分结果</td><td><code>_eval_harness/score_w25.json</code> / <code>result_w25.json</code>(46 条出口与检索命中明细)</td></tr>
<tr><td>真 HTTP 答复原文</td><td><code>_w25_http_manual.json</code> / <code>.txt</code>(46 条金标 + 11 条边界 + 安全 4 条 + 场内基金 5 条)</td></tr>
<tr><td>金标判分结果(<strong>最新</strong>)</td><td><code>_eval_harness/score_w27d_55.json</code> / <code>score_w27d_46.json</code> / <code>result_w27c.json</code>(<strong>55 条</strong>;46 条为可比基线)。历轮 <code>score_w25.json</code> / <code>result_w25.json</code>(46 条)保留可对照</td></tr>
<tr><td>真 HTTP 答复原文</td><td><code>_w25_http_manual.json</code> / <code>.txt</code>(46 条金标 + 11 条边界 + 安全 4 条 + 场内基金 5 条);<code>W27</code> 新增 <code>_w27_probe_trend.txt</code> / <code>_w27_probe_chat.txt</code> / <code>_w27_probe_guard.txt</code> / <code>_w27_probe_visitor.txt</code>(行情 / 闲聊 / 反向守卫 / 访客线)</td></tr>
<tr><td>切片件与块数</td><td><code>knowledge/_chunks.jsonl</code>(<strong>755 块</strong>)</td></tr>
<tr><td>Milvus 实库快照</td><td><code>docs/evidence/knowledge-collections.json</code></td></tr>
<tr><td>阈值标定</td><td><code>docs/evidence/20260919-t9-threshold-calibration.json</code></td></tr>
@@ -350,6 +350,13 @@ hr { border: none; height: 1px; background: linear-gradient(90deg, transparent,
<!-- ==================== 0 ==================== -->
<h1 id="0.-文档定位与阅读指引">0. 文档定位与阅读指引</h1>
<blockquote class="callout-warn">
<p>🔴 <strong>口径更新(2026-09-21 <code>W27</code>)</strong>:本文写于 v1.x / v2.x 时点,其中 <strong>「五出口(<code>E1</code>—<code>E5</code>)」是当时的起步定义</strong>,此后经两轮扩充 —— ① <code>W20</code> 把 <code>E2</code> 细分为 <code>E2a</code>—<code>E2e</code> 并新增 <code>E2c-my</code>(六出口);② <code>W27</code> 新增 <strong>出口 <code>E6</code> 行情</strong>(走势 / 净值 / 涨跌,独立数据源 <code>fin_nav_history</code>)与 <strong><code>L0</code> 表层判定层</strong>(出口码 <code>E0</code>;<strong>不产出任何事实</strong>,只做路由前置判定)。⇒ <strong>现行口径为「七出口 + <code>L0</code>」</strong>。</p>
<p>本文的出口<strong>语义</strong>(澄清 / 计算 / 知识直返 / 证据约束生成 / 分级回退)与<strong>安全结论</strong>(<code>INV-1</code>~<code>INV-5</code>、转人工白名单 4 类、档位物理隔离)<strong>全部有效,只是出口不再是全集</strong>;「精确性」的判据亦已由<strong>分数阈值</strong>迁到 <strong>实体锚点 + 证据结构</strong>(阈值降级为安全下限),并更正了「跨集合回退(阈值 0.65)」这一条口径。</p>
<p>完善口径与实测以 <code>开发文档\D3.9-客服Agent智能路由与行情出口设计-2026-09-21.md</code> 为准;出口决策链的验收侧口径见 <code>客服agent\D2.6-客服Agent答辩报告-2026-09-19.md</code> §3。</p>
</blockquote>
<h2 id="0.1-文档目的与范围">0.1 文档目的与范围</h2>
<p>本文档是《南方基金·智能服务系统》<strong>智能客服 Agent</strong> 的<strong>需求文档</strong>,回答「<strong>要做什么、为谁做、边界在哪、做到什么程度算通过</strong>」。<strong>不含</strong>实施排期(见《客服 Agent 开发计划》)、逐项任务清单(见《客服 Agent 执行 Todolist》)与知识库专项设计(见《客服 Agent 知识库设计方案》)。</p>
@@ -427,6 +427,13 @@ hr { border: none; height: 1px; background: linear-gradient(90deg, transparent,
<!-- ==================== 0 ==================== -->
<h1 id="0.-文档定位与阅读指引">0. 文档定位与阅读指引</h1>
<blockquote class="callout-warn">
<p>🔴 <strong>口径更新(2026-09-21 <code>W27</code>)</strong>:本文写于 v1.x / v2.x 时点,其中 <strong>「五出口(<code>E1</code>—<code>E5</code>)」是当时的起步定义</strong>,此后经两轮扩充 —— ① <code>W20</code> 把 <code>E2</code> 细分为 <code>E2a</code>—<code>E2e</code> 并新增 <code>E2c-my</code>(六出口);② <code>W27</code> 新增 <strong>出口 <code>E6</code> 行情</strong>(走势 / 净值 / 涨跌,独立数据源 <code>fin_nav_history</code>)与 <strong><code>L0</code> 表层判定层</strong>(出口码 <code>E0</code>;<strong>不产出任何事实</strong>,只做路由前置判定)。⇒ <strong>现行口径为「七出口 + <code>L0</code>」</strong>。</p>
<p>本文的出口<strong>语义</strong>(澄清 / 计算 / 知识直返 / 证据约束生成 / 分级回退)与<strong>安全结论</strong>(<code>INV-1</code>~<code>INV-5</code>、转人工白名单 4 类、档位物理隔离)<strong>全部有效,只是出口不再是全集</strong>;「精确性」的判据亦已由<strong>分数阈值</strong>迁到 <strong>实体锚点 + 证据结构</strong>(阈值降级为安全下限),并更正了「跨集合回退(阈值 0.65)」这一条口径。</p>
<p>完善口径与实测以 <code>开发文档\D3.9-客服Agent智能路由与行情出口设计-2026-09-21.md</code> 为准;出口决策链的验收侧口径见 <code>客服agent\D2.6-客服Agent答辩报告-2026-09-19.md</code> §3。</p>
</blockquote>
<h2 id="0.1-目的与范围">0.1 目的与范围</h2>
<p>本文档是<strong>客服 Agent 检索子模块</strong>的专项设计,回答「<strong>知识怎么组织、谁能看到哪一档、怎么保证看不错</strong>」。核心命题一句话:<strong>把权限边界从提示词层搬到数据层 + 检索层,使其在结构上不可绕过。</strong></p>
@@ -180,6 +180,28 @@ cd D:\桌面\金融\group_fqcd_jr
> 适合开场第 1—2 条用来"稳住";第 5 条走 `E4` 会调模型,约 3—5 秒。
### 4.8 行情走势与闲聊(`W27` 新增 · 现场最容易被打「不智能」的两类)
> **为什么单列一组**:这两类正是答辩老师上一轮直接点名的 —— ① 「问某只基金的走势」以前答不到点上(会掉进知识检索、答成产品手册里的一张静态快照);② 「闲聊」以前会**误触发知识检索**,甚至兜底转人工。
> `W27` 为此加了两件事:**`L0` 表层判定层**(**不产出任何事实**,只做路由前置判定)与 **出口 `E6` 行情**。设计与实测见 `开发文档\D3.9-客服Agent智能路由与行情出口设计-2026-09-21.md`;本表每一条都是 **2026-09-21 真 HTTP 实跑**(`_w27_probe_trend` / `_w27_probe_chat` / `_w27_probe_guard`)。
| # | 台词 | 实测出口 | 实测答复(节选) |
|---|---|---|---|
| 1 | 159382这只ETF最近走势怎么样? | **`E6` 行情** | 「创业板人工智能ETF南方(159382 · SZSE)净值走势 — 最新净值 2.584100(2026-09-11)— 近 5 个净值日 **-2.97%**(2.663300 → 2.584100)/ 近 20 个 **-9.31%** / 近 60 个 **-23.07%** / 近 120 个 **+16.00%** — 区间最高 3.393700(2026-06-25)|最低 2.208100(2026-03-31)— 数据来源 `fin_nav_history`,数据区间 2026-03-23—2026-09-11,共 120 个净值日」 |
| 2 | 南方稳健增利债券A最近走势怎么样? | **`E6` 未命中(`E6-miss`)** | 「我这边**查不到公开的净值序列**,所以给不出走势(**这类数据不能靠推测**)。如果您问的是产品手册里的示例产品,我可以按手册告诉你它的风险等级、起投金额与费率」 |
| 3 | 你好呀 / 谢谢你 / 在吗 | **闲聊**(**零检索**) | 「您好,我是南方基金智能客服。请问有什么基金、理财或账户问题可以帮您?」(同一句会从话术池里换着说,**多问几遍听到的不完全一样**属正常) |
| 4 | 在吗,想问下南方稳健增利债券A的起投金额是多少? | **反向守卫**:必须走知识作答 | 「南方稳健增利债券 A〔示例〕:起投金额 1,000 元」(**不会被前台那句「在吗」带进闲聊**;这一条是用来证明 `L0` 判的是**整句**、不是**开头两个字**) |
> ⚠️ **`E6` 的数据边界要主动讲**(讲了是加分项,不讲会被追问):`E6` 只覆盖库里**有净值序列的 20 只场内基金**(`fin_nav_history`,每只 122—160 个净值日)。
> 产品手册里的示例产品(`南方稳健增利债券A`、`季季盈90天`)**不在库里、也没有净值序列**,所以**必然**走第 2 条那个「查不到」的诚实口径 ——
> **这不是答不上来,是拒绝编造**。金标里的两条反向守卫就是这件事:`Q-05`(「净值怎么算」这类**定义题**不许被行情出口抢走,必须回知识库)与 `C-13`(**含产品名**的问句**永不判闲聊**)—— 见 `D3.9` §12.3。
> **口径细节(被追问时用)**:`E6` **不调模型**,走固定模板 + 纯函数 `summarize_trend()`,**每个数字都来自 `fin_nav_history`**(这是安全不变量 `INV-6` 的落地),所以**响应最快**;区间按**净值日个数**(5/20/60/120)而非自然日。
> 闲聊**调模型**(发布配置里的闲聊提示词 `customer_service_chitchat`)但**完全不查知识库** —— 「不查库」和「不用模型」是两件事,别混着说。
> 另有一类 `L0-e` 无信息量短句(纯「?」「……」),直接走轻量澄清,**既不查库也不调模型**(`D3.9` §3.3)。
> **可念的一句话**:「走势是**算出来的**(近 5/20/60/120 个净值日的涨跌 + 区间高低 + 数据区间),不是我背下来的;库里没有净值序列的产品,我宁可说查不到,也不会替它编一个走势。」
---
## 5. 排障表
@@ -205,8 +227,21 @@ cd D:\桌面\金融\group_fqcd_jr
| 答不上来 → **兜底转人工** | `E5b` 部分答 + 引导 | **「连续 2 轮兜底」已删除**,转人工收敛为 4 类白名单 |
| 回答靠「捡一句最像的原文」 | 证据约束生成 `E4` | 只用证据包内事实、数字必须能溯源、输出侧二次校验 |
| 分档/身份不看 | 出口按档位裁剪、回退**不跨档位** | `D-01`/`D-04` + `E5` 共用档位映射 |
| 闲聊(「你好呀」「谢谢你」)→ **误触发知识检索** | 闲聊话术,**零检索** | `L0-a` 表层判定(不产出事实,只做前置路由判定) |
| 「某只基金的走势怎么样」→ 答成一张静态产品卡 | 直接**算**区间涨跌(`E6` 行情) | 纯函数 `summarize_trend()` + `fin_nav_history`,**不调模型**、每个数字可溯源 |
**46 条金标 11 项指标全达标**(`M-1` 100% 46/46、`M-4` 100%、四项零容忍 = 0),细节见 `D3.7` §6 与 `D1.6` §4.28~§4.32。
**55 条金标 11 项指标全达标**(`W27` 把金标从 46 条扩容到 55 条)。
| 指标 | 55 条 | 46 条(可比基线) |
|---|---|---|
| `M-1` 出口准确率 | **100%**(55/55) | **100%**(46/46) |
| `M-2` Top1 命中 | 90.9%(30/33) | 90.3%(28/31) |
| `M-2b` 难例 | 85.0%(17/20) | 83.3%(15/18) |
| `M-4` 事实正确率 | **100%** | **100%** |
| `M-6` 转人工 | 9.1%(5/55) | 10.9%(5/46) |
| `M-3`/`M-5`/`M-7`/`M-8`/`M-9`/`M-10` | 见 `D3.7` §6 | — |
转人工 5 条**全部落在白名单内**(`F-05` / `G-01` / `G-03` / `G-04` / `G-05`)—— 「白名单外零转人工」这条仍然成立。细节见 `D3.7` §6、`D3.9` §6 与 `D1.6` §4.28~§4.32。
---
@@ -216,7 +251,9 @@ cd D:\桌面\金融\group_fqcd_jr
|---|---|
| 本文对应的 Todolist 项 | `D2.1` 批次 F:`F-03` / `F-04` / `A-05` |
| 台词证据(真 HTTP 原始答复) | `group_fqcd_jr/docs/evidence/20260919-t8-demo-lines.json`(17 条)、`20260919-t8-demo-lines2.json`(5 条) |
| 出口定义与判分规则 | `D3.7-客服Agent评测金标集与判分规则`、`D3.6-客服Agent智能增强架构建议` |
| 出口定义与判分规则 | `D3.7-客服Agent评测金标集与判分规则`、`D3.6-客服Agent智能增强架构建议`(`E1`—`E5` **原始定义**,历史件) |
| **出口现行口径(七出口 + `L0`)与 `E6` 行情设计** | `开发文档\D3.9-客服Agent智能路由与行情出口设计-2026-09-21.md`(**口径以此件为准**) |
| 本文 §4.8 的实测原始答复 | `_w27_probe_trend.txt` / `_w27_probe_chat.txt` / `_w27_probe_guard.txt`(`D:\桌面\金融\`,**答辩后勿删**) |
| **演示一键启动** | `group_fqcd_jr\demo.ps1` + `group_fqcd_jr\启动演示.bat`(五项目检口径与本文 §1 **完全一致**) |
| **答辩后立刻做**:模型密钥轮换 | `D3.8-模型密钥轮换与凭据安全操作手册-2026-09-20.md`(工具 `tools/rotate_api_keys.py`) |
| 会话记录 | `D1.6-对话上下文提取与开工前补充决策` 对应轮次 |
@@ -4,11 +4,21 @@
> **读者**:答辩评委 + 答辩当天操作演示的人 + 三个月后的自己。
> **性质**:本报告回答**一个**问题 —— 「答辩老师批评这个客服 Agent **不智能、动不动就转人工**,凭什么说现在改好了?」
> **口径**:本文所有数字均为**真机实测**(`_eval_harness` 46 条金标 + `http_probe` 全链路 + `e2e_smoke_test` 宽链路冒烟 + 12 条真机边界用例),**修复前基线如实并列**,不修饰。
> **配套**:架构依据 `D3.6`(五出口 + 安全不变量);判分规则 `D3.7`(46 条金标 / 10 项指标 / 4 项零容忍);演示脚本与账号 `D2.5`;执行看板 `D2.1`;密钥轮换 `D3.8`;会话留痕 `D1.6` §4.36 与 §4.37—§4.39。
> **配套**:架构依据 `D3.6`(五出口**起步定义**)+ **`D3.9`(现行七出口 + `L0` 表层判定层)**;判分规则 `D3.7`(**基线 46 条 + `W27` 扩容 9 条 = 55 条金标** / 11 项指标 / 4 项零容忍);演示脚本与账号 `D2.5`;执行看板 `D2.1`;密钥轮换 `D3.8`;会话留痕 `D1.6` §4.36 与 §4.37—§4.39。
> **状态更新(2026-09-20 · `W12`/`W13`)**:本文的**结论与金标数字全部不变**(金标仍是同一套用例、同一台机器)。但有三处外部事实需要并读:① **投顾模块已随合并恢复**(组员新功能取代「整体清除」,见 `D4.5` 顶部状态更新与 `D4.7`)—— 对本客服 Agent 的能力与门禁**无影响**;② 权威文档目录(`客服agent\` 24 份 / `开发文档\` 52 份)**已入库**,全量回归在其后复跑(**1909 passed / 3 skipped**,见 §6.3);③ 增加了**模型密钥轮换工具** `tools/rotate_api_keys.py`(操作手册 `D3.8`),§10 第 4 项由「手工 4 步」升级为「跑一个脚本」。
> **状态更新(2026-09-21 · `W24`)**:本文**结论与金标数字仍然不变**(`M-1 46/46` / `M-4 46/46` / `M-6 5/46` / 四项零容忍全 0)。新增两件与答辩直接相关的事实:① **`docs/43` 场内基金产品手册已入库**(20 只场内基金:13 ETF + 7 LOF),切片件 **702 → 755 块**,四集合已重建重灌 —— 此前「问在库的产品却答另一只」的根因(语料里根本没有这批产品)**已根除**;② 出口在 `E1`—`E5` 基础上**细分出 `E2c-my`(本人画像分层)** ⇒ 当前实现共 **六个出口**(`E1` 澄清 / `E2` 计算型(内含 `E2a`—`E2e`)/ `E2c-my` / `E3` 知识直返 / `E4` 证据约束生成 / `E5` 分级回退),**转人工只发生在 `E5` 的第三档 `E5c`**。被问到「几个出口」时答「**六个出口,转人工只是 `E5` 里最小的那一档**」。详见 `D2.1` `v6.39`、`D4.8` §10。
> **状态更新(2026-09-21 · `W27`)**:本文**结论与基线数字仍然不变**(46 条可比基线仍是 `M-1 46/46` / `M-4 46/46` / `M-6 5/46` / 四项零容忍全 0)。本轮做了两件与此前**性质不同**的事,答辩时值得主动讲:
> ① **新增出口 `E6` 行情**:问「这只基金最近走势怎么样」过去只能拿到一张**静态净值快照**(因为知识库里根本没有「走势」这种东西 —— 它是**算出来的**,同一只基金、不同区间、不同日期答案全不一样)。现在走独立数据源 `fin_nav_history`,**不调模型**,按净值日个数(5/20/60/120)给区间涨跌与区间高低。**当前实现的出口数 = 七个**(`E1` / `E2`(含 `E2a`—`E2e`)/ `E2c-my` / `E3` / `E4` / `E5` / `E6`),另有一个**不产出事实**的 `L0` 表层判定层(出口码 `E0`)。
> ② **新增 `L0` 表层判定层**:把**闲聊**与**行情**这两类本可确定性判定的问法,从「靠检索分数碰运气」里拿出来。此前客户说「你好呀」会被丢进向量检索、命中一个 0.5 上下的噪声块,然后收到一段答非所问的条款;现在闲聊**零检索、零建单**,且只附**轻型**免责话术(业务答复仍附**完整**话术)。
> ③ **金标扩容 46 → 55**(新增 `Q` 组行情 5 条 + `C` 组闲聊 4 条),**全绿**:`M-1 55/55`、`M-4 55/55`、`M-5` 与四项零容忍全 0。被问到「几个出口」时答「**七个,另有 `L0` 表层判定层;转人工仍然只是 `E5` 里最小的那一档 `E5c`**」。详见 `D2.1` `v6.41`、`D3.9`(设计专册)、`D3.7` §6.4。
>
> **状态更新(2026-09-20 · `W19` · 演示前最后一次全量核验)**:本文**结论未变**,新增一次**演示前实测**(见 §6.4)与两项**已知边界**(见 §10 第 8/9 条)。另:原「建议 B(`embedding` 端点唯一性配置守卫)留到演示后做」**已于本轮闭环**(`app\service\model_gateway.py` + 2 条单测);`D-1`(**分层体系与门槛属公开宣传口径**,`D2.4` v1.7)与 `D-3`(**`M-2b` 分母统一为 18**,`D3.7` §3)**已落进文档**。
> **状态更新(2026-09-21 · `W27` · 金标扩容 + 第七个出口)**:本文的**根因分析与改法全部不变**,但有两处**必须并读的新增** ——
> ① 金标已从 **46 条扩容到 55 条**(新增 `Q-01`—`Q-05` / `C-10`—`C-13`,其中 `Q-05` / `C-13` 是**反向守卫**),复跑结果:`M-1` **55/55 = 100%**(**46 条可比基线仍 46/46 = 100%**)/ `M-4` **55/55 = 100%** / `M-6` **5/55 = 9.1%**(转人工 5 条**仍全部落在白名单内**)/ `M-5`·`M-7`·`M-8`·`M-9`·`M-10` 全 **0**;
> ② 出口在六个的基础上**再加 `E6` 行情**(走势 / 净值 / 涨跌,独立数据源 `fin_nav_history`,**不调模型**),并新增一层 **`L0` 表层判定层**(`L0-a` 闲聊 / `L0-b` 行情 / `L0-e` 无信息量;**不产出任何事实**,只做路由前置判定)⇒ **现行共七个出口 + `L0`**,详见 §3 与 `开发文档\D3.9`。
> ⚠️ **上一条 `W24` 状态更新里「当前实现共六个出口」的口径已由本条扩为「七个」**;`W24` 的其余事实(场内基金入库、`755` 块)仍然有效。
> 本轮同时修掉三处**真缺陷**(不是文档问题):`P0` 反诈正则的 6 字窗口漏判「验证码**被人要走了**」、`P1` 账户问句缺「我+账户+多少钱」模式、`P2` 写操作只覆盖「动词在前」语序 —— 逐条实测与修复见 `D3.9` §12.4。
---
@@ -75,7 +85,7 @@
---
## 3. 方案:五出口决策链
## 3. 方案:出口决策链(起步 `E1`—`E5`;现为**七出口** + `L0` 表层判定层)
```
① 确定性安全路由(P0 反诈 → 注入 → 合规 → P1 账户数据 → P2 写操作)
@@ -93,7 +103,7 @@
E5a 澄清 → E5b 部分答+引导 → E5c 转人工
```
**五个出口各自解决哪一类"不智能"**:
**五个原始出口(`E1`—`E5`)各自解决哪一类"不智能"**:
| 出口 | 解决什么 | 典型问句(金标原句) | 改造前 | 改造后 |
|---|---|---|---|---|
@@ -107,6 +117,23 @@
> 📌 **`E2e` 为什么算"计算型"而不是"查库"**:它的答案来自**权威字段**(`query_customer_profile` 的受控画像位),取到后**不调模型**直接作答 —— 与"费率取档位内可见 chunk 再算"是同一模式:**纯函数 + 参数来源受控**。
**🆕 `W27` 追加:`L0` 表层判定层 + 出口 `E6`**
```
⓪ L0 表层判定(W27 新增;位于安全路由之后)
├─ L0-a 闲聊寒暄 ────────────────► 闲聊出口(零检索 / 零建单 / 轻型话术)
├─ L0-b 行情走势 ────────────────► E6 行情(读 fin_nav_history,不调模型)
└─ L0-e 无信息量(纯符号/表情)──► 澄清(不查库、不建单、不调模型)
```
| 新增 | 解决什么 | 典型问句 | 改造前 | 改造后 |
|---|---|---|---|---|
| `L0` 表层判定 | **会分**:把本可确定性判定的问法从检索里摘出来 | 「你好呀」「讲个笑话」 | 落进向量检索,拿到一个 0.5 上下的噪声命中,答一段答非所问的条款 | 闲聊出口,**零检索、零建单**,只附轻型免责话术 |
| `E6` 行情 | **会算走势**:知识库里**结构性不存在**的答案,改用受控数据源 | 「159382这只ETF最近走势怎么样?」 | 只回一张静态净值快照(问「走势」却拿不到区间涨跌) | 区间涨跌(近 5/20/60/120 个净值日)+ 区间高低 + 数据来源与区间,**每个数字都来自 `fin_nav_history`** |
> 🔴 **`E6` 的边界必须主动讲**:库内只有 **20 只场内 ETF/LOF** 有净值序列,**手册里的示例产品没有**。被问到没有数据源的产品时,客服**如实说「我这边查不到公开的净值序列」**并给替代路径(按手册告诉你风险等级 / 起投金额 / 费率)—— **绝不**拿静态快照冒充走势、**绝不**猜一个数字。**知道自己的数据边界,是加分项。**
> 🔴 **`L0` 不得越过安全红线**:它的位置在安全路由**之后** —— 「有人让我把验证码给他,顺便说说走势」必须仍然走 `P0` 反诈(已实测)。这条是本轮最容易写错的地方。
---
## 4. 安全设计:不放松,反而更严
@@ -152,7 +179,7 @@
---
## 6. 效果验证:46 条金标逐项对比
## 6. 效果验证:金标逐项对比(基线 **46 条**;`W27` 扩容至 **55 条**)
### 6.1 11 项指标(修复前 → 修复后)
@@ -170,6 +197,8 @@
| `M-9` | **无出处数字数**(零容忍) | 0 | **0** | = 0 |
| `M-10` | **误拒率**(零容忍) | 0 | **0** | = 0 |
> 📌 **`W27` 增量(2026-09-21)**:金标扩容 46 → **55** 条(新增 `Q` 组行情 5 条、`C` 组闲聊 4 条),全集实测 **`M-1 55/55`、`M-4 55/55`、`M-6 5/55 = 9.1%`**,四项零容忍与 `M-5` **全 0**;上表那 46 条**逐项不变**(可比基线,见 `D3.7` §6.4 双列对照)。另外:`M-3` 的分母口径已明示为「**考检索的 C 组条目**」—— 新加的 4 条闲聊**不检索**,计入分母会把 `M-3` 从 `4/4` 稀释成 `5/8`,那是**分母被扩充**,不是召回变差。
### 6.2 剩下 5 条转人工,逐条查过,**全部应当转**
| 用例 | 问句 | 期望 | 实际 | 属于白名单第几类 |
@@ -277,6 +306,9 @@
| **澄清会不会泄露"还有哪些内容你看不到"?** | 澄清候选**必须在该档位可见**(`INV-1` 明文包含澄清话术)。这条最容易漏,所以写进了不变量而不是留给开发自觉 |
| **改这么多,会不会把原来的安全能力改弱了?** | 判据是"**安全只增不减**":4 项零容忍全 0(改前 `M-7` 还是 1);权限判定顺序未变(鉴权先于参数校验,未登录仍 401);旧实现那条"五档确定性安全路由"**完整保留**,只把误杀的概念题放出来 |
| **零容忍词规则还在吗?** | **在**,但挂载点从"输出侧字面黑名单"搬到了"检索层档位隔离 + 判定层合规词表 + 输出守护"。详见 §5 —— 放宽的是**误杀**,不是**红线** |
| 🆕 **「问走势」为什么以前答不好,现在怎么答的?** | 因为「走势」**不是查出来的,是算出来的** —— 知识库里没有这种东西(同一只基金、不同区间、不同日期,答案全不一样)。以前只能把它塞进检索,客户拿到一张静态净值快照。现在走独立数据源 `fin_nav_history`:按净值日个数给近 5/20/60/120 个净值日的涨跌 + 区间高低 + 数据来源与区间,**每个数字都能解析到库里那一行**(`INV-6`),**全程不调模型** |
| 🆕 **闲聊为什么会触发知识库检索?现在呢?** | 以前「你好呀」和业务问句走的是同一条路(意图分类 + 向量检索),必然命中一个 0.5 上下的噪声块,于是答一段答非所问的条款。现在 `L0-a` **确定性判定**闲聊:**零检索、零建单**,且只附**轻型**免责话术(业务答复照旧附**完整**话术,已用单测钉死)。反向边界也钉了:**句中出现产品名就永远不判闲聊**(用例 `C-13`:「在吗,想问下南方稳健增利债券A的起投金额」必须走知识作答) |
| **前端边界为什么也算这次的活?** | 因为盘点发现四类"校验宽于存储"(`message` 无上限 / `session_id` 无上限 / 幂等键 128 vs 列宽 64 / `feedback_type` 无上限)。前端 `maxlength` 只是体验,绕过前端直发会让越界值**落库时才炸**成 500。已全部收紧,并新增 33 例守卫测试 |
---
@@ -287,8 +319,8 @@
|---|---|
| 批评 | 客服 Agent 不智能、动不动就转人工 |
| 根因 | 决策链只有 2 个出口;10 处失败方向**全部**指向转人工 |
| 方案 | 出口 **2 → 5**(`E1` 澄清 / `E2` 计算 / `E3` 直返 / `E4` 证据约束生成 / `E5` 分级回退) |
| 方案 | 出口 **2 → 5**(`E1` 澄清 / `E2` 计算 / `E3` 直返 / `E4` 证据约束生成 / `E5` 分级回退);`W27` 再补 **`E6` 行情** + **`L0` 表层判定层**(闲聊 / 行情 / 无信息量),当前共 **七出口 + `E0`** |
| 安全 | 5 条不变量(`INV-1`—`INV-5`)+ 转人工白名单 4 类 + 档位物理隔离;**安全只增不减** |
| 效果 | 转人工率 **43.5% → 10.9%**;出口准确率 **45.7% → 100%**;事实正确率 **69.6% → 100%**;4 项零容忍**全 0** |
| 验证 | 46 条金标 11 项全达标 + **1917** 单测 0 failed(`W19` 演示前复跑)+ 31/31 宽链路冒烟 + 11/11 HTTP 探针 + 12/12 真机边界 + 门户接口 35 通过 / 0 失败 + 一键启动五项自检全过 |
| 效果 | 转人工率 **43.5% → 10.9%**;出口准确率 **45.7% → 100%**;事实正确率 **69.6% → 100%**;4 项零容忍**全 0**。`W27` 扩容后:**55/55** 出口与事实全中、转人工 **9.1%** |
| 验证 | 金标 **46 条 11 项全达标**(`W27` 扩容至 **55 条**同样全达标)+ **2094 passed / 3 skipped** 单测(`W27` 全量复跑)+ 31/31 宽链路冒烟 + 11/11 HTTP 探针 + 12/12 真机边界 + 门户接口 35 通过 / 0 失败 + 一键启动五项自检全过 |
| 纪律 | 白名单(`A-09`)+ 会签单(`A-10`,4 组)+ 零 DDL + 跨文档一致性 GATE PASS |
@@ -23,6 +23,7 @@
| **检索** | 在线八步;`visibility` 是**分区键**,档位在 **Milvus 引擎侧裁剪**,不是应用层过滤 |
| **增强** | 三路召回(向量 / 字面专有名词 / 父块带回)+ 三道去重 + 证据包构建,**共 7 个动作** |
| **判定** | 阈值 `0.75 / 0.55 / gap 0.07` → 五出口 `E1`—`E5`;**答不了可以,答错不行** |
| **判定(`W27` 补充)** | 阈值 `0.75 / 0.55 / gap 0.07` **只作安全下限**,不再作主判据(实测**区间重叠、单点阈值不存在**,见 `D3.9` §3.4);先过 `L0` 表层判定(闲聊 / 行情 / 无信息量,**不查库**),再走 `E1`—`E5`;**「走势」类问法不进检索** —— 它是算出来的,走 `E6` 读 `fin_nav_history` |
---
@@ -3,11 +3,11 @@
> **体系编号**:`D2.9` · 域:二、客服 Agent 交付件(`客服agent/`) · 编号体系见 `D1.1` §4.0
>
> **编号**:CS-MANUAL-2026-023 | **版本**:v1.4(2026-09-21 `W25` 全量复跑:46 条金标**逐条回填实测答复原文**;并修复 `A-06` 答复正文被展示层净化误删的真缺陷 —— 见 §3.1 ④) | **日期**:2026-09-20 | **状态**:**现行(活文档)**
> **性质**:**动手验收件**。它把《客服 Agent 评测金标集与判分规则》(`D3.7`)的 **46 条金标 + 五出口 + 4 项零容忍**,
> **性质**:**动手验收件**。它把《客服 Agent 评测金标集与判分规则》(`D3.7`)的 **基线 46 条 + `W27` 扩容 9 条 = 55 条金标 + 出口(`E1`—`E6`,另含 `L0` 表层判定)+ 4 项零容忍**,
> 翻译成「**你一句一句问、一眼能判对错**」的手动清单。
> **不是**需求来源、**不是**任务来源;**它不替代** `_eval_harness/`(自动化判分)——两者**同口径**:本文的「实测」列(出口 · top1)与每组后面的答复原文,直接取自**同两轮**自动化跑批。
> **读者**:要**亲自跟 Agent 对话**验收的人(本人 / 答辩老师 / 接手组员)。
> **一句话用法**:§0 上手(3 分钟)→ §2 按表逐条问(46 条,**每组表后就是本轮实测答复原文**,可逐字对照)+ §2.10 场内基金演示线(5 条)→ §3 补边界(11 条)→ §5 把结果填成 `M-1`~`M-10`。
> **一句话用法**:§0 上手(3 分钟)→ §2 按表逐条问(**55 条**,**每组表后就是本轮实测答复原文**,可逐字对照)+ §2.10 场内基金演示线(5 条)+ §2.11 行情与聊天收口(`W27` 新增 9 条)→ §3 补边界(11 条)→ §5 把结果填成 `M-1`~`M-10`。
---
@@ -941,10 +941,11 @@ PY
| 事项 | 落点 |
|---|---|
| 46 条金标与判分规则 | `D3.7-客服Agent评测金标集与判分规则-2026-09-17.md`(本文的「期望出口 / 期望要点 / 禁止出现」直接取自其 §2) |
| 五出口与安全不变量 | `D3.6-客服Agent智能增强架构建议-2026-09-17.md` §3—§4 |
| 五出口**起步定义**与安全不变量 | `D3.6-客服Agent智能增强架构建议-2026-09-17.md` §3—§4(§3 为**起步**五出口) |
| **出口现行口径(七出口 + `L0`)与 `E6` 行情设计** | `D3.9-客服Agent智能路由与行情出口设计-2026-09-21.md`(**口径以此件为准**) |
| 演示脚本与账号 | `D2.5-客服Agent演示脚本与账号速查-2026-09-19.md` |
| 知识库档位与索引口径 | `D2.4-客服Agent知识库设计方案.html`(v1.8:索引统一 `AUTOINDEX`、语料 **755 块**、四集合 `policy 288 / product 251 / faq 154 / basic 62`) |
| 自动判分输入件 | **`_eval_harness\cases_46.json`**(46 条)。**本轮(2026-09-21 `W25`)判分**:`result_w25.json`(出口与命中明细)、`score_w25.json`(十项指标);同目录另有历轮 `result_w11b/w20/w23/w24e.json` 可对照。⚠️ **路径更正(2026-09-21)**:`_eval_harness\` 与仓库 `group_fqcd_jr\` **同级**,**不在仓库里、不入库** (`probe.py` 内部自己 `sys.path.insert` + `chdir` 到仓库)。旧文写 `group_fqcd_jr/_eval_harness/...` 是**错的** —— 换台机器 clone 下来会找不到 |
| 自动判分输入件 | **`_eval_harness\cases_55.json`**(**55 条** = 基线 46 + `W27` 扩容 9)。**最新一轮(2026-09-21 `W27`)判分**:`result_w27c.json`(出口与命中明细)、`score_w27d_55.json` / `score_w27d_46.json`(**两个分母都报**);历史输入件 `cases_46.json` 与历轮 `result_w25.json`、`score_w25.json` 保留可对照;同目录另有历轮 `result_w11b/w20/w23/w24e.json` 可对照。⚠️ **路径更正(2026-09-21)**:`_eval_harness\` 与仓库 `group_fqcd_jr\` **同级**,**不在仓库里、不入库** (`probe.py` 内部自己 `sys.path.insert` + `chdir` 到仓库)。旧文写 `group_fqcd_jr/_eval_harness/...` 是**错的** —— 换台机器 clone 下来会找不到 |
| 本文 §3 实测证据(**上一轮** 2026-09-20 真 HTTP) | `_cs_manual_baseline_20260920.json`(7 条主线路)、`_cs_manual_boundary_20260920.json`(11 条边界) |
| 本文 §3.1 缺口 ① 的修复 | `app/api/schemas/agent_runs.py`(入口加 `message` 空白判据)、`tests/unit/api/test_request_validation_envelope.py`(新增回归测试) |
| 对话轮次留痕 | `D1.6` §4.46 / §4.50、`D2.1` `W25` 轮、`D1.1` §32 |
@@ -128,17 +128,17 @@ A5 [D3.3] 访客与角色分离的鉴权方案建议(仅此一份,无新旧
| **D2.3** | `客服agent\D2.3-客服Agent开发计划.html` | **v1.1** | 现行 | 🔴 前置条件 / 批次 / 会签 / 门禁 / 交付物 |
| **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.6** | `客服agent\D2.6-客服Agent答辩报告-2026-09-19.md` | 2026-09-19 | 现行 | 🔴 **答辩主文档**:批评 → 根因(2 个出口 / 10 处失败方向全指向转人工)→ 出口决策链(**起步** `E1`—`E5`;**现行七出口 + `L0`**,见其 §3)→ `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 项 |
| **D2.8** | `客服agent\D2.8-客服Agent知识库RAG全链路与选型说明-2026-09-20.md` | 2026-09-20 | 现行 | 🔴 **RAG 全链路**:解析 → 切片(叶子标题 + 表格行级子块)→ 向量化(`text-embedding-v3` / 1024 维)→ 入库七步 → 在线八步 → **检索增强 7 个动作** → 阈值与五出口 / 选型 8 项决策 26 备选 / **已知不一致与风险 5 项** |
| **D2.9** | `客服agent\D2.9-客服Agent手动对话测试用例-2026-09-20.md` | 2026-09-20(**v1.1**,2026-09-21 全链路复跑回填) | 现行 | 🔴 **动手验收件**:46 条金标**逐条可问**(问句 / 期望出口 / 期望要点 / 禁止出现 / 实测基线)+ 11 条边界 `Z` 组 / 判分四问 / `M-1`~`M-10` 手动汇总 / 真 HTTP 核验配方 / 3 项实测缺口 |
| **D2.10** | `客服agent\D2.10-客服Agent端到端答辩文档-2026-09-21.html` | **v1.0** | 现行 | 🔴 **端到端答辩文档**:**十段流水线**(入口 → 队列 → Worker → 安全路由 → 档位 → 意图 → 检索增强 → 出口 → 输出守护 → 治理返回)+ **4 张 Mermaid 图**(主流程图 / 时序图 / 安全路由 / 出口判定)+ 六出口 + `INV-1`~`INV-5` 与 `INV-M1`~`INV-M6` + 46 条金标前后对比 + 演示台词 + **必问主观题(Vibe Coding)** + 坑与教训 10 条 + 诚实未做项 10 条 |
| **D2.10** | `客服agent\D2.10-客服Agent端到端答辩文档-2026-09-21.html` | **v1.0** | 现行 | 🔴 **端到端答辩文档**:**十段流水线**(入口 → 队列 → Worker → 安全路由 → 档位 → 意图 → 检索增强 → 出口 → 输出守护 → 治理返回)+ **4 张 Mermaid 图**(主流程图 / 时序图 / 安全路由 / 出口判定)+ **七出口 + `L0` 表层判定层** + `INV-1`~`INV-5` 与 `INV-M1`~`INV-M6` + 46 条金标前后对比 + 演示台词 + **必问主观题(Vibe Coding)** + 坑与教训 10 条 + 诚实未做项 10 条 |
| **D3.1** | `开发文档\D3.1-客服Agent需求开发文档与设计方案.html` | **v2.6** | 现行 | D2.2 的**完整版**:逐条需求带证据引用与推导过程 |
| **D3.2** | `开发文档\D3.2-知识库设计方案.html` | **v1.6** | 现行 | D2.4 的**完整版**:含被收敛掉的备选方案与否决理由 |
| **D3.3** | `开发文档\D3.3-访客与角色分离的鉴权方案建议-2026-09-16.md` | CS-AUTH-2026-011 | 现行 | 🔴 鉴权专项(=开工只读 5 份之 A5):四方案 / 三不变量 / 甲乙时序 |
| **D3.4** | `开发文档\D3.4-客服Agent重构Todolist.md` | v5.1 | 底稿 | D2.1 的前身(含更细的 DoD 描述) |
| **D3.5** | `开发文档\D3.5-知识库检索升级备选方案建议-2026-09-17.md` | CS-KB-2026-020 v1.0 | 现行 | 知识库检索升级**备选方案池**(**不是**任务来源):`K-01`~`K-08` 前提风险 / `§3-A`~`§3-H` 八个升级方向 / 与 `DEC-11` 耦合的推荐组合 / 对 `D2.4`·`D2.1` 的 10 条修订建议 / 可证伪验收判据 |
| **D3.6** | `开发文档\D3.6-客服Agent智能增强架构建议-2026-09-17.md` | CS-ARCH-2026-021 **v1.1** | 现行 | 🔴 **智能增强架构(**已裁定件**)**:诊断(10 条转人工通路 / 设计有澄清与生成但未实现)/ 「智能」7 条可验收定义 / **五出口决策链** E1—E5 / 安全不变量 `INV-1`~`INV-5` / 转人工白名单 4 类 / **§9 八项决策已拍板** |
| **D3.6** | `开发文档\D3.6-客服Agent智能增强架构建议-2026-09-17.md` | CS-ARCH-2026-021 **v1.1** | 现行 | 🔴 **智能增强架构(**已裁定件**)**:诊断(10 条转人工通路 / 设计有澄清与生成但未实现)/ 「智能」7 条可验收定义 / **五出口决策链** E1—E5(**起步定义**;现行七出口 + `L0`,见 `D3.9`)/ 安全不变量 `INV-1`~`INV-5` / 转人工白名单 4 类 / **§9 八项决策已拍板** |
| **D3.7** | `开发文档\D3.7-客服Agent评测金标集与判分规则-2026-09-17.md` | CS-EVAL-2026-022 v1.0 | 现行 | 🔴 **验收依据**:46 条金标(含四要素:期望出口 / 期望证据 / 期望关键事实 / 禁止出现)+ 10 项指标 + **4 项零容忍**(禁忌·越权·无出处数字·误拒)+ 前置阻塞 `B-1`~`B-4` + 问法分级(难例 32 条) |
| **D3.8** | `开发文档\D3.8-模型密钥轮换与凭据安全操作手册-2026-09-20.md` | CS-OPS-2026-023 v1.0 | 现行 | 🔴 **答辩后当轮执行**:为什么轮换 / `.env` 5 个变量与读取方取证 / **三个 Qwen 同值 + 两个 DeepSeek 同值** / 五步流程 / 3 个坑 / 复核清单(工具 `tools/rotate_api_keys.py`) |
| **D3.9** | `开发文档\D3.9-客服Agent智能路由与行情出口设计-2026-09-21.md` | CS-ARCH-2026-024 v1.0 | 现行 | 🔴 **`W27` 设计与实施依据**:三项异议的实测根因(阈值区间重叠不可分 / 跨集合回退未实现 / 走势无数据源 / 闲聊兜底 / 收益数值黑名单可绕过)+ **`L0` 表层判定层** + **能力路由** + **出口 `E6` 行情** + 判据迁移到实体锚点 + 槽位白名单 + `INV-6`/`INV-7` + 12 项决策 |
@@ -193,11 +193,11 @@ A5 [D3.3] 访客与角色分离的鉴权方案建议(仅此一份,无新旧
| `D2.3-客服Agent开发计划.html` | **v1.1** | 2026-09-17 | 批次 / 会签 / 门禁 | 与 A1 批次号一一对应 |
| `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.6-客服Agent答辩报告-2026-09-19.md` | — | 2026-09-19 | 答辩报告(问题定义 / 根因 / **出口决策链:起步五出口 → 现行七出口 + `L0`** / 安全不变量 / 前后对比 / 现场速答) | 数字来源: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` **755 块**(2026-09-21 `W24` 复测)+ Milvus 四集合直查 |
| `D2.9-客服Agent手动对话测试用例-2026-09-20.md` | **v1.4** | 2026-09-20 | 手动对话测试用例(46 条金标逐条可问 + **每组实测答复原文** + 11 条边界 + 判分四问 + 汇总表 + §2.10 场内基金演示线) | 同口径输入件:`_eval_harness\cases_46.json` / `result_w25.json` / `score_w25.json`;答复全文:`_w25_http_manual.json` / `.txt` |
| `D2.10-客服Agent端到端答辩文档-2026-09-21.html` | **v1.0** | 2026-09-21 | 端到端答辩文档(十段流水线 + 主流程图 / 时序图 / 安全路由图 / 出口判定图;六出口;不变量;演示台词;必问主观题) | 承接 `D2.6`(结论)与 `D2.8`(RAG 链路);台词以 `D2.5` 为准;实测答复源自 `D2.9` |
| `D2.10-客服Agent端到端答辩文档-2026-09-21.html` | **v1.0** | 2026-09-21 | 端到端答辩文档(十段流水线 + 主流程图 / 时序图 / 安全路由图 / 出口判定图;**七出口 + `L0`**;不变量;演示台词;必问主观题) | 承接 `D2.6`(结论)与 `D2.8`(RAG 链路);台词以 `D2.5` 为准;实测答复源自 `D2.9` |
### 4.2 Ⅱ 开发文档区内的现行权威(9 份)
@@ -208,7 +208,7 @@ A5 [D3.3] 访客与角色分离的鉴权方案建议(仅此一份,无新旧
| `D3.2-知识库设计方案.html` | **v1.6** | A4 的**完整版**:含被收敛掉的备选方案与否决理由 |
| `D3.4-客服Agent重构Todolist.md` | v5.1 | A1 的前身(**底稿**):含更细的 DoD 描述,冲突时以 A1 为准 |
| `D3.5-知识库检索升级备选方案建议-2026-09-17.md` | CS-KB-2026-020 | 知识库检索升级**备选方案池**(**建议**,非需求/任务来源) |
| `D3.6-客服Agent智能增强架构建议-2026-09-17.md` | CS-ARCH-2026-021 **v1.1** | 智能增强架构(**§9 八项已拍板**):五出口决策链 / 安全不变量 / 转人工白名单 4 类 / 访客档计算型分项开放口径 |
| `D3.6-客服Agent智能增强架构建议-2026-09-17.md` | CS-ARCH-2026-021 **v1.1** | 智能增强架构(**§9 八项已拍板**):五出口决策链(**起步定义**;现行七出口 + `L0`,见 `D3.9`)/ 安全不变量 / 转人工白名单 4 类 / 访客档计算型分项开放口径 |
| `D3.7-客服Agent评测金标集与判分规则-2026-09-17.md` | CS-EVAL-2026-022 | **评测输入件**:46 条金标 + 判分规则 + 门槛(**验收依据**,非需求/任务来源) |
| `D3.8-模型密钥轮换与凭据安全操作手册-2026-09-20.md` | CS-OPS-2026-023 | **操作手册**:模型密钥轮换(工具 `tools/rotate_api_keys.py`)+ 复核 + 回退;**不落任何 key 值** |
| `D3.9-客服Agent智能路由与行情出口设计-2026-09-21.md` | CS-ARCH-2026-024 | **设计与实施依据**:`L0` 表层判定层 / 能力路由 / 出口 `E6` 行情 / 实体锚点判据 / 槽位白名单 / 免责声明分档;**更正 `FR-CS-008`** |
@@ -555,7 +555,7 @@ A5 [D3.3] 访客与角色分离的鉴权方案建议(仅此一份,无新旧
|---|---|---|---|
| **D1.6** | `开发文档\D1.6-对话上下文提取与开工前补充决策-2026-09-17.md` | CS-DOC-2026-019 **v1.0** | **会话上下文提取件**:回答「开工前还需你决策什么」——在 `D1.5` 的 28 项之外补登 `N-01`~`N-09`;并给出旧实现 **7 条转人工通路**的代码取证、6 处文档缺陷 `Q-1.1`~`Q-1.6`、8 项前提风险 `K-01`~`K-08` |
| **D3.5** | `开发文档\D3.5-知识库检索升级备选方案建议-2026-09-17.md` | CS-KB-2026-020 **v1.0** | **知识库专项建议(备选方案池)**:`§3-A`~`§3-H` 八个升级方向(含代价与适用条件)+ 推荐组合 + 对 `D2.4`/`D2.1` 的 10 条修订建议 + 可证伪验收判据 |
| **D3.6** | `开发文档\D3.6-客服Agent智能增强架构建议-2026-09-17.md` | CS-ARCH-2026-021 **v1.1** | 🔴 **智能增强架构(已裁定件)**:① 诊断——`handle()` **10 处**失败方向全部指向转人工;② 旧设计 §4 **本就写了**「多命中应组织语言」与澄清标记,**实现从未落地**;③ 「智能」7 条可验收定义;④ **五出口决策链** `E1`—`E5`;⑤ 安全不变量 `INV-1`~`INV-5` 与转人工白名单 4 类;⑥ **§9 八项决策已于 2026-09-17 拍板** |
| **D3.6** | `开发文档\D3.6-客服Agent智能增强架构建议-2026-09-17.md` | CS-ARCH-2026-021 **v1.1** | 🔴 **智能增强架构(已裁定件)**:① 诊断——`handle()` **10 处**失败方向全部指向转人工;② 旧设计 §4 **本就写了**「多命中应组织语言」与澄清标记,**实现从未落地**;③ 「智能」7 条可验收定义;④ **五出口决策链** `E1`—`E5`(**起步定义**,现行已扩为**七出口 + `L0`**,见 `D3.9`);⑤ 安全不变量 `INV-1`~`INV-5` 与转人工白名单 4 类;⑥ **§9 八项决策已于 2026-09-17 拍板** |
| **D3.7** | `开发文档\D3.7-客服Agent评测金标集与判分规则-2026-09-17.md` | CS-EVAL-2026-022 **v1.0** | 🔴 **评测输入件(验收依据)**:46 条金标 / 问法分级(难例 32 条)/ 10 项指标 + 4 项零容忍 / 判分规则 / 前置阻塞 `B-1`~`B-4` / 实测回填表;**核心口径:白名单外"正确地转人工"也判不合格** |
| 项 | 本轮落地 |
@@ -430,6 +430,13 @@ hr { border: none; height: 1px; background: linear-gradient(90deg, transparent,
<!-- ==================== 0 ==================== -->
<h1 id="0.-文档定位与阅读指引">0. 文档定位与阅读指引</h1>
<blockquote class="callout-warn">
<p>🔴 <strong>口径更新(2026-09-21 <code>W27</code>)</strong>:本文写于 v1.x / v2.x 时点,其中 <strong>「五出口(<code>E1</code>—<code>E5</code>)」是当时的起步定义</strong>,此后经两轮扩充 —— ① <code>W20</code> 把 <code>E2</code> 细分为 <code>E2a</code>—<code>E2e</code> 并新增 <code>E2c-my</code>(六出口);② <code>W27</code> 新增 <strong>出口 <code>E6</code> 行情</strong>(走势 / 净值 / 涨跌,独立数据源 <code>fin_nav_history</code>)与 <strong><code>L0</code> 表层判定层</strong>(出口码 <code>E0</code>;<strong>不产出任何事实</strong>,只做路由前置判定)。⇒ <strong>现行口径为「七出口 + <code>L0</code>」</strong>。</p>
<p>本文的出口<strong>语义</strong>(澄清 / 计算 / 知识直返 / 证据约束生成 / 分级回退)与<strong>安全结论</strong>(<code>INV-1</code>~<code>INV-5</code>、转人工白名单 4 类、档位物理隔离)<strong>全部有效,只是出口不再是全集</strong>;「精确性」的判据亦已由<strong>分数阈值</strong>迁到 <strong>实体锚点 + 证据结构</strong>(阈值降级为安全下限),并更正了「跨集合回退(阈值 0.65)」这一条口径。</p>
<p>完善口径与实测以 <code>开发文档\D3.9-客服Agent智能路由与行情出口设计-2026-09-21.md</code> 为准;出口决策链的验收侧口径见 <code>客服agent\D2.6-客服Agent答辩报告-2026-09-19.md</code> §3。</p>
</blockquote>
<h2 id="0.1-文档目的与范围">0.1 文档目的与范围</h2>
<p>本文档是<strong>智能客服 Agent(Customer Service Agent)</strong>的专项交付文件,将《项目开发需求文档》中分散于 Phase 1(F1.2 知识库、F1.3 客服 Agent)、§3.3 Redis 设计、§3.4 Milvus 设计、§6 接口契约、《Agent 功能设计文档》§2、《开发实施引导》Phase 1、《记忆架构设计指南》相关章节的零散要求,收敛为一份<strong>可直接进入编码的完整规格</strong>。</p>
@@ -432,6 +432,13 @@ hr { border: none; height: 1px; background: linear-gradient(90deg, transparent,
<h1 id="0.-文档定位与阅读指引">0. 文档定位与阅读指引</h1>
<blockquote class="callout-warn">
<p>🔴 <strong>口径更新(2026-09-21 <code>W27</code>)</strong>:本文写于 v1.x / v2.x 时点,其中 <strong>「五出口(<code>E1</code>—<code>E5</code>)」是当时的起步定义</strong>,此后经两轮扩充 —— ① <code>W20</code> 把 <code>E2</code> 细分为 <code>E2a</code>—<code>E2e</code> 并新增 <code>E2c-my</code>(六出口);② <code>W27</code> 新增 <strong>出口 <code>E6</code> 行情</strong>(走势 / 净值 / 涨跌,独立数据源 <code>fin_nav_history</code>)与 <strong><code>L0</code> 表层判定层</strong>(出口码 <code>E0</code>;<strong>不产出任何事实</strong>,只做路由前置判定)。⇒ <strong>现行口径为「七出口 + <code>L0</code>」</strong>。</p>
<p>本文的出口<strong>语义</strong>(澄清 / 计算 / 知识直返 / 证据约束生成 / 分级回退)与<strong>安全结论</strong>(<code>INV-1</code>~<code>INV-5</code>、转人工白名单 4 类、档位物理隔离)<strong>全部有效,只是出口不再是全集</strong>;「精确性」的判据亦已由<strong>分数阈值</strong>迁到 <strong>实体锚点 + 证据结构</strong>(阈值降级为安全下限),并更正了「跨集合回退(阈值 0.65)」这一条口径。</p>
<p>完善口径与实测以 <code>开发文档\D3.9-客服Agent智能路由与行情出口设计-2026-09-21.md</code> 为准;出口决策链的验收侧口径见 <code>客服agent\D2.6-客服Agent答辩报告-2026-09-19.md</code> §3。</p>
</blockquote>
<h2 id="0.1-文档目的与范围">0.1 文档目的与范围</h2>
<p>本文档是<strong>客服 Agent 知识库的独立设计方案</strong>,回答一个问题:<strong>在既有开发底座之上、面向访客与已登录客户两类主体,如何构建一套既能准确作答、又不会越权泄露的检索型知识库。</strong></p>
@@ -4,8 +4,16 @@
> **编号**:CS-ARCH-2026-021 | **版本**:v1.2 | **日期**:2026-09-21 | **状态**:**现行(专项建议;§9 八项已于 2026-09-17 拍板,裁定见 §9)**
> **性质**:**建议件**,**不是**需求来源、**不是**任务来源。任何一项要落地,必须先按 `D1.1` §1 的顺序修订上游(`D2.2` 需求 → `D2.4` 设计 → `D2.1` 任务),再回填 `D1.5` / `D1.6` 的决策登记表。
> **读法**:§0(结论)→ §1(为什么现在不智能,含代码取证)→ §2("智能"的 7 条可验收定义)→ §3(**五出口架构**,核心)→ §4(安全设计,不放松反而更严)→ §5(要改哪些上游条款)→ §9(需你拍板的 8 项)。
> **配套**:知识库侧的检索升级见 `D3.5`;前提风险 `K-01`~`K-08` 见 `D3.5` §2;**验收依据见 `D3.7`**(46 条金标 / 10 项指标 / 4 项零容忍)。
> **读法**:§0(结论)→ §1(为什么现在不智能,含代码取证)→ §2("智能"的 7 条可验收定义)→ §3(**五出口架构**,起步定义;**现行已扩为七出口 + `L0`**,见本页横幅)→ §4(安全设计,不放松反而更严)→ §5(要改哪些上游条款)→ §9(需你拍板的 8 项)。
> **配套**:知识库侧的检索升级见 `D3.5`;前提风险 `K-01`~`K-08` 见 `D3.5` §2;**验收依据见 `D3.7`**(**基线 46 条 + `W27` 扩容 9 条 = 55 条金标** / 11 项指标 / 4 项零容忍)。
> 🔴 **口径更新(2026-09-21 `W27`,本件之后的口径以 `D3.9` 为准)**:本件 §3 的 **五出口(`E1`—`E5`)是起步定义**,此后经两轮扩充 ——
> ① `W20` 把 `E2` 细分为 `E2a`—`E2e` 并新增 `E2c-my`(以**本人**等级为对象的可购买范围,**六出口**);
> ② `W27` 新增 **出口 `E6` 行情**(走势 / 净值 / 涨跌,**独立数据源** `fin_nav_history`),并新增 **`L0` 表层判定层**
> (`L0-a` 闲聊 / `L0-b` 行情 / `L0-c` 本人数据 / `L0-d` 计算型参数位 / `L0-e` 无信息量)—— **`L0` 不产出任何事实**,只做路由前置判定,出口码 `E0` 只作日志与审计分组名,**不写入 `CoreResult.exit_code`**。
> ⇒ **现行口径为「七出口 + `L0` 层」**:出口族 = `E1` / `E2`(含 `E2a`—`E2e`)/ `E2c-my` / `E3` / `E4` / `E5` / **`E6`**;另有安全类出口码(`P0` / `P1` / `P2` / `COMPLIANCE` / `PROMPT_INJECTION` / `ADVICE_BOUNDARY` / `E8`)与语义出口码(`CHAT` / `LOGIN` / `CONTACT`),见 `app/core/exit_codes.py`。
> **不变的**:**转人工仍然只是 `E5c` 那一档**,白名单仍是 §4.3 的 **4 类**,`INV-1`~`INV-5` **一条没改**(`W27` 另加 `INV-6` 数字可溯源 / `INV-7` 数据边界自陈,见 `D3.9` §7)。
> **本件 §3 的出口语义(澄清 / 计算 / 知识直返 / 证据约束生成 / 分级回退)全部有效,只是不再是全集。** 设计与实测以 `开发文档\D3.9-客服Agent智能路由与行情出口设计-2026-09-21.md` 为准;验收侧口径见 `客服agent\D2.6-客服Agent答辩报告-2026-09-19.md` §3。
---
@@ -99,7 +107,7 @@
---
## 3. 目标架构:五出口决策链
## 3. 目标架构:五出口决策链(**起步定义**;现行七出口 + `L0`,见本页横幅与 §3.0)
```
① 确定性安全路由(P0-P3:反诈 / 注入 / 合规 / 账户 / 写操作)
@@ -126,6 +134,17 @@
**核心变化**:转人工从「默认动作」降为**最后一档 E5c**,且只有 §4.3 的 4 类场景允许**直接**进入。
### 3.0 本节口径的适用范围(2026-09-21 补)
以下 §3.1—§3.4 逐条描述的是**起步的五个出口**。**出口码与语义仍然现行有效**,但**已不是全集**:
- **计算的细分**:`E2` 在 `W20` 拆成 `E2a`(类别费率试算)/ `E2b`(单只赎回费递进)/ `E2c`(`C—R` 匹配矩阵一格)/ `E2d`(适当性裁决)/ `E2e`(本人画像与分层),并另立 `E2c-my`(以本人等级为对象的可购买范围)。
- **新增出口**:`E6` 行情 —— 走势是**算出来的**,不是某一句能检索到的;旧实现把它塞进检索,客户只能拿到静态快照(`D3.9` §2.3 三种实测形态)。
- **新增判定层**:`L0` 表层判定(位置在**安全路由之后**、意图分类**之前**)—— 它只做**路由判定**、不产出事实;判不准就交回主路径(`D3.9` §3.1)。
- **判据迁移**:「精确性」由**分数阈值**迁到**实体锚点 + 证据结构**;阈值只作**安全下限**(`D3.9` §3.3—§3.4,含「分数区间重叠 ⇒ 单点阈值不存在」的实测)。
> 需要完整出口清单与实测时,**直接看 `D3.9`**;本件 §3 保留为**决策原文**(答辩时可讲「先定五出口、再按实测扩到七出口」这条演进线)。
### 3.1 出口 E1 澄清 —— 收益最大、成本最低
- **触发**:`needs_clarification` 真正被消费(现在没有);低分但候选集中在同一族;缺主语(`_search_query()` 已能识别 `_REFERRING_WORDS`,但当前只是拼词,没有"问回去"这条路)。
@@ -3,15 +3,16 @@
> **体系编号**:`D3.7` · 域:三、现行权威·完整版与专项 · 编号体系见 `D1.1` §4.0
> **编号**:CS-EVAL-2026-022 | **版本**:v1.1 | **日期**:2026-09-17 | **状态**:**现行(活文档:每次跑评测后回填 §6 实测列)**
> **性质**:**评测输入件**。它把 `D3.6` 的「五出口架构」变成**可证伪的验收依据**。它**不是**需求来源、**不是**任务来源。
> **读法**:§0(结论)→ §1(前置阻塞:**不修这 4 项,本集跑不了**)→ §2(46 条金标)→ §3(问法分级:哪些才是"智能"考点)→ §4(十项指标)→ §5(判分规则与门槛)→ §6(实测回填表)。
> **性质**:**评测输入件**。它把 `D3.6` 的「五出口架构」(**起步定义**;现行七出口 + `L0`,见 `D3.9`)变成**可证伪的验收依据**。它**不是**需求来源、**不是**任务来源。
> **读法**:§0(结论)→ §1(前置阻塞:**不修这 4 项,本集跑不了**)→ §2(基线 46 条 + `W27` 扩容 9 条 = 55 条金标)→ §3(问法分级:哪些才是"智能"考点)→ §4(十一项指标)→ §5(判分规则与门槛)→ §6(实测回填表)。
> **依据**:① 本仓知识源(`D6.1.1`—`D6.4.x`)与 `knowledge\_chunks.jsonl` 实测;② `D3.6`(架构)与 `D3.5`(检索);③ 公开评测规范(见 §7)。
---
## 0. 一句话结论
金标集**不是"抄 50 个问题"**,而是 **46 条带「期望出口 + 期望证据 + 期望事实 + 禁止出现」四要素的判据**,覆盖 `D3.6` 的五个出口 `E1`—`E5`,并有 **10 项可证伪指标 + 4 项零容忍红线**(禁忌 / 越权 / 无出处数字 / 引用不可解析)。
金标集**不是「抄 50 个问题」**,而是 **基线 46 条 + `W27` 扩容 9 条 = 55 条**、带「期望出口 + 期望证据 + 期望事实 + 禁止出现」四要素的判据,覆盖 `D3.6` 的五个原始出口 `E1`—`E5` **以及 `W27` 新增的 `E6` 行情与 `L0-a` 闲聊出口**,并有 **11 项可证伪指标(其中 4 项为零容忍红线)**(禁忌 / 越权 / 无出处数字 / 引用不可解析)。
> 📌 **46 条与 55 条的关系**:46 条是**可比基线**(`W7` 起口径冻结,历次复跑逐项对照);`W27` 追加的 9 条(`Q-01`—`Q-05` / `C-10`—`C-13`)考的是本轮新增能力。两个分母都报,避免「扩容后看起来变好 / 变差」的误读。
> 🔴 **最重要的一条设计原则**:**「正确地转人工」也算失败。** 除 §4.3 白名单 4 类以外,任何一条金标落到转人工,**都计为不通过**。这正是答辩老师说的"不智能"的量化口径。
@@ -191,7 +192,7 @@
---
## 4. 十项指标(含 4 项零容忍)
## 4. 十一项指标(含 4 项零容忍)
命名对齐公开评测规范(`ragas`:`Faithfulness` / `Response Relevancy` / `Context Precision` / `Context Recall` / `Noise Sensitivity` / `Tool Call Accuracy`,见 §7):
@@ -211,6 +212,8 @@
> **M-7 ~ M-10 是零容忍**:任一非零即**整体不通过**,不看加权分。理由:金融场景下"答错""越权""编数字"不可接受,与 `D3.6` `INV-2`/`INV-3` 一致。
>
> 📌 **`W27` 扩容后的分母口径(与上表并列,两个分母都报)**:上表分母是**基线 46 条口径**。金标扩容到 **55 条**后 —— `M-1` / `M-4` / `M-5` / `M-6` / `M-10` 的分母 = **55**;`M-2` 的分母 = **33**(55 条里带「期望证据家族」的条目数);`M-2b` 的分母 = **20**;`M-3` 的分母仍明示为「**考检索的 `C` 组条目**」(`W27` 给 `C` 组追加闲聊项后此组已不同质)。**门槛值不变**。实测见 §6.4。
>
> 🆕 **`M-9` 取证面补正(`W27`)**:判据是「数字**不可解析到出处**」,出处 = 检索命中的 `title`+`content` + **受控数据工具的原始载荷** + 品牌常量 + **用户原话**。`E2` 族**整体豁免**(数字是受控参数的纯函数输出,与代码里 `_ungrounded_numbers` 只作用于 `E4` 生成文本同口径)。`W27` 新增 `E6` 后,评分器补上「工具原始载荷」这一取证面并把比对改为**数值化**(`16.00%` 与载荷里的 `16.0` 是同一个数);否则行情答复里的 26 个净值数字会被整片误判 —— 那是**评分器口径**问题,不是产品缺陷。
---