人工智能AI 应用Agent 记忆AI AgentRAG后端前端dsh-plugin【免费下载链接】mem9Unlimited memory for OpenClaw项目地址https://gitcode.com/gh_mirrors/me/mem9点击查看免费下载mem9 是面向 AI Agent 的持久化记忆服务它的核心能力之一就是从一段普通对话中自动提炼出可长期保存的原子事实Facts让 Agent 跨会话、跨设备都能记得你。本文带你完整看懂 mem9 的 Facts 事实抽取管线从输入清洗、LLM 抽取契约、长期事实过滤到时间归一化与来源追踪每一步是如何把闲聊变成永久记忆的。一、为什么需要事实抽取Agent 的原始对话是短暂的但用户希望它记住稳定的信息偏好、项目、关系、决策。mem9 把记忆分成三类各司其职记忆类型含义主要写入路径session原始对话轮次保留上下文SessionService.BulkCreateinsight从对话中提炼的长期事实Facts 抽取 Reconcile本文主角pinned用户显式要求固定的内容MemoryService.CreatePinned换句话说session 是录音笔insight 才是笔记。Facts 抽取管线负责的就是后者——它不做整段总结而是生成一条条可独立检索、适合长期保存的原子陈述。二、Facts 抽取管线全景五步走整条管线由 IngestService 编排Handler 层的入口在 ingestMessages。完整流程可以概括为五步输入预处理清洗插件注入内容、去空消息、按 rune 上限截断LLM 抽取按抽取契约输出 JSON 格式的原子事实长期事实过滤两层门禁丢弃短期、临时性内容时间归一化把昨天下周三解析为结构化时间元数据来源追踪为每条事实标注它出自哪几条原始消息官方中文文档对这条链路的完整描述见 facts-extraction.zh-CN.md四条算法链路的导读见 README.zh-CN.md。三、输入预处理先给对话消毒在把对话交给 LLM 之前stripInjectedContext 会先移除插件注入的relevant-memories内容——这一步很关键否则上一次召回的记忆会被当作新事实再写回数据库形成记忆自我复制的反馈环。随后 prepareExtractionInputWithPolicy 完成三件事跳过空消息规范化 role 与 content并记录清洗后消息对应的原始索引供后续来源追踪用长度控制整段对话最多保留 1,000,000 个 rune单条content入口最多 32,000 个 rune角色准入默认只允许user消息贡献事实system和tool永远不参与开启MNEMO_FACT_EXTRACTION_INCLUDE_ASSISTANT后assistant也只允许贡献关于用户世界、项目、决策的具体长期断言建议、猜测、自我描述均被排除四、LLM 抽取契约什么样的句子才配成为事实mem9 对 LLM 有一套严格的输出契约这是保证记忆质量的第一道防线原子化每个事实必须是单一、自包含、可独立检索的陈述。因果、条件、先后这类强语义关系允许保留在一条事实里避免拆散后丢失关系保真保留原始语言和具体名称尽量把他那个项目替换为实体名但不猜测不清楚的指代附标签每条事实可带 1–3 个短小写 tags用于后续检索与分类必须返回 JSON首次解析失败时extractFactsAndTagsWithRouting 会发起一次JSON 修复重试仍失败则依次尝试兼容旧版{facts:[...]}字符串数组格式、以及字段被错误展开到顶层的 flattened-fact 格式。三种手段都救不回来Phase 1 才返回错误这种一次重试 两级降级的设计让管线在 LLM 输出不稳定时依然鲁棒。五、长期事实过滤两层门禁拦住临时话不是所有值得说的话都值得记一辈子。mem9 用两层门禁保证只有 durable可持续事实能进入长期记忆第一层Prompt 层要求 LLM 只产出 durable facts并为可疑内容打上fact_type第二层服务端确定性兜底filterLongTermFacts 用fact_type判断 中英文正则 guard 双重检查以下五类内容会被直接丢弃不进入后续 Reconcile类型含义示例query_intent用户只是在提问、搜索帮我查下部署日志transient_status当前短暂状态我现在正在健身ephemeral_intent一次性意图或请求帮我临时监控一下这个接口activity_log单次饮食/体重/训练/睡眠记录今天吃了 60g 蛋白质operational_log调试、导入、运行状态日志冒烟测试通过细节上很讲究服务端正则见 ingest.go 中的chineseEphemeralIntentRE、chineseActivityLogRE等特意避免误伤——普通人物、地点、项目、事件或承诺不会因为包含今天/明天/计划就被丢弃带和某某一起这类社交叙事线索的事件也不会被简单当成 activity log。六、时间归一化让昨天也能被精确检索昨天开会讨论了迁移方案——这句话的价值很大但昨天是相对时间。normalizeTemporalFacts 会把事实中的时间解析为结构化的TemporalMetadata含kind、anchor_source、granularity、resolved_start、resolved_end、display等字段并区分四种锚点显式绝对时间、本句锚定的相对时间、消息头锚定的相对时间、以当前时间为锚的指示性时间。注意一个设计取舍正文保持自然语言时间不把[time: ...]硬塞进文本只有 Recall 或 Reconcile 需要精确匹配时TemporalRecallProjection才临时投影出只读的[time: ...]后缀。正文干净检索精准两全其美。七、来源追踪每条记忆都能指认原始对话记忆最怕无根——你不知道它从哪来就无法信任它。annotateFactsWithSourceSeqs 会为每条事实标注source_seqs最多 6 个来源消息序号和source_turns摘要。如果 LLM 没直接返回来源服务会用事实文本与候选源消息的 token 重合度推断归属。这一设计带来两个好处任何一条 insight 都可以追溯回原始对话轮次在 Dashboard 中可审计后续 Reconcile 改写事实文本后仍可通过相似 token 重新关联到最可能的来源记忆链条不断裂八、空结果与降级语义失败≠错误两个新手容易误解的点值得专门说明没抽到事实是正常结果不是故障。用户聊的全是临时话题时facts 为空但原始 session turns 仍被独立保存——长期 insight 不创建对话本身没丢无 LLM 时自动降级MNEMO_LLM_API_KEY未配置或 LLM 不可用时Ingest 会改走 raw 路径把整段原文直接写入保证记忆写入不中断排障时建议按源角色不允许 → LLM 输出为空 → 被长期门禁过滤 → JSON 无法恢复的顺序定位详见官方文档的排障检查点。写在最后在 Dashboard 里看见记忆生长抽取出来的记忆不止躺在数据库里。mem9 的 dashboard/ 提供可视化面板把记忆数据渲染成可交互的像素农场场景让Agent 记住了什么变得直观可感至此一条完整链路就串起来了对话 → Facts 抽取 → 过滤与归一化 → Reconcile 判定 ADD/UPDATE/DELETE/NOOP → 写入持久化存储 → 未来 Recall。想继续深入推荐阅读官方文档集Reconcile 流程、记忆存入流程、Recall 算法。赞分享人工智能AI 应用Agent 记忆AI AgentRAG后端前端dsh-plugin【免费下载链接】mem9Unlimited memory for OpenClaw项目地址https://gitcode.com/gh_mirrors/me/mem9点击查看免费下载相关推荐OmO facts extractor 人格详解从对话中抽取持久事实的 record_fact 规则与实现OmO facts extractor 人格详解从对话中抽取持久事实的 record_fact 规则与实现 导读 facts extractor 是 OmO人工智能AI Agent代码智能体多智能体MCP ClientsAgent 编排使用 SQLite 持久化会话记忆langchaingo 对话记忆示例深度解析使用 SQLite 持久化会话记忆langchaingo 对话记忆示例深度解析 导读 本文围绕 langchaingo 官方示例 chains convers人工智能大模型AI AgentRAG后端Open Interpreter 记忆系统深度解析Phase 1 提取与 Phase 2 巩固的两阶段记忆管线Open Interpreter 记忆系统深度解析Phase 1 提取与 Phase 2 巩固的两阶段记忆管线 Open Interpreter面向 Kim人工智能大模型AI Agent代码智能体AI 应用CLI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考