感知驱动记忆

niuma_code 的记忆系统基于 memory-palace 构建——在运行时实时将事件转录为持久记忆,而非仅在对话结束时提取。


核心思想

传统方式:LLM 对话 → 结束后提取记忆 niuma_code 方式:10 个感知事件在工作过程中实时触发

文件读取  →  目事件:"检查了文件 X"
工具调用  →  身事件:"执行了工具 Y"
代码写入  →  舌事件:"修改了文件 X"
错误发生  →  鼻事件:"工具 Y 出错"
任务完成  →  果事件:"目标 Z 达成"

10 个感知事件

事件 触发条件 记录内容
eye_read(目-读) 读取文件 检查了哪些文件
eye_search(目-搜) 搜索代码 搜索了什么内容
body_tool(身-工具) 调用工具 工具名、输入、是否成功
body_bash(身-命令) 运行 bash 命令、输出、耗时
tongue_write(舌-写) 写入文件 写入内容、文件路径
tongue_edit(舌-改) 编辑文件 修改内容、差异
nose_error(鼻-错) 发生错误 错误类型、上下文
nose_warning(鼻-警) 警告 警告上下文
outcome_task(果-始) 设定目标 任务描述、范围
outcome_done(果-终) 目标达成 完成评分(0.0-1.0)

记忆存储方式

事实三元组

以实体-属性-值形式存储结构化知识:

{
  "entity": "UserService",
  "attribute": "file_path",
  "value": "app/services/user.py",
  "importance": 0.8,
  "session_id": "abc123"
}

对话摘要

将完整对话上下文压缩为可搜索的摘要:

{
  "text": "用户请求为 GET /users 端点添加分页。使用 limit/offset 参数实现。",
  "importance": 0.6,
  "session_id": "abc123"
}

4 层检索

新对话开始时,记忆通过 4 层检索:

层级 目的 示例
1. 活动任务 当前工作上下文 "正在编辑 auth.py"
2. 近期会话 最近几次对话 "昨天修复了 login 中的 bug"
3. 重要事实 高重要性知识 "项目使用 FastAPI + SQLAlchemy"
4. 语义搜索 主题相关记忆 "与认证模式相关"

检索到的记忆被注入系统提示词的固定位置。


贝叶斯衰减

记忆重要性随时间按贝叶斯模型衰减:

score = 基础重要性 × 时间衰减因子 × 频率因子
因子 行为
基础重要性 创建时设定(0.0-1.0)
时间衰减因子 距上次访问越久越低
频率因子 被召回越频繁越高

这确保最近使用、频繁相关的记忆优先出现。


感知事件实战

示例:Bug 修复会话

1. 用户:"修复 login 中的 KeyError"
   → outcome_task:"修复 login 函数中的 KeyError"

2. LLM 读取 auth.py
   → eye_read:"检查了 auth.py"

3. LLM 在第 42 行发现错误
   → body_tool:"使用了 locate_symbol"

4. LLM 编辑 auth.py
   → tongue_edit:"修改了 auth.py"

5. LLM 运行测试
   → body_bash:"pytest tests/test_auth.py"

6. 测试通过
   → outcome_done:"评分=0.95"

全部 6 个事件实时存储。下次会话当你开始处理 auth 时,这些记忆会自动检索注入。


WAL(预写日志)

记忆写入通过 WAL 确保崩溃安全:

1. 事件触发 → 追加到 WAL 文件
2. WAL 缓冲区满 → 刷入数据库
3. 数据库写入 → WAL 检查点

如果 niuma_code 在会话中崩溃,下次启动时 WAL 会重放恢复丢失的事件。


配置

{
    "memory": {
        "enabled": true,
        "max_contexts": 5,
        "auto_recall": true,
        "wal_encrypt": true
    }
}
设置 默认值 说明
enabled true 启用/禁用记忆系统
max_contexts 5 最大记忆上下文数
auto_recall true 自动将相关记忆注入系统提示词
wal_encrypt true 加密 WAL 文件保护隐私

隐私