目标:把“短期记忆/长期记忆/外部状态”设计清楚,避免 Agent 走神与越权。
🎯 文章目标
- 明确短期/长期记忆的边界与用途
- 设计外部存储结构与权限隔离
- 给出最小实现与观测指标
📚 背景/前置
- 短期:会话内上下文(窗口),适合临时变量/近因信息
- 长期:外部存储,如 Redis/DB/向量库,适合用户偏好/历史任务/知识片段
- 状态:长任务状态机 + 幂等键,便于恢复与回放
🔧 核心内容
1) 记忆与状态建模
- 记忆项:
- 访问策略:按 scope 限权;敏感项加密存储
- 状态机:pending → running → succeeded/failed(含重试/回滚)
2) 外部存储最小实现(Node.js + Redis)
javascript
import Redis from 'ioredis'
const r = new Redis(process.env.REDIS_URL)
export async function setMemory(user, key, value, ttl){
const k = `mem:\${user}:\${key}`
await r.set(k, JSON.stringify({ value, at: Date.now() }), 'EX', ttl || 86400)
}
export async function getMemory(user, key){
const v = await r.get(`mem:\${user}:\${key}`)
return v ? JSON.parse(v).value : null
}
3) 向量化长期记忆(可选)
- 将“用户偏好/历史摘要”做嵌入,TOP-K 召回后作为上下文
- 注意:引用必须显式,避免“凭空编造”
4) 观测与治理
- 指标:命中率、平均大小、过期/清理、越权告警
- 回放:保留关键任务的状态转移与输入输出
💡 实战示例:记忆注入提示
javascript
const mem = await getMemory(userId, 'pref')
const sys = mem ? `用户偏好:\${JSON.stringify(mem)}` : '无用户偏好'
const msgs = [ { role:'system', content: sys }, { role:'user', content: '帮我生成日报' } ]
📊 对比/取舍(速查)
- 会话内记忆:易用,但受窗口限制
- 外部记忆:强大,但要治理权限与生命周期
🧪 踩坑与经验
- 混用 scope 导致越权:用户/组织数据必须隔离
- 过度保留:长期不清理导致成本与隐私风险
- 引用不显式:让模型“编造”,需在提示与模板中明确
📎 参考与延伸
- LLM Memory 模式与长任务状态管理
- Redis/向量库最佳实践
💭 总结
- 以“短期/长期/外部状态”三件套构建稳健记忆
- 用权限/TTL/观测治理,避免越界与走神