sessionId / userId 与会话注入
约 456 字大约 2 分钟
布欧-Lewyon
2026-06-08
首页 › Agent Spring Boot › Memory 对话记忆
双 ID 模型
| ID | 作用域 | 示例来源 |
|---|---|---|
userId | 长期记忆 | 前端 localStorage,默认 default |
sessionId | 短期记忆 | 每条会话 ID,= 前端 conversationId |
sessionId 解析(ChatController)
优先级:query → header → 自动生成 UUID
private static String resolveSessionId(String querySessionId, String headerSessionId) {
if (querySessionId != null && !querySessionId.isBlank()) {
return querySessionId.trim();
}
if (headerSessionId != null && !headerSessionId.isBlank()) {
return headerSessionId.trim();
}
return UUID.randomUUID().toString().replace("-", "");
}请求应带 X-Session-Id 头或 body 里的 sessionId,否则服务端每次新建 session,短期记忆对不上。
POST /api/agent/chat(推荐)
@PostMapping("/agent/chat")
public Mono<Map<String, Object>> agentChatPost(
@RequestBody AgentChatRequest request,
@RequestHeader(value = "X-Session-Id", required = false) String headerSessionId) {
String sessionId = resolveSessionId(request.sessionId(), headerSessionId);
return agentService.agentChat(
request.userId(),
sessionId,
request.message(),
request.history()
).map(answer -> Map.of("answer", answer, "sessionId", sessionId));
}AgentChatRequest 字段:userId, sessionId, message, history[]。
历史来源优先级
AgentService.resolveHistory():
- 前端 body
history[](推荐,与 UI 一致) - Redis
memoryManager.getShortTermContext(sessionId)降级
if (clientHistory != null && !clientHistory.isEmpty()) {
// 转成 ChatMessage,仅 user/assistant
}
return memoryManager.getShortTermContext(sessionId);前端 App.tsx 把当前会话消息列表作为 history 提交,Redis 作断线恢复备份。
单轮组装顺序
List<ChatMessage> history = resolveHistory(sessionId, clientHistory);
String systemPrompt = memoryManager.buildSystemPrompt(userId);
messages.add(new ChatMessage("system", systemPrompt));
appendChatHistory(messages, history);
messages.add(new ChatMessage("user", userMessage));
memoryManager.rememberShortTerm(sessionId, new ChatMessage("user", userMessage));
// callLLM ...
memoryManager.rememberShortTerm(sessionId, new ChatMessage("assistant", answer));前端约定
conversationId生成:${Date.now()}-${random}(utils/id.ts)sessionId = conversationIduserId存localStoragekeyagent-memory:userId- 会话列表存
agent-memory:conversations(仅 UI,非服务端)
学习点
sessionId必须在一个对话内稳定,否则短期记忆碎片化。- 前端
history与服务端 Redis 双写,以客户端 history 为准。 - 长期记忆按
userId隔离。
小结
- POST Agent 接口携带
userId、sessionId、history。 resolveSessionId三级回退;resolveHistory客户端优先。- 每轮先注入 system+历史,再记 user/assistant 到 Redis。
上一节:记忆模型
下一节:Short/Long Term Service
