张胜宇
|
d315aa61db
|
docs(W27-4c): D1.6 §14.6 表列改为「提交序列」并补 zsy 同步提交 · 桌面件去锚定哈希
- §14.6 列名 `HEAD` → `提交(按时间序)`,并加注:**上表不是当前 `HEAD`**,`zsy_developcc` 同步提交晚于 `qyqy_develop` 对应提交(内容同源、树一致)。
- `zsy_developcc` 链补 `851f074`;新增 `7b5acc9`(`W27-4b`)一行。
- 桌面件 `D:\桌面\客服Agent-对话记录与上下文提取-2026-09-21.md` §0 状态表去掉会随提交失效的哈希锚定,改为「均已推送且树完全一致 + 指向 §14.6 提交序列」。
- 目的:让两份文档**不会再因后续提交而失真**(原写法把「当时的 HEAD」当成「现在的结论」,属口径缺陷)。
|
2026-09-21 22:55:34 +08:00 |
|
张胜宇
|
7b5acc98a1
|
docs(W27-4b): D1.6 §14.6 补 W27-4 提交行与说明 · 桌面单文件版同步登记
- §14.6 提交与推送表新增 `qyqy_develop` = `8296842`(`W27-4`,1 file,`+151/−0`)一行;`zsy_developcc` 链补 `38767c8`。
- 表下新增 `W27-4` 说明:本轮把 §13/§14 补进仓库、新增桌面单文件版留痕件、`D2.6` 游离 LF 归一(**内容无变更**)。
- 桌面件 `D:\桌面\客服Agent-对话记录与上下文提取-2026-09-21.md` 同步更新:§0 状态表 HEAD 刷新为 `8296842` / `38767c8`,§2.6 末尾补「`W27-4` 收尾」段(记录本轮产出与提交)。
- EOL 校验:`D1.6` 仍为纯 CRLF、无 BOM。
|
2026-09-21 22:55:03 +08:00 |
|
张胜宇
|
82968429d3
|
docs(W27-4): D1.6 补 §13(W26 轮)与 §14(W27 轮)逐轮留痕 · 登记桌面单文件版对话记录
- §13 `W26` 轮:甲方三项异议原话逐字留痕 + 本轮实测诊断 5 条(阈值区间重叠 / `FALLBACK_COLLECTIONS` 死代码 / 走势数据源缺失 / 闲聊兜底未接路由 / 收益过滤黑名单可绕过)+ 已拍板 12 项决策表 + 下一轮先读项。
- §14 `W27` 轮:甲方原话 11 条(含中途插入的 `G-01`/`G-02`/`G-03` 裁定原文)+ 落地清单与验收 + 金标 46→55 + 修掉的 7 处真缺陷(3 处甲方点名、4 处实施中发现)+ 交付面口径统一 + 提交与推送表 + 诚实未做项 6 条 + 答辩口径速记。
- §14 顶部登记「桌面单文件版」:`D:\桌面\客服Agent-对话记录与上下文提取-2026-09-21.md`(`W21`→`W27` 全程留痕),并声明**冲突时以仓库文档为准**。
- 行尾符归一:`D1.6` 追加段统一 CRLF(全文 3634 行纯 CRLF、无 BOM);`D2.6` 5 处游离 LF 归一为 CRLF(内容与 `HEAD` 逐字节一致,无内容变更)。
|
2026-09-21 22:53:52 +08:00 |
|
张胜宇
|
be085c5f18
|
docs(W27-3): D2.6 §11 补「阈值是否可靠」三条追问 · D2.10 §8.1/§7.3/§7.4 补行情与闲聊 · D1.1 §35 留痕
承接 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`。
|
2026-09-21 22:46:16 +08:00 |
|
张胜宇
|
279a6327e3
|
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`(答辩后勿删)。
|
2026-09-21 22:43:46 +08:00 |
|
张胜宇
|
3e24033f72
|
feat(W27): L0 表层判定层 + 出口 E6 行情 + 收益过滤槽位白名单 + 免责声明分档(设计与代码同轮完成)
设计与依据:新增 D3.9-客服Agent智能路由与行情出口设计-2026-09-21.md(CS-ARCH-2026-024)
DEC-W27-1~12 全部批准并落地。
## 新增(3 个源文件 + 3 个测试文件)
- app/core/exit_codes.py:出口码注册表(E0/E1/E2a~E2e/E3/E4/E5a~E5c/E6/E8/CHAT/LOGIN/CONTACT)
+ NON_BUSINESS_EXIT_CODES 白名单(免责分档的判据面)
- app/service/fund_trend_service.py(E6):summarize_trend() 纯函数 + query_fund_trend 工具
读 fin_nav_history;按净值日个数(5/20/60/120)给区间涨跌 / 区间高低 / 来源与区间
- tests/unit/{service,tools} 新增 45 条守卫单测(E6 出口 / L0 表层判定 / 工具配置)
## 改动(重点)
- customer_service.py:
· _route_surface()(L0-a 闲聊 / L0-b 行情 / L0-e 无信息量),位置在安全路由之后
· drop_yield_claims() 重写为「入口闸 × 槽位白名单」+ fail-closed
(旧黑名单会误删权重:A-06 业绩基准公式整行消失)
· allowed_tools 补 query_fund_trend —— 修掉发布被拒 422「配置超出 Agent 工具上限」
(该 422 是**子集**校验而非数量上限,根因即此项漏配)
· 25 处 CoreResult 全部补 exit_code(AST 守卫保证零遗漏)
- customer_service_rules.py:闲聊判定重写(业务实体边界 + 词表 + 特征串 + 语气词)
+ is_low_information_message() + is_contact_inquiry()
- governance.py:免责声明按 exit_code 分档(业务档完整 / 非业务档轻型)
- actor.py:VISITOR_PERMISSIONS 补 fund:quote:read(E6 对访客开放,DEC-W27-11)
- tools/:seed_compliance_baseline 新增 TPL_DISCLAIMER_LIGHT;publish 工具改为
「从生效版本派生原列表再追加」(_inherit_tools 取不到返回 None,防静默改窄)
## 实测
- 金标扩容 46 → 55(新增 Q 组行情 5 条 + C 组闲聊 4 条)
- M-1 55/55、M-4 55/55;M-5 与四项零容忍(M-7/M-8/M-9/M-10)全 0
- 原 46 条可比基线逐项不变(46/46);M-6 9.1%(5 条全在转人工白名单内)
- 全量 pytest 2094 passed / 3 skipped;ruff 零新增(余 5 条与 HEAD 逐条对应)
- 配置版本 244(cs-tools-75813de45421)已发布并激活
## 文档
- 新增 D3.9(设计专册);D1.1 §34 补「代码实施已同轮完成」并把旧表述作废
- D3.7:新增 Q 组判据表 + §6.4 第四次实测 + M-3/M-9 口径澄清
- D2.9:新增 §2.11(9 条新增用例的实测答复原文)+ 汇总表改双列口径
- D2.1:新增 v6.41 执行条目
- 权威副本(D:\桌面\金融\)→ 仓库镜像 全量比对一致(0 缺失 / 0 不一致)
## 诚实未做项
- 知识出口(E3/E4)侧的实体锚点闸门未做(故金标扩容 9 条而非 12 条,A-11~A-13 未成集)
- 阈值未重标(D3.9 §3.4 只给方法);M-3 分母未改(仅明示口径);
D1.1 §0 与 §4.0 历史计数偏移(差 1)仍沿用
|
2026-09-21 22:32:39 +08:00 |
|
张胜宇
|
b6ec3aa699
|
docs(W26): D2.10 端到端答辩文档入库 + D1.1 索引计数同步(v1.17)
- 新增 客服agent\D2.10-客服Agent端到端答辩文档-2026-09-21.html(v1.0,域 2 续号)
十段流水线 + 4 张 Mermaid 图 + 六出口 + INV-1~INV-5 / INV-M1~INV-M6
+ 46 条金标前后对比 + 演示台词 + 必问主观题 + 坑与教训 + 诚实未做项
- D1.1 v1.16→v1.17:登记 D2.10;客服agent 9→10 份、总数 61→62 份、
域 D2 9→10、注入校验 57→58 份(客服agent\*.html 3→4)
- 权威副本(D:\桌面\金融\)→ 仓库镜像 全量比对一致(0 缺失 / 0 不一致)
|
2026-09-21 21:22:29 +08:00 |
|
张胜宇
|
35109af96f
|
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 零新增告警。
|
2026-09-21 15:27:18 +08:00 |
|
张胜宇
|
29da85d010
|
docs(W24): 交付前复核补正 + 场内基金演示线 + 一键启动端到端实跑
按甲方「按你建议的来 一次性搞定上边的建议」执行七项。
文档事实纠错(4 处,逐条实测核对后改)
- D2.4 §AC-04/AC-05:「当前 617 块全部为 public」与本文档自己的 v1.6/v1.8
版本行(public 730 / registered 25)自相矛盾 ⇒ 标「设计当时」+ 补 v1.8 现状
(755 块),写明 AC-04/AC-05 现已可证伪、不再需要「造一条测试块」
- D2.5 演示脚本:「family_id 628 块全覆盖」⇒ 755 块(W24 复测)
- D4.8 §9.2:把「集合条数 basic 105 / product 398 / faq 300 / policy 576」
当成真实条数引用 —— 那是 upsert 墓碑行被计入 get_collection_stats().row_count
的结果(同 D2.1 v6.9)。已补口径更正段,定规:引用块数一律用 _chunks.jsonl
- D2.6 答辩报告:补 W24 状态 —— docs/43 已入库(702 → 755 块);出口经
E2c-my 细分后共六个,转人工只在 E5c
演示脚本增强
- D2.5 新增 §4.7 场内基金演示线:5 条台词逐条真 HTTP 实测
· 场内基金有哪些? → 20 只清单(13 ETF + 7 LOF)
· 科创债ETF南方怎么样? → 单只产品行(R2 / 净值 101.8009)
· 南方金利定开债券A的管理费率? → 0.50%/年 + 0.15%/年
· 场内基金报价的最小变动单位? → 0.001 元
· 沪深300ETF怎么样? → E4 生成式作答,且明示「非本公司发行」
并附修复前/后对比表(修复前:命中另一只产品 / 返回 20 只整张表)
- demo.ps1 自检 2:补 fin_basic_collection ⇒ 四个集合计数(154/251/288/62=755)
_build 处置(不删,改为「把废弃做成一眼可见」)
- 与 D1.6 §4.22 四 已记录的裁定冲突(理由:删掉等于删留痕,也删掉
「为什么不能重跑」的证据)⇒ 不删
- 三个正文源 _body_kb/_body_plan/_body_requirements.html 顶部加红框
「已过期」横幅,逐文件列出已核实的滞后项(617 块全 public / 旧品牌
XX科技·400-XXX·nanfangwm ×5 / 48 条·51 项·7 个批次 / US-CS-08·FR-CS-023)
- _build\README 追加「五、2026-09-21 补记」
端到端实跑(冷启动,非 -SkipStart)
- 停掉全部服务 → 启动演示.bat(demo.ps1 -NoBrowser)⇒ 五项自检全过、rc=0
- 8 个入口 URL 全部 200(portal 首页 / 访客页 / 客户登录 / 员工登录 /
投顾工作台 / docs / openapi.json / health)
- 访客 token 真对话「科创债ETF南方怎么样?」⇒ succeeded、transfer=False、答单只产品
落档
- D2.1 v6.39 追加「交付前文档复核补正」表(7 项)+ 端到端实跑结论
- D1.6 §11.2 补 W24-8 / W24-9;§11.5 补第 5、6 条
|
2026-09-21 14:51:32 +08:00 |
|
张胜宇
|
2762b05203
|
docs(W24): 交付件口径纠错 —— D2.4 自相矛盾 / D2.5 过期块数 / D4.8 墓碑行误标 / D2.6 补 W24 状态
复核时发现四处「交付件里的事实错误」,逐条修:
- D2.4 §AC-04/AC-05 段:正文写「本仓库 _chunks.jsonl 当前 617 块全部为 public」,
与本文档自己的 v1.6/v1.8 版本行(public 730 / registered 25)自相矛盾。
改为标「设计当时」+ 补 v1.8 现状(755 块),并写明 AC-04/AC-05 现已可证伪、
不再需要「造一条测试块」(双向验证已于 2026-09-18 实测通过)。
- D2.5 演示脚本:「族判定(family_id 628 块全覆盖)」→ 755 块(W24 复测)。
这是答辩当天要照着念的稿子,块数必须与实库一致。
- D4.8 §9.2:把「新集合条数 basic 105 / product 398 / faq 300 / policy 576」
当成真实条数引用 —— 那组数字是 upsert 留下的墓碑行被计入
get_collection_stats().row_count 的结果(同 D2.1 v6.9:298/576/382 = 存活行
149/288/191 的两倍)。已补口径更正段,写明本轮复测的存活行数
251/154/288/62 = 755,并定下「引用块数一律用 _chunks.jsonl,不用 row_count」。
- D2.6 答辩报告:补一条 2026-09-21 W24 状态更新 —— ① docs/43 场内基金手册已入库
(20 只场内基金,702 → 755 块),「问在库产品却答另一只」的根因已根除;
② 出口经 E2c-my 细分后共六个(E1/E2/E2c-my/E3/E4/E5),转人工只在 E5c。
已复核:Milvus 四集合存活行数与 knowledge/_chunks.jsonl 逐集合一致(288/251/154/62 = 755),
无墓碑行残留;recalls_customer_memory 仍为 False,与 D2.7 记载一致。
D2.4 HTML 结构自检通过(table/tr/td 标签配平)。
|
2026-09-21 14:36:08 +08:00 |
|
张胜宇
|
94ce44a851
|
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)是禁令条款,故意保留
|
2026-09-21 12:26:42 +08:00 |
|
张胜宇
|
36d9ba9b9f
|
feat(W21-D1~D4): 四项待决按建议全部落地 + 1 条金标期望登记修订
按甲方 2026-09-21「按照你建议的改」批准 `D4.8` §6 四项,全部落地:
- W21-D1 生成侧禁令:`DEFAULT_EVIDENCE_SYSTEM` 红线 ② 与
`DEFAULT_EVIDENCE_TEMPLATE` 第 ④ 条同时写明「不要把收益/回报/涨幅/净值增长率的
具体数字或百分比写进答复」。红线门槛代码(`ZERO_TOLERANCE_WORDS` /
`hits_zero_tolerance` / `YIELD_METRIC_TERMS` / `drop_yield_claims`)零改动;
实测该 `prompt_code` 从未发布,改代码默认值即刻生效、无需发布流程。
3 条问句 × 3 次 = 9/9 走 `E4` 真实作答(修复前 0/9)。
- W21-D2 指代依据:`_answer_suitability` 在主语由形状反解(`inferred=True`)时
开场即「您上一轮提到的是「X」,我就按它帮您核对:」。
- W21-D3 答非所问闸门:新增产品名两种写法识别 + 前缀噪声剥离
(`_strip_product_name_lead`) + `_names_other_product`,接入 `E5b` 相关性闸门。
- W21-D4 作答语气:`PARTIAL_TEMPLATE` 改「关于这一点,公开资料里的口径是:」;
新增 `PARTIAL_FAQ_TEMPLATE`,命中块是 FAQ 问答对时直接以答案正文开场。
判据变更(知情项):`I-01`「南方科技是什么公司?」的金标期望出口由 [E5b, E3]
补入 `E4` —— 这正是提示词红线 ②(专为「名称查不到」设计)首次真正生效,
考点两条(禁忌字面不出现 / 关键事实命中)不变,见 `D4.8` §9.3。
新发现(未擅自执行,登记待决):`docs/43-场内基金产品手册(知识库入库版).md`
从未进入 `tools/build_knowledge_chunks.py` 的 `SOURCES`(702 块里「科创债」0 处),
这是「问在库的产品却答另一只」的根本原因;`W21-D3` 只是止损。
验收:金标 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;全量 1994 passed / 3 skipped;ruff 零新增;真 HTTP 11 条对照见 `D4.8` §9.4。
文档:`D4.8` v1.0→v1.1(新增 §9)、`D3.7` v1.0→v1.1(I-01 注)、
`D1.6` v1.0→v1.1(新增 §10 本轮对话上下文)、`D2.1` v6.37→v6.38、
`D2.9` v1.1→v1.2、`D1.1` v1.13→v1.14。
|
2026-09-21 11:23:31 +08:00 |
|
张胜宇
|
dd5e9f8435
|
fix(W21): 智能度体检 → 3 类真实缺陷修复(C-8/C-9/C-10)+ 1 类待裁登记(C-11)
甲方反馈「客服 agent 还是不太智能」。本轮不新增出口、不改需求,
把"不智能"拆成可复现的实测条目:81 条真实口语问法 + 8 组多轮追问链
(真 HTTP:API → 队列 → Worker → 治理层),逐条定位根因并修复。
已修复(每条都有真机 HTML 证据,见 开发文档/D4.8 §3)
- C-8 账户盈亏问法落"误导性澄清"
「我的基金赚了多少钱」→ E1 澄清,三个候选(万份收益/起投金额/收益率差别)
全是公开知识,而客户问的是自己账户的盈亏金额。
修法:P1_PATTERNS 补「第一人称 + 盈亏动词 + 金额疑问词」骨架,
金额疑问词是必要条件 —— 「我买的基金亏了怎么办」照旧走知识检索(库里有解)。
- C-9 多轮指代断链,把"已经说过的"又问一遍
「我想买个债基」→「它适合我吗」落 E2d「请告诉我具体的基金名称或代码」,
而客户刚刚才被告知是那只产品;「赎回费怎么算」→「持有 8 个月呢」同因。
两个根因:① _topic_of 只在答复前 4 行的固定形状里取主语,FAQ 型答复
(首行「问:…」)反解为空;② 意图分类把短追问标成 suitability_check,
绕开了知识出口里已做好的追问继承逻辑。
修法:_answer_suitability 建成四级降级链(严格主语 → 形状反解
_product_name_in_history → 有上文交回检索 → 首轮才澄清)+ 纯参数追问前置闸门。
安全边界三条不放宽:不给访客"能不能买"结论;推测出的名字查不到风险等级时
回落检索而非回"给不出结论";首轮指代保留澄清(金标 E-01 口径)。
- C-10 「你们投诉电话是多少」被强制转人工
根因:P2_WRITE_DISPUTE_KEYWORDS 里的裸词「投诉」子串命中,把"问投诉渠道"
和"提交投诉"撞在同一判据上;而答案就在库里(POL-SPM-036-01 / FAQ-0054)。
修法:新增 _is_p2_contact_inquiry() 作为第二类 P2 豁免(渠道词 + 疑问词,
且不带明确投诉意图)。「我要投诉,让你们经理来找我」照旧建单。
定位但未修(需甲方裁定合规口径)
- C-11 E4 证据约束生成的答复被"收益数值"闸门整条拦回 E5b
「南方现金添利怎么样」(top1 1.0000) / 「买基金要手续费吗」(0.7328) /
「债基和货基哪个收益高」(0.5457) 三条同因:生成稿出现 YIELD_METRIC_TERMS
→ hits_zero_tolerance → _exit_partial → E5b 兜底。
试过"先净化再判合规",实测更差(drop_yield_claims 整行丢弃 + 生成稿常是
单行长段 ⇒ 整条被删空),已回退并把原因写进代码注释留痕。
建议方案:改 E4 提示词禁止输出收益数值(源头消除,不动红线代码)。
待判物
- _chunks_report.txt 判定可删:无代码引用 / 内容可从 knowledge/_chunks.jsonl
复算 / 从未入库 / 统计口径已写进 D2.4 §6 与 D2.8 §2。已删 + 加 .gitignore。
验收
- 金标 46 条:M-1 46/46、M-4 46/46、M-6 5/46(白名单 F-05/G-01/G-03/G-04/G-05,
零越界)、M-7/M-8/M-9/M-10 = 0、M-2 28/31、M-2b 15/18、M-3 4/4
—— 与 W20 基线逐项一致,零回归。
- 全量回归 1985 passed / 3 skipped(W20 基线 1969 passed / 3 skipped)。
- 新增守卫单测 16 条(含 C-8 两条 / C-9 四条 / C-10 两条)。
- ruff 仅剩 4 条既有告警,未顺手改,避免混入无关 diff。
文档
- 新增 开发文档/D4.8-客服Agent智能度体检与整改报告-W21-2026-09-21.md
- 客服agent/D2.1 升 v6.37;开发文档/D1.1 升 v1.13;D1.6 增 §9 上下文提取
|
2026-09-21 10:55:16 +08:00 |
|
张胜宇
|
fc3aa67451
|
docs(W21): 四项待决按建议口径定案 + D2.9 手动用例全量复跑回填(v1.0 → v1.1)
用户 2026-09-21「按照你建议的来」⇒ DEC-W20-6 / -7 / -8 / -9 全部按最优建议
定案(人设维持语气层 / 资料变更类维持 P2 / 收益过滤只留展示层 / 金标暂不扩到
49 条),本轮无代码变更。
D2.9 手动测试用例全量复跑(路径 B · 真 HTTP):
- 46 条金标 + 11 条边界 + 安全 4 条一次跑完
- 出口 46/46、事实 46/46、禁忌 0、转人工 5 条(F-05/G-01/G-03/G-04/G-05,全在
白名单内)
- 结果直接回填 §2 的 46 个「你判」与 §5 的 11 项指标
顺带修正与登记:
- 校准 D2.9 里两处因本轮改模板而过时的出口话术(澄清 / E5b)
- 登记一处判据更正:首版跑批脚本把出口形状判成「首个期望命中即返回」,造成
13 条假阴性(事实 46/46 全中),改为「任意命中」后 46/46
- 更正 D2.9 §8 一处路径错误:_eval_harness\ 与仓库同级、不入库,旧文写成
group_fqcd_jr/_eval_harness/ 换机器会找不到
- Z-08 同会话重复模糊问句:形状已稳(三轮全落 E1 澄清,不再跳答别的题目、
不再落 chitchat),残余仅为「候选漂移」⇒ D-2 降级
- 本轮验证脚本 56 个已归档到 _w20_evidence\(逐个移动,非通配)
落档:D1.6 §4.49 六(裁定回填)/ D2.1 v6.36(+2 行)/ D1.1 §30(头部 v1.12)/
D2.9 v1.1
|
2026-09-21 09:50:14 +08:00 |
|
张胜宇
|
35effab70f
|
feat(W20): 新增 E2c-my 出口 + 展示层净化 + P2 自助流程豁免(金标零回归)
用户口径:既智能又安全,不靠"答不上就转人工";按本人画像测评列出可购买的产品,
但不引导购买。
出口由五个扩为六个:
- 新增 E2c-my:按客户本人权威测评等级给出可购买范围 + 在售清单
(只列代码/名称/类别/风险等级,按代码升序;出口后置引导词护栏,命中即降级为仅范围)
- 点名档位(「我可以买 R3 的产品吗」)先给一句直接裁决再列范围
—— 修复前只给清单,"不"字始终没说出来
- 新工具 query_eligible_products(suitability:read)+ 发布 release 220
真实业务缺陷:
- P2_SELF_SERVICE_PATTERNS:问「怎么修改绑定的银行卡」不再建单转人工(FAQ 里就有答案);
「帮我把绑定银行卡换一下」仍走 P2
- 展示层净化 render_plain / drop_yield_claims / prettify_title 接在 E3/E4/E5b/澄清四处
(E4 模型会照抄证据包的 markdown 标记)
- 空结果护栏:语料里 15 个纯收益切片被净化清空时回退 E5b,不给空气泡
测试:定向 334 passed;全量回归 1969 passed / 3 skipped / 0 failed(基线 1946);
46 条金标 M-1 46/46=100%、M-4 100%、M-6 5/46=10.9%、M-7~M-10 全 0 —— 与
score_w11b 逐项一致(零回归)。
落档:D1.6 §4.49 / D2.1 v6.36 / D1.1 §30
|
2026-09-20 18:55:22 +08:00 |
|
张胜宇
|
dc83f4f4a7
|
docs(W20): 定位「按我的风险等级能买什么」被 PROMOTION_REQUEST_PATTERNS 第4条误拦 + 五条待决登记(D1.6 4.48 / D2.1 v6.35 / D1.1 29)
|
2026-09-20 18:18:33 +08:00 |
|
张胜宇
|
172806ae36
|
docs(W19): D2.6 答辩报告同步演示前核验 + D1.6/D2.1 落档;修边界脚本自碰撞
一、D2.6 答辩报告(客服agent\D2.6)
* 新增 §6.4「演示前最后一次全量核验(W19)」:demo.ps1 五项自检全过(退出码 0)/
pytest 1917 passed / portal_api_check 35 通过 0 失败 / e2e_smoke_test 31/31 /
http_probe 11/11 / 边界 12/12 / _consistency 失效锚点 0 / check_authoritative_docs 54 无冲突 /
/internal/health/ready 三依赖全绿;并记两条可当面演示的实证(画像题有数据可依、跨主体会话隔离)。
* §6.3 两行补 W19 复跑值;§9 新增两条教训(误删文件的清理判据、边界用例标识必须每次唯一);
§10 新增两条已知边界(D-2 重复问句漂移 / D-4 英文落 E5b)并更正 M-2b 口径;
§12 一页速览的数字更新为 1917;头部新增 W19 状态更新行。
二、脚本修复
* _fe_boundary_http.py:「session_id 恰好 64」原用固定串,第二次跑必然 404
SESSION_NOT_ACCESSIBLE(访客令牌每次是新主体,会话号与主体绑定)⇒ 改为 64 字且每次唯一;
该"误撞"同时固化为用例说明(跨主体会话隔离生效)。复跑 12/12。
三、落档
* D1.6 新增 §4.47 的「演示前全量核验」与「画像题真机复验」两行;D2.1 新增 v6.34 第 12/13 条。
四、门禁
* _consistency.py exit 0;tools/check_authoritative_docs.py 54 文档无编号冲突(exit 0)。
|
2026-09-20 18:00:37 +08:00 |
|
张胜宇
|
fc4351e219
|
docs(W19): 补登画像题真机复验(fin_customer_profile 6 行,H-03/D-04 由查不到档案变为有数据可依)
|
2026-09-20 17:54:43 +08:00 |
|
张胜宇
|
d5e813b726
|
feat(model-gateway)+docs(W19): embedding 端点唯一性配置守卫 + 三份完整版/收敛版索引口径补注 + 门槛口径更正 + D3.7 难例口径统一
一、代码(2 文件 + 2 工具脚本注记)
* app/service/model_gateway.py:DatabaseModelEndpointResolver.resolve() 加配置守卫
—— required == "embedding" 且 len(matched) > 1 时 logger.warning(只告警、不改行为)。
多个 embedding 端点会让索引向量与查询向量可能来自不同模型(维度同为 1024、不报错),
COSINE 相似度整体失真,表现为"越答越差"的哑故障。顺手删掉重复的 return endpoints(死代码)。
* tests/unit/service/test_model_gateway.py:新增 2 条单测(多端点告警且返回顺序不变 / 单端点静默)。
* tools/configure_embedding_endpoint.py:加「已废弃,勿重跑」标注 —— 它写的是
qwen-embedding / qwen3.7-text-embedding-flash,与现役端点 knowledge-embedding-qwen-v3 /
text-embedding-v3 不一致,重跑会凭空多出一个 embedding 端点。
* tools/build_knowledge_chunks.py:删掉与新口径冲突的注释「不泄露档位与门槛」,
改为「registered 的依据是权益明细而非门槛;门槛属公开宣传口径」。
二、文档(8 份;D-1 选乙 + D-3 统一为 18)
* D2.4 v1.6 → v1.7:§4.4 + 附录B 更正「门槛金额不再单独构成 registered 的理由」
(public 的 FAQ-0014 已完整给出五档门槛、FAQ-0050 含钻石门槛);
HNW-004—HNW-007 保持 registered,依据收窄为"各层级权益明细";HNW-* 档位不动(分区键)。
* D3.1 v2.5 → v2.6:§5.3 加索引口径落地注(覆盖 §2.5 决策表 / FR-CS-007 / 排期 T4)
+ 补「字段表同属初稿」(实库 18 字段全 NOT NULL、doc_id 主键、无 metadata JSON)。
* D3.2 v1.2 → v1.6:§4.1 加同口径注 + 版本位追平(顶栏 v1.1 / doc-meta v1.2 落后于自身记录 v1.5)。
* D2.2 v2.6 → v2.7:§1.4.2 域 B 加注(TopK / 阈值 / 度量 / 集合选择均未变 ⇒ 不影响验收)。
* D3.7:§3 难例口径统一 —— 难例 32 条(改写 8 + 口语 16 + 多轮 4 + 禁忌 4)为定义式总数,
M-2b 分母 = 其中带期望证据家族的 18 条;并补正 §3 初稿表格条数(以 cases_46.json 为准)。
* D1.1 v1.8 → v1.9:新增 §28;四处版本位同步;顺带修正两处历史遗留
(D2.4 版本位长期停在 v1.3、D2.2 日期列停在 2026-09-17)。
* D1.6:新增 §4.47(含自我失误留痕)。
* D2.1 v6.33 → v6.34:新增本轮修订要点段。
三、实测门口(本机)
* tests/unit/service/test_model_gateway.py:10 passed
* pytest -q -p no:cacheprovider(全量,跑前已停 Worker):1917 passed / 3 skipped / 0 failed
* tools/check_authoritative_docs.py:54 文档无编号冲突(exit 0)
* _consistency.py:失效锚点 0、交叉引用全 ✅(exit 0)
* _fe_boundary_http.py(重建件):12/12 符合预期
* 服务已重启:/internal/health/ready 三依赖全绿(mysql / redis / milvus)
四、如实留痕(自我失误)
本轮清理临时文件时删除判据过宽,误删 _consistency.py(已原样恢复)、
_legacy_customer_service.py(已按 f72a545 逐字节重建,40,554 字节)、
_fe_boundary_http.py(原件不可恢复,已按既有判据重建并实跑 12/12)与若干历史轮次原始日志。
详见 D1.6 §4.47 五。
|
2026-09-20 17:53:06 +08:00 |
|
张胜宇
|
eb1822d802
|
docs(W18): D2.4 索引口径更正为 AUTOINDEX(v1.6)+ D2.9 手动对话测试用例成文 + 空白消息 500 修复
- D2.4 v1.3 -> v1.6:索引统一 AUTOINDEX(设计初稿 HNSW/IVF_FLAT 未落地,实库直查为据)
更正 9 处 + 新增 §4.1 索引口径落地注;语料 628 -> 675 块并补 fin_basic_collection 说明
(三集合仍是唯一默认检索面,basic 并入会使 M-1 100% -> 91.3%)
- 新增 客服agent/D2.9-客服Agent手动对话测试用例-2026-09-20.md:
46 条金标逐条可问 + 11 条边界 Z 组 + 判分四问 + M-1~M-10 手动汇总 + 真 HTTP 核验配方
实测登记 3 项缺口:空白消息 500(已修)/ 语料档位口径矛盾(待裁定)/ 重复问句漂移(待裁定)
- 修修复:message 纯空白 500 -> 422 AGENT_INPUT_INVALID(入口补判据 + 回归测试)
- tools/chat_console.py 提示语去掉已下线产品名(季季盈)
- 落档:D1.1 §27(60 -> 61 份 / 客服agent 8 -> 9 份 / 注入校验 56 -> 57)、D2.1 v6.33、D1.6 §4.46
- 门禁:check_authoritative_docs 通过、_consistency.py GATE PASS、pytest 1915 passed / 0 failed
|
2026-09-20 17:31:40 +08:00 |
|
张胜宇
|
921de2cfc3
|
docs(W17): 知识库 RAG 全链路与选型说明成文(D2.8)—— 按八阶段讲清解析/切片/检索增强 + 4 张流程图
新增 客服agent\D2.8-客服Agent知识库RAG全链路与选型说明-2026-09-20.md(域 2,D2.x 续号,683 行)。
- 按流程逐步:语料与解析 → 切片 → 向量化 → 存储 → 入库七步 → 在线八步 → 检索增强 7 个动作 → 阈值与五出口。
- 4 张 Mermaid 图:端到端全景 / 切片与派生字段 / 检索增强 / 出口决策树。
- 切片写透:叶子标题策略(对照三种真实情况)、表格逐行拆自解释小块(父子块)、表头 bug 与自检守卫。
- 检索增强 7 动作:向量召回 / 字面召回(专有名词,条件触发)/ 父块带回 ×0.9 / doc_id 去重 / 兄弟子块归并 / 整节块保底席位 / 证据包三种形态。
- 阈值取证:0.75/0.55/0.07/0.40/0.5,MIN_GAP 实测标定区间 (0.0649, 0.0759)。
- 选型原因:8 项决策 26 备选,逐项含否决理由与演进触发条件。
- 实测:切片件 675 块,Milvus 四集合 count(*) 150/191/288/46 与切片件逐集合一致,索引全 Finished。
- 新登记 3 项不一致(只登记不修复):① 文档写 HNSW/IVF_FLAT 而实库是 AUTOINDEX;② tools\configure_embedding_endpoint.py 会建出第二个 embedding 端点(重跑可能造成索引与查询不同模型的无声质量崩塌);③ agent_faq_synonym 表检索链路不读(术语归一化未落地)。
- 计数同步:D1.1 v1.6→v1.7,59→60 份(58→59 份编号),客服agent\ 7→8 份;§4.0 总表与 §4.1 明细各新增 D2.8 行;注入校验 55→56 份;新增 §26 轮次段。
- D2.1 标题 v6.31→v6.32;D1.6 新增 §4.45(含一处自我更正:误读旧 JSON 导致"实库缺 family_id/param_class/intent"的错误结论)。
- 本轮不改代码、未跑金标评测;门禁:check_authoritative_docs.py 通过 + _consistency.py GATE PASS。
|
2026-09-20 16:58:42 +08:00 |
|
张胜宇
|
bcedf71e12
|
docs(W16): 中长期记忆与画像联动设计成文(D2.7)—— 三问直答 / 五道闸门取证 / INV-M1~M6 / 废弃理由更正
新增 客服agent\D2.7-客服Agent中长期记忆与画像联动设计-2026-09-20.md(域 2,D2.x 续号)。
- 主设计主张:让记忆改变「系统行为」而非「模型输入」——记忆只作确定性信号(检索分区加权 / 澄清候选排序 / E2 计算入参 / 适当性过滤),永不进生成上下文(FR-CS-009 + FR-CS-049)。
- 新增记忆子域不变量 INV-M1~INV-M6(INV-M6:记忆只能收窄、不能放宽)。
- 登记两处过期理由:D2.2 §1.7 第 12 项 + 第 998 行澄清框仍引「投顾已整体清除」,而投顾已于 2026-09-20 恢复(D4.7)。
- 计数同步:D1.1 v1.5→v1.6,58→59 份(57→58 份编号),客服agent\ 6→7 份;§4.0 总表与 §4.1 明细各新增 D2.7 行;注入校验 54→55 份;新增 §25 轮次段。
- D2.1 标题 v6.30→v6.31(新增 v6.31 段);D1.6 新增 §4.44。
- 本轮不改代码、不改行为;门禁:check_authoritative_docs.py 通过(54 份无编号冲突)+ _consistency.py GATE PASS。
|
2026-09-20 16:31:29 +08:00 |
|
张胜宇
|
e28e1f3900
|
docs(W16): 落档「Agent 与用户画像关系 / 对话能否更新画像 / 中长期记忆」咨询轮 —— D2.1 v6.30 / D1.6 §4.43 / D1.1 §24 版本位
|
2026-09-20 16:25:44 +08:00 |
|
张胜宇
|
c3d57fbf3f
|
feat(cs)+docs: 修掉 P1 错分「风险测评结果」—— 画像问答改由受控工具作答(W15)
背景(用户提问触发):
§1.2.1「客户能看本人的持仓/交易/账户/画像与风评」与 §1.4.5 P1
「账户与个人数据(含风险测评结果)Agent 无权限读取」读起来互相矛盾。
实测根因(两处):
1) route_message() 在画像分支之前,且 P1_KEYWORDS 含裸词「风险测评结果」
⇒「我的风险等级是多少」走画像作答,
「我的风险测评结果是什么」被降级成「无法读取本人账户数据」
—— 同一诉求两种结论,属「能答而不答」(H-03 同类)。
2) 画像词在前、账户词在后的混问法漏网
(「我的风险测评结果和持仓一起给我」落 P3 ⇒ 只答画像、静默忽略账户诉求)。
依据(决定性):D2.2 §1.7 第 21 项「画像问答字段直返」;
D3.1 §0.3 术语表「画像问答属客服能力,与持仓查询严格区分」。
代码:
- app/core/customer_service_rules.py:P1_KEYWORDS 移除裸词 + 口径说明;
P1_PATTERNS 新增混问法守卫(第一人称 + 画像词 + 并列连词 + 账户词)。
- customer_service.py / profile_projection.py:补「投影层白名单 ⊇ 客服对话
渲染集」口径(total_asset / behavior_score / risk_tags 刻意不陈述,
渲染它们等于用画像工具绕过 P1)。
守卫:
- test_customer_service_rules.py:RT-004 → None;新增 RT-004b → P1;
SAFETY_CASES 由字面区间改显式名单(RT-004b 字母后缀会落区间外被静默漏掉)。
- test_customer_service_agent.py:画像端到端 3 条 + 混问法反向守卫。
安全不降:答案只来自 query_customer_profile(self 作用域 + 字段白名单 + 工具
审计),查不到失败关闭、绝不猜等级;P0/P2 未动、P1 其余字面未动;
混问法仍走 P1;访客问画像仍引导登录。
文档:D2.2 v2.5→v2.6 / D3.1 v2.4→v2.5 / D2.6 更正 / D4.6 追加 §3(不改正文)
/ D1.1 §24 + 版本位 / D1.6 §4.41 修正误记 + §4.42 / D2.1 v6.29。
实测:pytest 1914 passed / 3 skipped / 0 failed(+5);ruff 20(无新债);
check_authoritative_docs 54 文档无冲突;_consistency GATE PASS;
http_probe 11/11;定向真机复验 9/9;portal_api_check 35/0/5;
e2e_smoke 31/31;fe_boundary 12/12;demo.ps1 五项自检全过。
|
2026-09-20 16:22:02 +08:00 |
|
张胜宇
|
56cb15342b
|
docs(D1.1): 历史轮次里 docs/46-47 的指针补改名记录(指向 §23 的 docs/48-49)
|
2026-09-20 15:27:45 +08:00 |
|
张胜宇
|
c91bbcbdc1
|
feat(ops)+docs: 密钥轮换工具 + 两份文档目录审计收口(D1.1 §23 / D2.1 v6.26)
一、密钥轮换(新增工具 + 操作手册)
- 新增 tools/rotate_api_keys.py:--check 体检 + 交互式轮换;getpass 不回显、
自动备份 .env.bak-<时间戳>(已被 ignore 命中)、校验不过整体不写入、
三个 Qwen 变量写同一值 / 两个 DeepSeek 变量写同一值。
实测 --check:Qwen 三变量同值且非空、DeepSeek 两变量同值且非空。
- 新增 开发文档/D3.8-模型密钥轮换与凭据安全操作手册-2026-09-20.md(CS-OPS-2026-023):
.env 5 个变量与读取方取证、五步流程、3 个坑、复核清单、回退方式、能力边界。
- 口径确认:model_endpoint_config.secret_ref 存变量名 ⇒ 轮换只改 .env,不动 DB;
但必须重启 API + Worker。
二、门禁修复:docs/ 编号撞车
- tools/check_authoritative_docs.py(D3.4 N-14 登记的验收命令集之一)实测 FAIL:
我方 docs/46 docs/47(2026-09-20 建)与投顾组 docs/46-投顾Agent需求文档.md
docs/47-投顾Agent功能架构文档.md(2026-09-16 建)同号。
- 按「后到者让位」改名:docs/48-可改文件白名单.md / docs/49-底座会签申请单-2026-09-19.md,
同步 8 处引用。修复后:checked 54 documents, no number collision,exit 0。
三、前端品牌残留(W12 合并静默回退)
- employee-advisor/dashboard/index.html 与 customer/advisor-plans/index.html 的
<title> 仍是 南方财富(投顾组分支带回)→ 按 DEC-27 改为 南方基金。
- HTTP 实测两页标题已正确;全仓 app/ 复查 南方财富 = 0。
四、文档口径校准(12 处事实漂移)
- D1.1:D2.1 版本 v5.3 → v6.26(§4.0 / §4.1 / §1 / §2 四处长期错误);
§8 四行遗留项闭合(D-5 / D-6 / D-7 / 仓库副本同步)+ 新增 §22 §23 留痕;
§10.2「本区不在任何 git 仓库内」更正为已入库;新增两编号 ⇒ 计数 56 → 58 全量同步。
- D2.2:顶栏徽标 v2.4 与元数据 v2.5 自相矛盾 → 统一;「投顾已清除」→ 状态更新
(模块 2026-09-20 已恢复,但客服范围裁定 §1.7 / RK-10 不变)。
- D2.3:徽标 v1.0 · 7 批次 51 项 → v1.1 · 8 批次 57 项;投顾清除后果 + §7.1 头号风险
+ 风险表 + 不触碰行全部加恢复口径。
- D2.4:v1.3 变更说明 ⑦ / §1.4 Out of scope / Q-09 加投顾恢复口径。
- D2.5:advisor_t 自相矛盾口径改写为账号表一行 + 口径更正;五项自检首选改为
一键脚本 启动演示.bat / demo.ps1;补 D3.8 与未发布 advisor:* 白名单登记。
- D2.6:门禁数字 1856/2 → 1909/3 skipped、ruff 19 → 20、补 portal_api_check 行;
§10 两项已闭环(密钥轮换已工具化、A-10 组 3/4 已补签);头部加 W12/W13 状态更新。
- D4.5:顶部状态更新补指向 D4.7。
- 新增 开发文档/D4.7-投顾模块恢复记录-2026-09-20.md(CS-PURGE-2026-014):
时间线、8 项恢复动作、客服线不变的结论、DEC-19 理由更正、遗留 1 项、失误登记。
- _consistency.py(维护侧):§三 改为「投顾状态口径检查」,合法语境扩为
清除史 / 恢复史 / 不属本 Agent 范围。
五、回归实测(全绿)
- pytest -q:1909 passed / 3 skipped / 0 failed
- ruff check app tools tests:20(与 W12 持平,未引入新债)
- mypy app:2(= 既有基线)
- tools/check_authoritative_docs.py:54 文档无编号冲突(exit 0)
- tools/e2e_smoke_test.py --read-only:31/31
- tools/portal_api_check.py:40 项 通过 35 / 失败 0 / 跳过 5
- _eval_harness/http_probe.py:11/11 succeeded
- _consistency.py:GATE PASS
- demo.ps1 -SkipStart -NoBrowser:五项自检全过、退出码 0
- 权威副本 ↔ 仓库:逐字节一致(客服agent 24 / 开发文档 52)
六、未做(如实登记)
- 投顾 config_release 工具白名单(advisor:*)仍未发布 ⇒ 投顾 Agent 工具调用 fail closed
(实测 active_agent_tools 仅 customer_service:* 4 项 + risk:* 4 项)。与客服线无关;
要演投顾线先跑 tools/publish_advisor_demo_config.py --apply。
- 两把 key 的实际轮换需你在控制台建新 key(无法代做),流程见 D3.8。
|
2026-09-20 15:27:07 +08:00 |
|
张胜宇
|
4306326a56
|
docs: 落档本轮(演示一键启动 + 权威文档入库 + 回归复跑)
- `开发文档/D1.6` 新增 **§4.38**:本轮指令原文、`demo.ps1`/`启动演示.bat` 的职责与实测结果、
两个真实问题(PS 5.1 传参吞双引号 ⇒ 改走 stdin;终端乱码经复核是捕获侧假象)、
**权威文档入库的关键判断**(仓库内是 2026-09-16 前的过期副本 + 旧文件名,少 49 份 ⇒
按「权威覆盖过期」入库并复核零差异)、入库前密钥扫描结论、回归复跑全表、推送记录。
- `客服agent/D2.1` 升 **v6.25**:同上要点的执行看板口径,并写明「后续同步文档一律按
权威副本 -> 仓库 单向覆盖」。
- 两份文件的仓库副本与权威副本**逐字节一致**(已复核)。
回归(入库后跑):pytest 1909 passed / 3 skipped / 0 failed;ruff 20;mypy app 2;
e2e_smoke 31/31;portal_api_check 40 项 35/0/5;http_probe 11/11;_consistency GATE PASS。
|
2026-09-20 15:09:12 +08:00 |
|
张胜宇
|
bc61d5c579
|
docs: 入库权威文档目录(客服agent/ 24 份 + 开发文档/ 50 份,替换旧命名的过期副本)
## 为什么做这一步
权威文档 74 份此前**只在本机**,评审者 clone 分支后看不到任何设计文档;而仓库里那两份同名目录
是 **2026-09-16 之前的过期副本,连文件名都是旧的**(无体系编号)。本次按「**权威覆盖过期**」入库。
## 入库内容
| 目录 | 文件数 | 体积 | 说明 |
|---|---|---|---|
| `客服agent/` | 24 | 0.77 MB | `D2.1`~`D2.6` 对外交付四件套 + 演示脚本/答辩报告 + `_build` 构建工具 |
| `开发文档/` | 50 | 2.16 MB | `D1.x` 索引与决策、`D3.x` 方案、`D4.x` 清除与重构留痕、`D5.x` 业务流程、`D6.x` 业务事实基座、`D7.x` 交付物、`D8.x` 规范 |
**旧的过期副本整体移除**(`客服Agent执行Todolist.md` → `D2.1-客服Agent执行Todolist.md` 之类
的改名 + 新增 `D2.5`/`D2.6`),入库后目录内容与权威副本**逐文件一致(零差异,已复核)**。
## 入库前的安全扫描(必须留痕)
- 扫描规则:`sk-` 类密钥 / `Bearer` 长串 / `password=`、`api_key=` 赋值 / 会话中出现过的两把明文 key 片段。
- 结论:**真实密钥只出现在 `.env`**(已被 `.gitignore` 命中,未入库);`.env.example` 与
`config/risk.env.example` 只有**空占位**。
- 文档内唯一命中是 `D3.1` 里一处**截断的示例 JWT**(`Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...`),
末尾带省略号,是接口文档的示意值,**不是可用凭据**。
|
2026-09-20 15:03:15 +08:00 |
|