ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

N.E.K.O.五维记忆系统源码解析:从对话到事实、反思、人格的完整数据流与RRF混合召回

N.E.K.O.五维记忆系统源码解析:从对话到事实、反思、人格的完整数据流与RRF混合召回 N.E.K.O.五维记忆系统源码解析从对话到事实、反思、人格的完整数据流与RRF混合召回【免费下载链接】N.E.K.OA catgirl who lives with you in real time — reaching out first, sharing your media, and actually getting things done, powered by an embodied emotional engine.❤️一只会主动找你玩的 AI 猫娘。项目地址: https://gitcode.com/gh_mirrors/ne/N.E.K.ON.E.K.O. 是一款会主动找你聊天的 AI 猫娘应用而她的「五维记忆系统」正是她拥有长期记忆的核心引擎。本文从源码层面拆解这条完整数据流——对话如何变成原子事实、事实如何被反思合成、证据如何驱动生命周期、最终如何通过 RRF 混合召回精准检索——帮助你理解这套记忆架构的设计思路。五层记忆架构一张表看懂全局N.E.K.O. 的记忆不是单一向量数据库而是每个角色独立的一套五层流水线。各层有不同的写入路径、保留规则和注入 Prompt 的行为层级作用主要存储文件是否注入新对话上下文工作上下文为下一轮 LLM 会话准备的记忆文本由/new_dialog接口动态生成本身就是最终上下文近期记忆最近的对话轮次 就地压缩摘要recent.json✅ 是事实Facts从对话中提取的原子观察带主体/重要性/事件时间标签facts.json❌ 用于反思合成与显式召回反思Reflections由多组事实合成的更高层次解读reflections.json⚠️ 待定与活跃已确认的会参与渲染人格Persona关于用户、角色及关系的持久知识persona.json✅ 受渲染预算和抑制规则约束此外还有一个原始时间序存储time_indexed.dbSQLite用于事实提取、时间扫描和对话间隔计算。它不是独立的 Prompt 层而是一本「原始日志」——历史对话不会自动灌入每轮 LLM Prompt。 所有存储均按角色名lanlan_name隔离默认位于配置的记忆根目录下。完整目录结构见 docs/architecture/memory-system.md。从对话到事实五步写入路径这是整个记忆系统最核心的数据流。每一轮对话结束后后台会依次执行以下五步第一步持久化对话轮次主服务器端口 48911将完成的对话数据发送到内部记忆服务器端口 48912。根据会话生命周期连接器会调用/cache、/process、/renew或/settle接口。前台持久化路径完成两个关键写入追加对话轮到角色的近期历史recent.json将原始消息带时间戳和对话 ID追加到time_indexed_original表同时系统会在outbox.ndjson中记录一条可重放的后轮操作把昂贵的提取和审查任务调度到后台——即使 LLM 调用失败也不会阻塞正在进行的对话。第二步就地压缩近期记忆memory/recent.py中的CompressedRecentHistoryManager负责控制近期上下文的边界。当近期历史超过配置阈值时较早的条目被摘要替换为recent.json前端的SystemMessage备忘录最新的几轮对话保持原文不变超大输入使用有界的 Map-Reduce 路径最终有硬上限防止摘要器反复失败导致 Prompt 无限膨胀第三步提取与去重事实这是「五维」中的关键一环。事实提取器将对话窗口转化为原子记录用户偏好、事件、关系观察等精确/哈希去重SHA-256 哈希 FTS5 全文检索始终可用向量近重复仲裁当本地 Embedding 可用时后台工作线程识别疑似改写句交由 LLM 仲裁已吸收标记被反思消费过的事实标记为absorbed旧的已吸收事实从facts.json迁移到facts_archive.json而非删除源码位于 memory/facts.py核心类FactStore是三层记忆体系的 Tier 1。第四步合成反思memory/reflection/模块定期将足够数量的未吸收事实分组合成为更高层次的反思幂等性反思 ID 由源事实 ID 派生同一批次重试不会产生重复证据携带每条反思自带证据、实体、生命周期状态和可选的事件时间本体生命周期反思可以是pending→confirmed→promoted/merged to persona/denied/archived合成在记忆服务器后台服务中运行不依赖记忆浏览器页面或主动聊天前端是否打开。第五步晋升为持久人格人格条目按实体分组内置实体包括master用户、neko猫娘自身、relationship关系。来自角色卡的条目被标记为protected不会被证据衰减或归档清扫移除。当强力记忆开启时晋升是证据驱动的达到晋升阈值的已确认反思会经过修正级合并决策——结果可能是新的人格条目、合并到现有人格知识、被拒绝、或排队一个矛盾待解决。证据驱动的生命周期让记忆「有温度」这是 N.E.K.O. 记忆系统最精妙的设计。每条反思和人格条目都携带独立的**强化reinforcement和质疑disputation**两个累加器读取时用独立时钟计算衰减后的有效值有效强化 reinforcement × 0.5 ^ (天数 / 30天半衰期) 有效质疑 disputation × 0.5 ^ (天数 / 180天半衰期) 证据分数 有效强化 − 有效质疑信号来源与权重信号来源效果权重新提取的事实强化已有观察reinforcement 0.5间接新提取的事实否定已有观察disputation 1.0用户确认已浮出的反思reinforcement 1.0直接用户否认已浮出的反思disputation 1.0直接负面关键词命中 LLM 目标确认disputation 1.0用户忽略已浮出的反思reinforcement −0.2派生状态证据分数派生状态≥ 2.0promoted可晋升≥ 1.0confirmed已确认≥ 0pending待定 0负分跟踪≤ −2.0archive_candidate归档候选完整的阈值和半衰期常量集中在 config/memory_settings.py 中。设计文档详见 docs/design/memory-evidence-rfc.md。RRF 混合召回BM25 余弦 融合当模型在对话中调用recall_memory工具时系统走的是memory/hybrid_recall.py中的用户面向混合召回路径。这是整个系统检索能力的心脏检索池构成BM25 池活跃事实 活跃反思 归档事实归档让长尾关键词命中成为可能向量池活跃事实 活跃反思排除归档节省成本排除人格因为已渲染进系统 Prompt三路流水线阶段说明硬过滤丢弃负分、被抑制、终态反思、保护人格条目BM25 路径CJK 用 2/3-gram 滑窗、拉丁用空格分词标准 Okapi BM25k11.5, b0.75取前 4余弦路径本地 ONNX CPU Embedding与缓存向量计算余弦相似度取前 4RRF 融合RRF(d) Σ 1/(k rank_i(d))k60最终最多返回 8 条唯一结果为什么不用 LLM 重排这是一个刻意的设计决策recall_memory工具在模型的工具调用循环内用户在等待回复。再走一轮 LLM 重排会让延迟变得可感知。RRF 对两份排序列表的融合已经是生产级混合搜索系统Elasticsearch、OpenSearch、Vespa的默认方案。 繁简折叠分词前会将繁体折叠到简体memory/script_fold.py解决简繁两侧字符几乎不重叠的问题。内部维护召回与用户召回的区别除了用户面向的混合召回系统还有一套内部维护召回memory/recall.py::MemoryRecallReranker服务于两个后台场景消费者候选池用途Stage-2 证据信号检测已确认/已晋升反思 非保护人格新事实是否强化或否定已有观察反思合成已吸收事实为每条未吸收事实查找相关上下文锚点关键区别人格只从用户面向混合召回中排除因为已渲染进对话上下文但在 Stage-2 维护召回中非保护人格是故意包含的候选。强力记忆模式全功能 vs 轻量core_config.json中的powerful_memory_enabled字段默认开启控制记忆系统的完整程度能力开启关闭事实提取批量 Stage 1 Stage 2 证据映射逐轮 Stage 1 回退Stage 2 暂停反思合成✅ 运行✅ 运行反馈处理✅ 运行✅ 运行晋升方式证据分数 合并决策 LLM按年龄自动确认7天无合并 LLM显式召回 / 归档 / 迁移✅ 可用✅ 可用存储布局一个角色的记忆目录每个角色目录下包含以下持久化文件部分文件延迟创建路径角色recent.json近期轮次 当前摘要备忘录time_indexed.db原始时间序对话行SQLitefacts.json/facts_archive.json活跃事实 / 已归档事实reflections.json/surfaced.json活跃反思 / 用户反馈与浮出状态persona.json/persona_corrections.json人格视图 / 排队矛盾决策outbox.ndjson可重放后台操作至少一次投递幂等events.ndjson/events_applied.json有序状态转换日志 / 对账哨兵cursors.json周期扫描的持久进度位置写入在 JSON 视图整体替换时是原子的每角色锁串行化冲突变更。后台 LLM 失败使用有界重试/退避失败的任务应降级或重试不阻塞正常聊天。关键源码入口速查模块文件职责事实存储memory/facts.py原子事实提取、去重、持久化近期压缩memory/recent.py有界近期上下文管理反思引擎memory/reflection/synthesis.py事实→反思合成证据计算memory/evidence.py衰减计算、派生状态混合召回memory/hybrid_recall.pyBM25 余弦 RRF 融合内部重排memory/recall.py向量粗排 LLM 重排后台用人格管理memory/persona/manager.py持久知识渲染与抑制Embedding 服务memory/embeddings.py本地 ONNX CPU 向量推理工具注册main_logic/core/tool_calling.pyrecall_memory工具注册与处理全部阈值配置config/memory_settings.py证据/召回/反思/人格参数架构文档docs/architecture/memory-system.md运行时契约完整说明总结为什么这套记忆系统值得学习N.E.K.O. 的五维记忆系统有三个核心设计哲学值得借鉴分层而非单一不同抽象层级的知识有不同的写入频率、保留规则和注入策略避免「一个大向量库」的简单化陷阱证据而非断言每条记忆都有可衰减的正负证据记忆可以「变弱」甚至「被反驳」而非永久固化后台不阻塞前台所有昂贵的 LLM 提取、合成、晋升都在后台异步执行失败只降级不阻塞——对话体验永远优先理解这套数据流后你可以在 docs/architecture/memory-system.md 中查阅完整的运行时契约在 config/memory_settings.py 中调整所有阈值参数在http://localhost:48911/memory_browser中浏览和编辑角色的近期记忆。【免费下载链接】N.E.K.OA catgirl who lives with you in real time — reaching out first, sharing your media, and actually getting things done, powered by an embodied emotional engine.❤️一只会主动找你玩的 AI 猫娘。项目地址: https://gitcode.com/gh_mirrors/ne/N.E.K.O创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表