感知驱动记忆
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 文件保护隐私 |
隐私
- WAL 文件使用 AES-256 加密存储
- 记忆数据保持本地——绝不发送到外部服务
- 使用
/memory clear清除所有记忆 - 记忆文件位于
~/.niuma/projects/<项目>/memory/