会话管理
核对日期:2026-05-09。
1. 定义与边界
会话管理是对用户与 Agent 多轮交互的生命周期、上下文窗口、消息历史、权限范围和隐私策略进行管理。它不同于状态管理:会话关注“用户连续交互上下文”,状态关注“某次任务执行进度”。
2. 为什么重要
Agent 常常需要引用前文、追踪用户偏好、继续未完成任务。但生产会话不能无限增长,也不能让一个用户、租户或权限域的上下文泄漏到另一个会话。会话管理决定了模型看到什么、忘记什么、压缩什么、保留多久。
3. 核心机制
会话对象建议包含:
{
"session_id": "sess_01",
"tenant_id": "tenant_a",
"user_id": "user_1",
"channel": "web",
"status": "active",
"context_policy": "support_default_v2",
"message_window": ["msg_101", "msg_102"],
"summary_ref": "summary_33",
"active_runs": ["run_01"],
"expires_at": "2026-06-08T00:00:00Z"
}
上下文构建流程:
4. 架构模式
| 模式 | 适用场景 | 风险 |
|---|---|---|
| 客户端持有历史 | 简单聊天、低敏场景 | 易篡改、泄漏、超长。 |
| 服务端会话库 | 多端同步、权限控制 | 需要 TTL、归档和删除。 |
| 摘要 + 最近窗口 | 长对话 | 摘要漂移会影响行为。 |
| 会话 + 任务 run 分离 | 长任务和异步执行 | 需要清晰映射关系。 |
5. 工程实现
上下文预算器:
def build_context(session_id, new_message, token_budget):
session = sessions.get(session_id)
messages = messages_repo.recent(session_id, limit=30)
summary = summaries.latest(session_id)
candidates = [system_prompt(), summary, *messages, new_message]
selected = trim_to_budget(candidates, token_budget)
return enforce_context_boundaries(selected, session.tenant_id)
会话与 run 的关系:
- 一个 session 可以有多个 run。
- 一个 run 必须绑定一个 session 或明确声明为无会话后台任务。
- session 关闭不等于 run 自动取消,取消策略要显式配置。
6. 生产实践
- 会话 TTL 按业务和合规要求配置,不要永久保留默认聊天历史。
- 对摘要做版本化,记录摘要模型、Prompt 和原始消息范围。
- 对跨渠道会话合并设置用户确认。
- 每次模型调用都记录实际上下文组成,而不是只记录 session id。
- 对上下文注入外部文档时加来源边界和可信级别。
7. 常见反模式
- 把所有历史消息无条件塞进模型,导致成本和泄漏风险失控。
- 只依赖模型摘要,不保留可审计原文引用。
- 会话 id 可预测,缺少租户/用户权限校验。
- 用户切换角色或权限后继续复用旧上下文。
- 将长期记忆写入会话历史,导致隐私删除困难。
8. 评测方法
- 上下文选择准确率:关键历史是否被保留,无关历史是否被剔除。
- 摘要一致性:摘要是否保留事实、限制和用户意图。
- 隔离测试:跨用户、跨租户、跨权限上下文不会混入。
- 成本测试:P50/P95 输入 token 是否在预算内。
9. 安全与治理
- 会话读写必须校验
tenant_id、user_id和授权范围。 - 敏感消息可以只存密文或引用,低权限日志只存摘要。
- 提供用户数据删除和会话导出能力时要覆盖摘要、附件和 trace 引用。
- 对 prompt injection 内容做标记,避免被摘要提升为系统事实。
10. 权威资料
- OpenAI Conversation state: https://developers.openai.com/api/docs/guides/conversation-state
- OpenAI Context management and compaction: https://developers.openai.com/api/docs/guides/compaction
- LangGraph persistence and threads: https://docs.langchain.com/oss/python/langgraph/persistence
- NIST AI Risk Management Framework: https://www.nist.gov/itl/ai-risk-management-framework
11. 二次精修:会话对象与保留策略
会话管理要同时服务上下文连续性、权限隔离和隐私合规。建议把会话拆成元数据、可见消息、隐藏运行证据三层。
{
"session_id": "ses_01J...",
"tenant_id": "t_123",
"user_id": "u_456",
"channel": "web",
"created_at": "2026-05-09T10:00:00Z",
"last_active_at": "2026-05-09T10:05:00Z",
"retention_policy": "standard_30d",
"context_policy": {"max_messages": 30, "summarize_after_turns": 12, "redact_pii": true},
"active_runs": ["run_789"],
"access_scope": ["support:read", "ticket:create"]
}
| 层级 | 内容 | 是否给模型 | 是否进审计 |
|---|---|---|---|
| Session metadata | 租户、用户、渠道、保留策略 | 部分 | 是 |
| Conversation window | 最近用户和助手消息 | 是 | 是 |
| Summary memory | 压缩后的长期上下文 | 是 | 是 |
| Run evidence | tool call、trace、审批记录 | 通常否 | 是 |
| Security context | 权限、风控、数据分级 | 只给必要摘要 | 是 |
12. 会话生命周期
| 指标 | 目标 |
|---|---|
| Context Miss Rate | 因会话摘要丢失关键信息导致失败的比例 |
| Session Cross-talk Rate | 不同用户/租户上下文混入,目标为 0 |
| Stale Permission Rate | 会话权限与当前权限不一致的比例 |
| PII Redaction Coverage | 会话日志中敏感字段脱敏覆盖率 |
| Resume Success Rate | 中断后恢复同一任务的成功率 |
治理要求:会话 ID 不能作为权限凭证;共享链接要重新鉴权;摘要记忆要保留来源消息引用;用户删除请求要能级联删除可识别信息;客服坐席代操作必须写入代理人身份。
13. 补充权威资料
- OWASP Session Management Cheat Sheet: https://cheatsheetseries.owasp.org/cheatsheets/Session_Management_Cheat_Sheet.html (核对日期:2026-05-09)
- OpenAI Agents SDK sessions: https://openai.github.io/openai-agents-python/sessions/ (核对日期:2026-05-09)
14. 主控验收清单
- 会话是否绑定租户、用户、渠道和权限范围。
- 会话恢复是否能续接未完成 run。
- 会话摘要是否保留来源消息引用。
- 权限变化后是否刷新或失效会话上下文。
- 会话删除是否覆盖消息、摘要、附件和 trace 引用。
- 共享链接是否重新鉴权。
- 是否区分模型可见上下文和审计证据。
- 是否对 prompt injection 内容打标,避免进入长期摘要。
- 是否有跨用户上下文混入的自动检测。
- 是否记录会话保留策略和过期时间。
- 是否对高风险会话使用更严格审计。
- 是否能按 session_id 找到全部 run 和反馈。
- 是否对隐私字段加密或引用化存储。
- 是否把会话恢复失败加入回归样本。
- 是否定期抽检会话摘要质量。