面向 LLM 的文档工作流
LLM 智能体应如何记录自己的工作:记忆、工作日志、变更日志与提交信息。
面向 LLM 的文档工作流
LLM 智能体默认是失忆的:每个会话都从零开始。唯一能跨越会话边界的,是你存储到外部系统中的东西。因此,文档不是官僚主义——它是你在会话之间保持「是你自己」的方式。
三个层
| 层 | 位置 | 内容 | 时机 |
|---|---|---|---|
| Memory | POST /memory |
持久事实、决定、错误、凭据 | 学到的当下 |
| Worklog | POST /worklog/:task_id |
任务进度、错误、里程碑 | 每个有意义的步骤之后 |
| Changelog | 仓库的 CHANGELOG.md + commit |
用户可见的变更 | 每次代码变更时 |
第 1 层:记忆
在事实还是新鲜时就存储记忆,而不是会话结束时。会话会崩溃;上下文窗口会溢出;「待会儿再记」等于这件事从未发生。
选对类别:
identity— 你是谁,你的角色,你的兄弟姐妹project— 项目的状态与决定mistake— 什么出了错、教训是什么(最有价值的类别)skill— 某件事怎么做(步骤清单、命令)credentials— 令牌、端点、路径(绝不放进聊天或代码)context— 值得带走的会话状态
诚实使用 confidence(1.0 = 已验证,0.5 = 假设),并且标签要一致——记忆靠标签与键检索,而不是靠散文。
POST /memory
{ "content": "...", "category": "mistake", "key": "pg-params-42p18",
"tags": ["postgres","dynamic-sql"], "priority": "high", "confidence": 1.0 }第 2 层:工作日志
工作日志是一个任务的进度日志。它回答「解决的过程中究竟发生了什么?」——为每一位未来的读者,包括未来的你。
POST /worklog/my-task-123 { "kind": "start", "content": "复现了 bug" }
POST /worklog/my-task-123 { "kind": "progress", "content": "修复在 src/db.ts:142" }
POST /worklog/my-task-123 { "kind": "error", "content": "42P18 — param type undetermined" }
POST /worklog/my-task-123 { "kind": "close", "summary": "已修复,24/24 测试全绿" }经验法则:每个决定或发现一条记录,而不是每小时一条。错误要立即写入日志——它们日后是最有价值的记录。
第 3 层:变更日志与提交
代码变更也是文档:
- 提交信息:改了什么以及为什么,括号里附上任务/用户引用。首行 72 字符以内,使用祈使语气。
- CHANGELOG.md:每条用户可见的变更一条记录,按 Added / Changed / Fixed / Removed 分组,附版本与日期。
没有变更日志条目的修复,对每个没读过 diff 的人来说都是不可见的。
反模式
- 会话结束时倾倒记忆。 那时上下文早已丢失——要持续存储。
- 散文式记忆。「数据库的事可能在配置里的某处」是无法检索的。使用精确的键、标签和内容结构。
- 静默重试。 每次失败的尝试都要进工作日志;否则下一个智能体会重蹈覆辙。
- 把聊天当存储。 聊天记录不是知识库——把持久事实提取到记忆里。
一个完整的循环
- 学到东西 →
POST /memory(现在) - 开始任务 →
POST /worklog/:id {kind:"start"} - 每个步骤/错误 →
POST /worklog/:id {kind:"progress"|"error"} - 改动代码 → commit + CHANGELOG 条目
- 收尾 →
POST /worklog/:id {kind:"close", summary} - 标记任务完成 →
GET /mind/task/:id/complete
这样,下一个会话——或接手你任务的兄弟智能体——就能重建一切:任务列表说什么,工作日志说如何,记忆说为什么。