|
1 | 1 | # 长期记忆系统 |
2 | 2 |
|
3 | | -Coding Code 支持跨会话的长期记忆,自动从对话中提取和存储关键信息。本文档介绍记忆类型、内容分类、自动提取机制和手动编辑方法。 |
| 3 | +Coding Code 支持跨会话的长期记忆:自动从对话中提取关键信息,并在下一次会话开始时重新注入。本文档介绍记忆文件、自动提取机制和手动编辑方法。 |
4 | 4 |
|
5 | 5 | --- |
6 | 6 |
|
7 | | -## 内存类型 |
| 7 | +## 记忆文件 |
8 | 8 |
|
9 | | -记忆文件存储在项目的 `.codingcode/memory.md` 中。 |
| 9 | +记忆存储为单个 Markdown 文件: |
10 | 10 |
|
11 | | ---- |
12 | | - |
13 | | -## 记忆内容 |
| 11 | +``` |
| 12 | +.codingcode/memory.md |
| 13 | +``` |
14 | 14 |
|
15 | | -内置三种记忆类型: |
| 15 | +**整个文件就是长期记忆**,没有分区、没有标记块。文件的全部内容会作为记忆注入,也会作为"已有记忆"参与下一次提取。 |
16 | 16 |
|
17 | | -| 类型 | 提取来源 | 内容 | |
18 | | -|------|---------|------| |
19 | | -| `user` | `[user]` 标签的消息 | 用户角色、技能栈、工作偏好及对 Agent 的纠正 | |
20 | | -| `project` | `[user]` + `[assistant]` 消息 | 架构决策、技术选型、部署信息 | |
21 | | -| `reference` | `[user]` + `[tool:*]` 消息 | 外部资源、文档、Dashboard 链接 | |
| 17 | +```markdown |
| 18 | +### 项目 |
| 19 | +- 采用 monorepo 架构,使用 pnpm workspaces |
| 20 | +- 入口文件:packages/codingcode/src/cli.ts |
22 | 21 |
|
23 | | -可通过 `memory.extraTypes` 添加自定义记忆类型,通过 `memory.disabledTypes` 禁用内置类型。 |
| 22 | +### 用户偏好 |
| 23 | +- 偏好结构化 Markdown 输出 |
| 24 | +``` |
24 | 25 |
|
25 | 26 | --- |
26 | 27 |
|
27 | 28 | ## 自动提取 |
28 | 29 |
|
29 | | -Agent 在每次会话后自动执行记忆提取: |
| 30 | +记忆模式开启后,Agent 在会话结束时自动执行记忆更新: |
30 | 31 |
|
31 | | -1. 构建 system prompt,包含各记忆类型的提取指引 |
32 | | -2. 发送已有记忆 + 会话记录给 LLM |
33 | | -3. LLM 输出 `<memory>...</memory>` 块 |
34 | | -4. 提取块内容,返回新记忆文本(null 表示无新内容) |
35 | | -5. 矛盾时新信息替换旧条目,同一会话以最新为准 |
| 32 | +1. 读取记忆文件全文作为"已有记忆" |
| 33 | +2. 将会话记录(按 `[user]` / `[assistant]` / `[tool:名称]` 标注)与已有记忆一起发送给 LLM |
| 34 | +3. LLM 输出整份**最新版记忆**,放在 `<memory>...</memory>` 块中 |
| 35 | +4. 直接用输出内容整体替换记忆文件(受字节上限约束) |
36 | 36 |
|
37 | | -提取使用的模型可通过 `memory.model` 配置,留空则回退到主会话模型。 |
38 | | - |
39 | | ---- |
| 37 | +模型自行决定更新哪些内容:可以新增条目、修改过时信息、删除不再相关的内容,代码不做"模型只改动哪部分"的任何假设。若模型没有输出有效内容、或输出与当前文件一致,则不写入。 |
40 | 38 |
|
41 | | -## 记忆文件格式 |
| 39 | +### 提取提示词 |
42 | 40 |
|
43 | | -记忆文件使用 Markdown 格式,自动提取内容包裹在标记块中: |
| 41 | +提取行为的规范全部写在提示词中,代码不感知记忆内容结构: |
44 | 42 |
|
45 | | -```markdown |
46 | | -<!-- auto:begin --> |
47 | | -### user |
48 | | -- 偏好使用函数式编程风格 |
49 | | -- 常用技术栈:React + TypeScript |
| 43 | +- 只保留值得跨会话记住的信息:用户偏好与纠正、项目架构决策、技术选型、外部资源与链接等 |
| 44 | +- 忽略一次性任务、调试过程、报错堆栈、闲聊 |
| 45 | +- 输出必须是一份完整、自洽的最新记忆,而不是只输出变动部分 |
| 46 | +- 新旧信息矛盾时以最新为准 |
| 47 | +- 记忆用 `### 主题` 小节组织,小节下用 `- ` 列要点 |
50 | 48 |
|
51 | | -### project |
52 | | -- 采用 monorepo 架构,使用 pnpm workspaces |
53 | | -- 入口文件:packages/codingcode/src/cli.ts |
| 49 | +提取使用的模型可通过 `memory.model` 配置,留空则回退到主会话模型。 |
54 | 50 |
|
55 | | -### reference |
56 | | -- [API 文档](https://example.com/api) |
57 | | -<!-- auto:end --> |
| 51 | +--- |
58 | 52 |
|
59 | | -手动添加的内容可以写在标记块之外,不会被自动提取覆盖。 |
60 | | -``` |
| 53 | +## 手动编辑 |
61 | 54 |
|
62 | | -### 标记块机制 |
| 55 | +记忆文件就是普通 Markdown,用户可以直接编辑: |
63 | 56 |
|
64 | | -- `replaceAutoBlock()`:原子替换 `<!-- auto:begin -->` 和 `<!-- auto:end -->` 之间的内容 |
65 | | -- `stripMarkersForPrompt()`:去掉标记后注入系统提示 |
66 | | -- `enforceMaxBytes()`:按 `### ` 小节逐个裁剪到字节上限(默认 16384 字节) |
67 | | -- `mergeAutoBlocks()`:以 `### ` 小节名为 key 合并,incoming 覆盖 base |
| 57 | +- 手动写下的内容会在下次会话时作为记忆注入 Agent |
| 58 | +- 手动编辑也会被下一次自动提取作为"已有记忆"读到;保留、修改还是删除由模型根据后续对话自行决定 |
| 59 | +- 自动提取在写入前会重新检查文件:若提取期间文件被手动改动,则放弃本次写入,避免覆盖用户编辑 |
68 | 60 |
|
69 | 61 | --- |
70 | 62 |
|
71 | 63 | ## 配置 |
72 | 64 |
|
73 | | -在 `codingcode.yaml` 中配置记忆系统: |
74 | | - |
75 | | -```yaml |
76 | | -memory: |
77 | | - enabled: true # 启用长期记忆(默认 false) |
78 | | - model: "" # 记忆提取模型,空字符串回退到主模型 |
79 | | - maxBytes: 16384 # 记忆文件最大字节数 |
80 | | - promptMaxBytes: 8192 # 注入提示的最大字节数 |
81 | | - extraTypes: [] # 自定义记忆类型 |
82 | | - disabledTypes: [] # 禁用的记忆类型名 |
83 | | -``` |
84 | | -
|
85 | | -### 自定义记忆类型 |
| 65 | +在 `~/.codingcode/config.yaml` 中配置记忆系统: |
86 | 66 |
|
87 | 67 | ```yaml |
88 | 68 | memory: |
89 | | - enabled: true |
90 | | - extraTypes: |
91 | | - - name: feedback |
92 | | - description: 工作流程中的教训和已验证的方法 |
93 | | - enabled: true |
94 | | - - name: decision |
95 | | - description: 重要的架构和设计决策 |
96 | | - enabled: true |
97 | | - disabledTypes: |
98 | | - - reference # 禁用内置的 reference 类型 |
| 69 | + enabled: true # 启用长期记忆(默认 false) |
| 70 | + model: "" # 记忆提取模型,空字符串回退到主模型 |
| 71 | + promptMaxBytes: 8192 # 注入提示词的记忆内容最大字节数 |
99 | 72 | ``` |
100 | 73 |
|
101 | | ---- |
102 | | -
|
103 | | -## 手动编辑 |
104 | | -
|
105 | | -记忆文件采用 Markdown 格式,支持手动编辑。手动内容可写在 `<!-- auto:end -->` 标记之后,不会被自动提取覆盖: |
106 | | - |
107 | | -```markdown |
108 | | -<!-- auto:begin --> |
109 | | -### user |
110 | | -- 偏好使用函数式编程风格 |
111 | | -<!-- auto:end --> |
112 | | -
|
113 | | -### 手动备注 |
114 | | -- 项目部署流程:npm run build -> scp dist/ -> pm2 restart |
115 | | -- 数据库连接字符串在 Vault 中 |
116 | | -``` |
| 74 | +记忆文件本身有 16KB 的硬上限,超限时按 `### ` 小节从后往前裁掉超出部分。 |
0 commit comments