L1 原子记忆:单次 LLM 的结构化抽取 + 批量去重
L1 是「会议纪要」:先按情境分段、再从每段抽出结构化事实卡片。一次 LLM 调用完成抽取,再一次 LLM 调用完成与存量记忆的冲突判定。
L1 Atom · l1-extractor.ts
1
质量门与消息切分
L0 故意全量捕获,严格的过滤放在 L1 入口
质量门 shouldExtractL1过滤过短 / 纯符号 / 连续问号等低价值内容,安全过滤注入负载
new + background 切分new = 最近 10 条;background = 之前最多 5 条作上下文。控制单次抽取的 Token 预算
每会话上限maxMemoriesPerSession 默认 10 条,超限截断
2
LLM 抽取:场景分段 + 记忆提取一次完成
JSON 结构化输出;输出协议固定,自定义 Prompt 只能追加关注点、不能改协议
LLM 输出:SceneSegment[](示意)
[ { "scene_name": "鉴权模块重构", "message_ids": ["msg_1785…","msg_1786…"], "memories": [ { "content": "别重构旧鉴权模块,移动端还在用", "type": "instruction", "priority": 80, "source_message_ids": ["msg_1785…"], "metadata": {"activity_start_time": "…"} } ] } ]
JSON 容错(工程细节)
· 剥 ```json 围栏 · sanitizeJsonForParse 修复控制字符 · repairExtractionJson:弱模型把 priority 输出成裸标识符时回填 50 · 解析失败重试一次,仍失败返回空 (单条坏标量不拖垮整批)
记忆类型(MemoryType)与去重动作: persona 用户画像episodic 事件instruction 规则/指令 work_fact 工作事实work_task 工作任务work_method 工作方法work_artifact 工作产物 store 新增 update 更新 merge 合并 drop 丢弃
3
批量冲突检测 + 写入
候选召回(无 LLM)→ 单次 LLM 批量判定 → 按决策落库
候选召回(三级降级)① 向量召回(cosine,topK=5,最佳)→ ② FTS5 BM25(降级)→ ③ 无能力时跳过去重、全部 store(省去 O(N) 全文件扫描)
隔离约束候选召回带 team/user/agent 过滤,去重永不跨租户
写入l1_records 表(元数据)+ l1_vec 虚拟表(向量)+ FTS5(全文);JSONL 双写备份 records/YYYY-MM-DD.jsonl
生成溯源memory_generation_refs 记录 Prompt ID / 版本 / 来源 / SHA-256 与 input→output 引用,按 memory_id 可精确定位生成日志
来源:MemoryCore/src/core/record/l1-extractor.ts + l1-dedup.ts + l1-writer.ts + src/core/store/sqlite.ts(l1_records / l1_vec DDL)。v4 起移除 JSONL Jaccard 兜底,候选召回只依赖向量与 FTS。