AI 后端会话网关:上下文管理要比模型调用更早设计
AI 后端会话网关:上下文管理要比模型调用更早设计
一、会话不是简单拼接历史消息
企业级 AI 后端常从一个模型调用接口开始,后来接入用户会话、知识库、工具调用和权限体系。最容易被低估的部分,是会话网关。很多系统把历史消息直接拼进 prompt,短期能跑,长期会出现上下文膨胀、权限混乱和成本失控。
会话网关的职责不是替模型思考,而是管理上下文边界。哪些历史可用,哪些需要压缩,哪些引用已经过期,哪些消息涉及敏感信息,都应该在网关层处理。模型调用之前,系统就要把上下文整理成可控输入。
二、网关要分离会话状态和模型请求
flowchart TD A[用户请求] --> B[会话网关] B --> C[权限校验] B --> D[上下文检索] D --> E[上下文压缩] E --> F[模型路由] F --> G[响应审计]会话状态应包括用户目标、历史摘要、工具结果、引用证据和策略版本。模型请求只是某一次调用的输入。把两者混在一起,会导致重试、切模型和回放测试都很困难。
上下文压缩也要有规则。保留用户约束、关键决策、当前任务状态和外部资源 ID,丢弃重复寒暄和失败尝试细节。压缩结果要能追溯原始消息,否则摘要一旦错,后续回答会连续跑偏。
压缩策略还应考虑任务类型。问答类会话可以激进压缩,只保留问答对和结论;创作类会话要保留用户提供的素材和约束;分析类会话要保留数据源、方法和中间结论。一种实现是按重要性打分,把低分消息逐步移除,直到满足长度限制。
三、Java 后端要把会话建模清楚
public record ConversationState( String conversationId, String userId, String summary, List<String> evidenceIds, String policyVersion, Instant updatedAt ) {}状态对象要显式,而不是把一段 JSON 字符串到处传。显式建模便于做权限校验、字段迁移和版本兼容。企业应用里,会话状态往往会活得比单次请求更久。
public PromptRequest buildPrompt(ConversationState state, UserMessage message) { if (!permissionService.canRead(state.userId(), state.evidenceIds())) { throw new AccessDeniedException("conversation evidence denied"); } return promptAssembler.assemble(state, message); }会话网关必须在组装 prompt 前做权限检查。不要把无权证据交给模型,再要求模型不要说。权限系统要比模型更靠前。
四、成本和隐私要一起治理
上下文越长,成本越高,泄露面也越大。网关应记录 input tokens、历史压缩比例、引用数量和敏感字段处理结果。某个会话如果持续膨胀,要触发压缩或让用户确认是否开启新任务。
隐私日志也要克制。可以记录 message hash、长度、策略版本和 traceId,不要把完整问题和答案写进普通日志。AI 后端处理的内容通常更敏感,日志策略必须从第一天设计。
会话迁移也要考虑。状态结构后续可能新增字段,比如预算、工具权限、引用快照和人工确认记录。给状态加 version,并提供迁移逻辑,可以避免旧会话在系统升级后无法恢复。迁移失败时,应让用户确认关键上下文,而不是把不完整状态继续传给模型。
隐私保护还要考虑数据驻留。如果企业有数据本地化要求,会话状态不能只存在公有云 Redis。可以按租户或地域配置存储位置,或者在网关层做数据分类,敏感会话使用本地存储。会话网关是隐私治理的关键节点,设计时要提前考虑合规要求。
五、总结
AI 后端会话网关要先管理上下文、权限、压缩、模型路由和审计,再进行模型调用。会话状态和单次模型请求必须分离。
上下文管理不是锦上添花。它决定企业级 AI 服务能不能长期稳定、可控、可审计地运行。会话上下文的 TTL 设置也值得关注——过短则用户频繁丢失对话历史,过长则存储和 Token 成本持续攀升,建议根据业务场景(客服 30 分钟、编程助手 2 小时、文档写作 24 小时)分层设置。
