修改历史

当前记忆 ID:20260517-002
主题:记忆卡片详述
标签:新屋,记忆,详述,卡片,向量,type,检索,注入,intent
重要度:7
更新时间:2026-07-01 06:08:25
当前内容:
## 一、卡片字段

### 数据库字段(memory.db memories表)
id(TEXT PK, YYYYMMDD-NNN) / ai_scope / source_conversation_id / topic / content / tags / importance(1-10) / type(8项单选) / entities(JSON数组,已冻结) / last_used_at / use_count / created_at / updated_at / embedding(768维)

其他表:memory_history(快照,每卡限2条)/ entity_dict(已冻结)/ dialogues(对话暂存)

### type 分类(8项单选)
| type值 | 含义 |
|--------|------|
| milestone | 关系里程碑 |
| commitment | 约定/承诺 |
| turning_point | 感受或认知转向 |
| deep_talk | 深度谈话 |
| interaction_moment | 日常高光瞬间 |
| preference | 稳定生活偏好 |
| real_world | 现实重要事件 |
| lesson | 不能再犯的错 |

### entities 字段(已冻结 2026-05-16 02:47)
- remember 工具不再要求填写 entities
- 写入时默认 []
- 检索时不再使用 EntityOverlap 和 EntityFieldMatch
- entity_dict 表不再更新
- 前端已隐藏 entities 显示
- 数据库字段和表保留不删,存量数据不清理,以后规模扩大可恢复

## 二、写入
- **唯一路径**:AI通过 remember 工具主动写入
- 后端自动生成 id、时间戳、embedding
- **前端管理页写入**:/memory/new 和 /memory/edit 已补齐 embedding 生成(2026-05-16),维度768
- **前端提示**:写入中"📝 正在写入记忆…" → 完成"✓ 已记录"+卡片标题
- **注意**:长卡片建议在管理页手动改,不要让 AI 用 update_memory,因为 tool use 循环会把整张卡片内容在上下文中复制两遍,token 开销巨大

## 三、检索与注入

### 检索架构
双路并行:向量余弦相似度 + 关键词LIKE → 合并去重

### 注入流程
召回候选 → 硬过滤(排除当前对话写入的卡片)→ FinalScore打分 → 阈值0.50过滤 → MMR去重 → 注入0~滑块上限条(默认3)

### search_memory 返回
- 每条记忆返回时携带 embedding 字段(768维数组),供 ref 自动判定使用

### 注入记录
- gateway.db messages 表新增 injected_memories 字段(TEXT)
- 存储格式:JSON数组,每项含 id 和 topic,如 [{"id":"20260516-003","topic":"新屋基础信息"}]
- 记录在 role='user' 的消息上(检索发生在处理用户消息时)
- 前端:AI 消息下方显示 🤖 图标(无注入则不显示),点击展开/收起注入的记忆卡片 topic 列表
- 纯展示,不跳转

### FinalScore 公式(2026-05-16 02:47 更新)
```
FinalScore = 0.50*Relevance + 0.20*TypeFit + 0.15*Importance_norm + 0.15*Recency
Relevance = 0.70*VectorSim + 0.30*KeywordScore
KeywordScore = 0.90*ContentMatch + 0.10*TagMatch
Importance_norm = importance / 10
```

### Intent 分类(5项最终版)
seeking / reflective / casual / deep_discussion / practical

### TypeFit 矩阵(5-intent最终版)
```
TYPEFIT_MATRIX = {
    "milestone":          {"seeking": 0.6, "reflective": 0.7, "casual": 0.3, "deep_discussion": 0.5, "practical": 0.2},
    "commitment":         {"seeking": 0.5, "reflective": 0.7, "casual": 0.3, "deep_discussion": 0.5, "practical": 0.3},
    "turning_point":      {"seeking": 0.8, "reflective": 0.8, "casual": 0.3, "deep_discussion": 0.8, "practical": 0.2},
    "deep_talk":          {"seeking": 0.8, "reflective": 0.8, "casual": 0.3, "deep_discussion": 1.0, "practical": 0.3},
    "interaction_moment": {"seeking": 0.5, "reflective": 0.5, "casual": 1.0, "deep_discussion": 0.3, "practical": 0.3},
    "preference":         {"seeking": 0.3, "reflective": 0.4, "casual": 0.7, "deep_discussion": 0.4, "practical": 0.8},
    "real_world":         {"seeking": 0.4, "reflective": 0.5, "casual": 0.4, "deep_discussion": 0.4, "practical": 1.0},
    "lesson":             {"seeking": 0.9, "reflective": 0.9, "casual": 0.2, "deep_discussion": 0.7, "practical": 0.2},
}
```

### Recency 衰减
- NO_DECAY_TYPES(lesson)→ 永远1.0
- importance >= 9 → 1.0
- created_at或last_used_at 30天内 → 1.0
- 以上均不满足 → max(0.2, exp(-days_since_active/30))

### MMR 去重
- 普通:λ=0.75
- 高价值(NO_DECAY_TYPES):λ=0.85

## 四、ref 自动判定(2026-05-17 00:44 更新)

### 旧机制(已废弃)
- 要求 AI 在回复末尾手写 `<!--ref:ID1,ID2-->` 标记
- 问题:AI 回复情绪性内容时频繁漏标,ref 提示指令会污染回复质感
- 已删除:ref 提示指令、`<!--ref:...-->` 正则解析、前端清理逻辑

### 新机制:后端余弦自动判定
- **时机**:AI 回复流式完成后,异步执行,不阻塞 SSE 流
- **流程**:
  1. 拿本轮 injected_memories 列表及其 embedding(search_memory 返回时已携带)
  2. 对 AI 完整回复文本调一次 get_embedding(Gateway 本地能力)
  3. 对每张注入卡片,算回复 embedding 与卡片 embedding 的余弦相似度
  4. 相似度 ≥ REF_COSINE_THRESHOLD(0.35)的卡片 ID,收集调一次 ref_update
  5. 无卡片超阈值则不调用
- **余弦计算**:纯 Python,不依赖 numpy
- **日志**:`[REF] auto ref: {card_id} cosine={sim:.4f}` / `[REF] no cards above threshold`
- **原则**:注入不等于使用,只有内容相关的卡片才续命,防止虚假续命
- **开销**:1次 embedding API + 最多1次 MCP ref_update 调用

## 五、embedding 
- Embedding:Qwen3-Embedding-0.6B,硅基流动 https://api.siliconflow.cn/v1
- 统一 768 维
- MCP 服务(embedding_utils.py):768(常量 EMBED_DIMS)
- Gateway 前端管理页(/memory/new、/memory/edit):768

## 六、已完成清单
- ✅ lesson NO_DECAY_TYPES(2026-05-16)
- ✅ entities 冻结(2026-05-16 02:47)
- ✅ 前端管理页 embedding 生成补齐(2026-05-16)
- ✅ 空向量回填(2026-05-16,4条)
- ✅ 摘要管理栏加入 /memory 页面(2026-05-16)
- ✅ ref 标记指令从 system prompt 移至记忆注入区块末尾(2026-05-16 20:36)
- ✅ 注入记录存储 + 前端 🤖 图标展示(2026-05-16 21:44)
- ✅ 前端管理页 embedding 维度修复 256→768 + 5张坏向量回填(2026-05-17 00:00)
- ✅ ref 机制从 AI 手动标记改为后端余弦自动判定(2026-05-17 00:44)
- ⏳ 根骨提示词重写(持续修改中)

修改历史

这条记忆目前还没有历史版本。