diff --git a/客服agent/D2.1-客服Agent执行Todolist.md b/客服agent/D2.1-客服Agent执行Todolist.md index 6eae8ad..6d4777b 100644 --- a/客服agent/D2.1-客服Agent执行Todolist.md +++ b/客服agent/D2.1-客服Agent执行Todolist.md @@ -1,4 +1,4 @@ -# 客服 Agent 执行 Todolist(执行看板 · v6.29) +# 客服 Agent 执行 Todolist(执行看板 · v6.30) > **体系编号**:`D2.1` · 域:二、对外交付 · 编号体系见 `D1.1` §4.0 @@ -46,6 +46,34 @@ **看板状态更新**:`F-3` → **✅ 已落地**(新增 4 条单测)。批次 H 剩余:`H-05`。新增待办:**三项安全路由缺口收口**(`G-01` 优先,建议排在 `H-05` 前)。 +## v6.30 本轮修订要点(2026-09-20 · `W16` 咨询轮:Agent 与用户画像的关系 / 对话能否更新画像 / 要不要做中长期记忆) + +> **触发**:用户提问「我们这个agent跟用户画像有什么关系 用户跟agent的对话能否作为更新用户画像的依据,如果可以做,是不是要做中长期记忆」。**本轮未改任何代码**,正本见 `开发文档\D1.6…md` §4.43。 + +**一、结论:Agent 对画像是「读,不写」** + +| 层 | 载体 | 客服侧 | +|---|---|---| +| 短期会话记忆 | `conversation_message` | ✅ 开 | +| 中期记忆 | `memory_unit` | ❌ 客服不写(`NO_LONG_TERM_MEMORY_AGENT_TYPES`) | +| 画像候选 | `memory_unit.status='candidate'` | ❌ 整体关闭(`PROFILE_CANDIDATE_AGENT_TYPES = frozenset()`) | +| 长期记忆召回 | `memory_unit` / `user_facts` | ❌ 关(`recalls_customer_memory=False`) | +| 画像读取 | `fin_customer_profile` | ⚠️ 字段级只读(`query_customer_profile`) | + +**二、「对话 → 画像」链路已在仓库里(不是待开发)**:`memory_unit` → `user_facts` → `fin_customer_profile` → `profile_snapshots`,门槛 `evidence ≥ 2` 或 `confidence ≥ 0.90`。卡点全在**合规裁定**。 + +**三、按字段所有权分域(不可逾越的红线)** + +- ✅ 可由对话更新:`preferred_asset_class` / `investment_horizon` / `risk_tags`(自述标签,标注来源) +- ❌ **绝对不可**:`investor_type`(风险等级)—— 只来自 `fin_risk_assessment` 问卷,代码级红线 +- ❌ 不可:`total_asset` / `trading_frequency` / `behavior_score`(交易侧所有) + +**四、发现一处过期理由**:`D2.2` §1.7 第 12 项把「**收益方(投顾)已整体清除**」列为关闭长期记忆召回的理由之一,而投顾已于 2026-09-20 恢复 ⇒ **已失效**;另一条「注入生成上下文与证据约束生成直接冲突」仍然成立。 + +**五、我的建议**:记忆**不进生成上下文**,只作**确定性信号**(检索分区加权 / 澄清候选排序 / `E2` 计算入参 / 适当性过滤)。 + +**六、待决 3 项**:① 是否打开画像候选与中期记忆(建议演示后做,只开 `preference:*` / `constraint:*` / `goal:*`,不开 3 个 PII 键);② 记忆消费是否限定为确定性信号(建议是);③ 是否更正 §1.7 第 12 项已过期的理由①(建议更正)。 + ## v6.29 本轮修订要点(2026-09-20 · `W15` 执行轮:修掉 `P1` 错分「风险测评结果」+ 全量回归 + 推送) > **触发**:用户批准 §4.41 三项待决后指令「按照你建议的来 然后跑测试并推送」。正本见 `开发文档\D1.6…md` §4.42。 diff --git a/开发文档/D1.1-文档索引与权威声明.md b/开发文档/D1.1-文档索引与权威声明.md index dc860c7..90a9b04 100644 --- a/开发文档/D1.1-文档索引与权威声明.md +++ b/开发文档/D1.1-文档索引与权威声明.md @@ -36,7 +36,7 @@ ``` 对外交付(客服agent\) 配套完整版 / 前身(开发文档\) ────────────────────────────────── ───────────────────────────────────── -A1 [D2.1] D2.1-客服Agent执行Todolist.md v6.29 ←→ [D3.4] D3.4-客服Agent重构Todolist.md v5.1 +A1 [D2.1] D2.1-客服Agent执行Todolist.md v6.30 ←→ [D3.4] D3.4-客服Agent重构Todolist.md v5.1 A2 [D2.2] D2.2-客服Agent需求文档.html v2.6 ←→ [D3.1] D3.1-客服Agent需求开发文档与设计方案.html v2.5 A3 [D2.3] D2.3-客服Agent开发计划.html v1.1 ←→ (无旧版) A4 [D2.4] D2.4-客服Agent知识库设计方案.html v1.3 ←→ [D3.2] D3.2-知识库设计方案.html v1.2 @@ -59,7 +59,7 @@ A5 [D3.3] 访客与角色分离的鉴权方案建议(仅此一份,无新旧 | # | 体系编号 | 文档 | 版本 | 作用 | |---|---|---|---|---| -| **A1** | **D2.1** | `客服agent\D2.1-客服Agent执行Todolist.md` | **v6.29** | **唯一开工入口**。**57 项 / 8 批次(A—H)** / 12 步关键路径 / 2 组会签 / **完工判据 13 条**。**新增批次 H · 智能增强**(`H-01`~`H-06`) | +| **A1** | **D2.1** | `客服agent\D2.1-客服Agent执行Todolist.md` | **v6.30** | **唯一开工入口**。**57 项 / 8 批次(A—H)** / 12 步关键路径 / 2 组会签 / **完工判据 13 条**。**新增批次 H · 智能增强**(`H-01`~`H-06`) | | **A2** | **D2.2** | `客服agent\D2.2-客服Agent需求文档.html` | **v2.6** | 对外需求:**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.3** | 三集合 / 三档可见性 / **集合内分区隔离(§7.2.1)** / 8 模块 / 7 步入库 8 步检索 / 8 项决策 / **附录F 五出口对接** | @@ -123,7 +123,7 @@ 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.29** | 现行 | 🔴 **唯一开工入口**:**57 项 / 8 批次** / 12 步关键路径 / **批次 H 智能增强** | +| **D2.1** | `客服agent\D2.1-客服Agent执行Todolist.md` | **v6.30** | 现行 | 🔴 **唯一开工入口**:**57 项 / 8 批次** / 12 步关键路径 / **批次 H 智能增强** | | **D2.2** | `客服agent\D2.2-客服Agent需求文档.html` | **v2.6** | 现行 | 🔴 对外需求:**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.3** | 现行 | 🔴 三集合 / 三档可见性 / **分区隔离** / 7 步入库 8 步检索 / **附录F** | @@ -182,7 +182,7 @@ A5 [D3.3] 访客与角色分离的鉴权方案建议(仅此一份,无新旧 | 文件名 | 版本 | 日期 | 定位 | 关联 | |---|---|---|---|---| -| `D2.1-客服Agent执行Todolist.md` | **v6.29** | 2026-09-17 | 唯一开工入口 | 收敛自 `开发文档\D3.4-客服Agent重构Todolist.md` v5.1 | +| `D2.1-客服Agent执行Todolist.md` | **v6.30** | 2026-09-17 | 唯一开工入口 | 收敛自 `开发文档\D3.4-客服Agent重构Todolist.md` v5.1 | | `D2.2-客服Agent需求文档.html` | **v2.6** | 2026-09-17 | 对外需求(FR **52** / NFR 21) | 完整版见 §4.2 | | `D2.3-客服Agent开发计划.html` | **v1.1** | 2026-09-17 | 批次 / 会签 / 门禁 | 与 A1 批次号一一对应 | | `D2.4-客服Agent知识库设计方案.html` | **v1.3** | 2026-09-17 | 三集合 / 三档 / 入库检索流程 | 完整版见 §4.2 | diff --git a/开发文档/D1.6-对话上下文提取与开工前补充决策-2026-09-17.md b/开发文档/D1.6-对话上下文提取与开工前补充决策-2026-09-17.md index 3820ded..382e6cb 100644 --- a/开发文档/D1.6-对话上下文提取与开工前补充决策-2026-09-17.md +++ b/开发文档/D1.6-对话上下文提取与开工前补充决策-2026-09-17.md @@ -2883,6 +2883,66 @@ pytest **2 failed / 1577 passed / 2 skipped**(= `T0` 基线同两项)、ruff **八、临时产物**:`_w15_probe.py` 已归档为 `_eval_harness/http_probe_w15_profile.py`(与 `http_probe.py` 同目录,属既有留痕约定)。 +### 4.43 2026-09-20 第三十九轮会话记录(`W16`:咨询轮 —— 「Agent 与用户画像的关系 / 对话能否更新画像 / 要不要做中长期记忆」) + +> **本轮指令(原文)**:「我们这个agent跟用户画像有什么关系 用户跟agent的对话能否作为更新用户画像的依据,如果可以做,是不是要做中长期记忆」 + +**一、现状(逐条读码取证,本轮**未改任何代码**)** + +| 层 | 载体 | 客服侧现状 | 证据 | +|---|---|---|---| +| 短期会话记忆 | `conversation_message` + `conversation_session`(MySQL) | ✅ 开(读 / 写) | `DEC-19`;见 §4.40 | +| 中期记忆 | `memory_unit`(+ `memory_evidence`) | ❌ **客服不写** | `app\worker\runtime.py:93` `NO_LONG_TERM_MEMORY_AGENT_TYPES = frozenset({"customer_service"})` | +| 画像候选 | `memory_unit.status='candidate'` | ❌ **整体关闭** | `runtime.py:84` `PROFILE_CANDIDATE_AGENT_TYPES = frozenset()`(注释写明「不是重构期临时状态」,要开必须先改 `DEC-19`) | +| 长期记忆召回 | `memory_unit` / `user_facts` | ❌ **关** | `customer_service.py:606` `recalls_customer_memory=False` + `base.py:143` 基类闸门 | +| 画像读取 | `fin_customer_profile` → 快照 → 投影 | ⚠️ **字段级只读** | `query_customer_profile`(self 作用域)+ `PROFILE_FIELD_POLICY` | + +**二、关键发现①:整条「对话 → 画像」链路**已在仓库里**(不是待开发)** + +``` +对话 → memory_unit(中期) → user_facts(长期) → fin_customer_profile(画像) → profile_snapshots + Milvus/Neo4j 投影 + 门槛:evidence_count ≥ 2 或 confidence ≥ 0.90 +``` +证据:`app\service\profile_assembly_service.py`(模块文档即写「记忆系统为画像服务」)、`app\service\profile_generation_service.py`、`app\service\memory_taxonomy.py`(13 个受控记忆键)。⇒ 「能不能做」在**技术上是既有能力**,卡点全在**合规裁定**。 + +**三、关键发现②:按字段所有权分域,且有一条不可逾越的红线** + +| 画像字段 | 对话能否更新 | 机制 | +|---|---|---| +| `preferred_asset_class` | ✅ 能 | `FACT_TO_PROFILE_FIELD["preference:asset_class"]` | +| `investment_horizon` | ✅ 能 | `FACT_TO_PROFILE_FIELD["preference:horizon"]` | +| `risk_tags`(自述标签) | ✅ 能,标注「来源:自述」 | `SELF_REPORTED_PREFIXES` | +| `investor_type`(**风险等级**) | ❌ **绝对不可** | `profile_assembly_service` 文档原话:「客户在对话里说"我是激进型"不会改变它——这是合规底线,**不能只靠约定**」 | +| `total_asset` / `trading_frequency` / `behavior_score` | ❌ 不可 | `PROFILE_OWNED_FIELDS` 按字段所有权写入,留给交易模块 | +| `customer_tier` | ❌ 不参与 | 快照按设计排除该字段(见 `D-11`) | + +设计亮点(值得在答辩里讲):自述等级**不丢**——进 `risk_tags` 并标注来源。当出现「问卷 C4 / 自述稳健 / 行为买 R4」**三方不一致**时,这个矛盾本身即风控信号(`D3.1` `FR-CS-024` 转人工摘要也含画像关键标签)。 + +**四、关键发现③:`D2.2` §1.7 第 12 项的关闭理由**有一条已过期** + +| 原文理由 | 现状 | +|---|---| +| ① 「收益方(**投顾**)已整体清除」 | 🔴 **已失效** —— 投顾模块 2026-09-20 已随合并**恢复**(见 `D4.7`) | +| ② 「注入生成上下文与证据约束生成直接冲突」 | ✅ **仍然成立**,且是**结构性**冲突(`FR-CS-009` 仅基于检索内容回答 + `FR-CS-049` 证据约束生成 + 输出数字一致性校验) | + +**五、我的建议(本轮提交用户裁定,未执行)** + +核心主张:**让记忆改变「系统行为」,而不是改变「模型输入」**。 + +| 记忆键 | 消费点 | 效果 | 碰生成上下文 | +|---|---|---|---| +| `preference:asset_class` | 检索层分区加权 | 问「有什么产品」时优先生命中族 | ❌ | +| `preference:horizon` | `E1` 澄清候选排序 | 少问一轮 | ❌ | +| `constraint:*` / `goal:*` | `E2` 计算型入参 | 试算带上已知约束 | ❌ | +| `preference:risk_level` | 适当性过滤(**已实现**) | 无需改动 | ❌ | +| 任意记忆 | 直接塞进 prompt | —— | ✅ **禁止** | + +**六、待决 3 项**(详见下文给用户的回答) + +1. 是否打开画像候选与中期记忆(建议:**演示后做**,且只开 `preference:*` / `constraint:*` / `goal:*`,**不开** `profile:occupation` / `family` / `income_stability` 三个 PII 键); +2. 记忆消费方式是否**限定为确定性信号**(建议:**是**,并写进 `D2.2` §1.7 第 12 项); +3. 是否更正 `D2.2` §1.7 第 12 项**已过期的理由①**(建议:**更正** —— 否则答辩被追问「为什么关长期记忆」时引的是失效依据)。 + --- ## 5. 建议的开工顺序(在 `DEC-11` 拍板后)