ShortTermMemoryService 与 LongTermMemoryService
约 481 字大约 2 分钟
布欧-Lewyon
2026-06-08
首页 › Agent Spring Boot › Memory 对话记忆
ShortTermMemoryService
Redis LIST,每条消息 JSON 序列化:
public void addMessage(String sessionId, ChatMessage message) {
String k = "session:" + sessionId;
redis.opsForList().leftPush(k, serialize(message));
redis.opsForList().trim(k, 0, maxMessages - 1);
redis.expire(k, sessionTtl);
}
public List<ChatMessage> getContext(String sessionId) {
List<String> jsonList = redis.opsForList().range("session:" + sessionId, 0, -1);
// 反序列化,顺序调整为时间正序
}leftPush+trim:保留最近 N 条(默认 20)- 每次写入刷新 TTL(默认 120 分钟)
LongTermMemoryService
单条记忆 HASH 字段:
content, category, keywords, importance, created_at, user_id写入流程:
- 生成
memoryId HSET memory:{userId}:{memoryId}ZADD memory:{userId}:index(score=时间戳)- 拆
keywords写入memory:{userId}:kw:{word}SET - 超过
max-memories时淘汰最旧
检索 search(userId, query):
- 拆 query 为关键词
- 从倒排 SET 取候选 id
- 按 ZSET 时间或匹配度排序,返回 top-K
MemoryManager 编排
public String buildSystemPrompt(String userId) {
// 角色 + Tool 说明
List<MemoryItem> memories = longTermMemory.listAll(userId);
// 最多注入 10 条到 system
}长期记忆不进 messages[] 每条重复,而是压缩进 system,节省 Token。
记忆相关 Tool(6 个 Tool 中的 4 个)
| Tool | 作用 |
|---|---|
save_memory | 模型主动存长期记忆 |
search_memory | 关键词检索 |
list_memories | 列出全部 |
delete_memory | 删除指定条 |
用户说「记住我喜欢喝美式」→ 模型调 save_memory → LongTermMemoryService.save()。
REST 管理接口(MemoryController)
| 方法 | 路径 |
|---|---|
| GET | /api/memory/list?userId= |
| GET | /api/memory/stats?userId= |
| POST | /api/memory/save |
| DELETE | /api/memory/{memoryId}?userId= |
前端记忆面板 api/memory.ts 对接,可人工增删记忆。
RedisConfig
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
return new StringRedisTemplate(factory);
}本地 localhost:6379,Lettuce 连接池。
学习点
- LIST + LTRIM = 滑动窗口;HASH + ZSET + SET = 可检索长期库。
- Tool 让模型主动写记忆,比纯规则抽取更灵活。
MemoryController提供人工运维入口。
小结
- 短期:
session:{id}LIST;长期:memory:{userId}:*多结构组合。 MemoryManager拼 system;Tool 负责 CRUD 长期记忆。- 需本地 Redis,
docker run -p 6379:6379 redis即可开发。
上一节:sessionId / userId
下一节:记忆窗口与 Tool 联动
