# 记忆信号识别复核(2026-09-09) 对 P2 新增的 `app/service/memory_taxonomy.py` 做只读复核:直接调用 `detect_memory_signals()` 喂入 8 条真实语料,检查"该命中的命中、不该命中的不命中"。 ```powershell python -c "from app.service.memory_taxonomy import detect_memory_signals; ..." ``` ## 一、实测结果 | 输入 | 命中 | 判定 | |---|---|---| | 我的风险偏好是稳健型 | `preference:risk_level`、`preference:product_type` | **误命中**:`product_type` 不该出现 | | 我的风险偏好是稳健型,只买债券基金 | 同上两个键 | 同上(`只买债券` 才是 product_type 的真实信号) | | 我想买基金,帮我看看 | 无 | 正确(意图不等于偏好) | | 我打算三年内不赎回,流动性要好 | `constraint:liquidity`、`goal:target` | **漏命中** `preference:horizon` | | 我接受不了亏损,最多回撤5% | 无 | **漏命中** `constraint:loss_tolerance` | | 今天大盘怎么样 | 无 | 正确 | | 帮我查一下159915的净值 | 无 | 正确(不误触) | | 我已经结婚了,还有两个孩子要养 | 无 | **漏命中** `profile:family` | ## 二、三个缺陷 1. **模式重叠导致误命中**。`preference:product_type` 的模式含宽泛的「偏好」,而 `preference:risk_level` 的模式含「风险偏好」,任何风险偏好陈述都会同时命中两者。 后果:模型可能据此抽出一条并不存在的"产品类型偏好"记忆。 2. **模式过于字面导致大面积漏命中**。当前模式多是完整短语("不能亏"、"最大回撤"、 "不接受亏损"、"已婚"、"有孩子"、"三年内不用"),真实用户表述("接受不了亏损"、 "最多回撤5%"、"结婚了"、"两个孩子"、"三年内不赎回")全部不匹配。 这直接削弱 P2 的核心目标:抽取质量。 3. 正例表现正常——「我想买基金」「今天大盘怎么样」「查净值」均不误命中, 说明问题在覆盖度与重叠控制,而不是整体判据方向。 ## 三、修复建议(P2 落地后执行) - `preference:product_type`:移除宽泛的「偏好」,改为 `只买`、`只投`、`偏好股票`、 `偏好债券`、`偏好货币`、`倾向于买`。 - `constraint:loss_tolerance`:补 `接受不了亏损`、`不能接受亏损`、`回撤`、`怕亏`、 `亏损承受`。 - `profile:family`:补 `结婚`、`孩子`、`子女`、`配偶`、`赡养`、`家庭`。 - `preference:horizon`:补 `不赎回`、`打算持有`、`计划持有`、`长期`、`短期`。 - 增加**重叠约束**:同一片段不应同时命中语义互斥的键(如 risk_level 与 product_type), 或者把模式匹配改为"最长匹配优先归属单一键"。 - 上述每一条都要补成**回归测试**(正例 + 反例),而不是只改模式字符串。 ## 四、状态:已修复并配回归测试 修复已落地在 `app/service/memory_taxonomy.py`: - `preference:product_type` 移除宽泛的「偏好」,改为「只买 / 只投 / 只做 / 倾向买 / 偏好股票 …」; - `constraint:loss_tolerance` 补「接受不了亏损 / 不能接受亏损 / 回撤 / 怕亏」; - `profile:family` 补「结婚 / 孩子 / 子女 / 配偶 / 赡养 / 家庭」; - `preference:horizon` 补「不赎回 / 打算持有 / 计划持有」; - `goal:target` 去掉裸「打算」(它在期限陈述里不构成目标收益目标)。 修复后实测: ```text ['preference:risk_level'] <- 我的风险偏好是稳健型 ['constraint:loss_tolerance'] <- 我接受不了亏损,最多回撤5% ['profile:family'] <- 我已经结婚了,还有两个孩子要养 ['constraint:liquidity', 'preference:horizon'] <- 我打算三年内不赎回,流动性要好 [] <- 我想买基金,帮我看看 ``` 回归测试:`tests/unit/service/test_memory_taxonomy_signals.py`,11 个用例,每条用例同时断言 "必须命中"与"必须不命中",另含两条结构约束(信号键必须属于受控词表、键前缀必须是合法的 `memory_type`),避免今后只改模式字符串却没有回归保护。