记忆系统
CountBot 的长期记忆系统基于文件存储实现,核心目标是让模型可以把稳定事实沉淀到工作空间中,并通过统一的
memory工具完成追加、搜索、读取和统计。
设计理念
- 长期记忆落在工作空间里,用户可以直接查看和编辑。
- 存储结构尽量简单,便于审计、迁移和手工修复。
- 上层通过统一工具接口访问,不要求业务代码感知底层文件格式。
- 会话历史超出窗口后,可以自动总结并沉淀到长期记忆。
存储位置
默认记忆文件位于:
workspace/memory/MEMORY.md
每一行表示一条记忆记录,格式大致如下:
日期|来源|内容项1;内容项2;内容项3
常见来源包括:
web-chattelegramdingtalkfeishucronauto-overflow
MemoryStore
底层实现位于 backend/modules/agent/memory.py,核心类为 MemoryStore。
当前主要能力包括:
class MemoryStore:
def append_entry(self, source: str, content: str) -> int:
...
def read_lines(self, start: int, end: Optional[int] = None) -> str:
...
def search(self, keywords: List[str], max_results: int = 15, match_mode: str = "or") -> str:
...
def get_recent(self, count: int = 10) -> str:
...
def get_stats(self) -> dict:
...
这意味着记忆系统不仅支持“写入”,还支持:
- 按行读取
- 关键词检索
- 最近若干条回看
- 基础统计
统一工具接口
对模型暴露的主要入口是 backend/modules/tools/memory_tool.py 中的 memory 工具。
它把底层文件能力整理成更稳定的操作:
- 追加记忆
- 搜索记忆
- 读取指定行
- 获取最近记忆
- 查看统计信息
这样模型不需要直接操作 MEMORY.md,而是通过工具调用访问。
自动总结与沉淀
记忆系统和会话管理是联动的。
当前代码里,当会话历史超过窗口限制时,backend/modules/session/manager.py 会尝试:
- 找出超出窗口的旧消息
- 调用总结逻辑生成摘要
- 将摘要以
auto-overflow来源写入长期记忆
对应入口可以在以下位置看到:
backend/modules/session/manager.pybackend/api/chat.py
这套机制的意义是:会话窗口可以保持轻量,但重要信息不会因为消息裁剪而完全丢失。
API 入口
除了工具调用,后端还暴露了记忆相关接口,位于 backend/api/memory.py。
当前可以从接口层完成:
- 查看统计信息
- 获取最近记忆
- 关键词搜索
如果你在前端或外部脚本里做诊断,这些接口会比直接读文件更方便。
使用建议
- 把稳定事实写进记忆,不要把一次性上下文全部塞进去。
- 内容尽量结构化,方便之后搜索。
- 对用户偏好、项目约定、周期性任务特别有价值。
- 如果发现总结质量不理想,优先调整沉淀规则,而不是堆大历史窗口。
相关文件
| 文件 | 说明 |
|---|---|
backend/modules/agent/memory.py | MemoryStore 的文件读写实现 |
backend/modules/tools/memory_tool.py | 对模型暴露的统一记忆工具 |
backend/modules/session/manager.py | 历史溢出后的自动总结与沉淀 |
backend/api/memory.py | 记忆相关 API |
workspace/memory/MEMORY.md | 默认长期记忆文件 |