Files

70 lines
4.2 KiB
Markdown
Raw Permalink Normal View History

# 记忆信号识别复核(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`),避免今后只改模式字符串却没有回归保护。