Skip to content

目标:把“短期记忆/长期记忆/外部状态”设计清楚,避免 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/观测治理,避免越界与走神