服务端多轮聊天状态管理:从会话存储到流式恢复
§1 第一步:明确聊天历史与模型上下文的边界
用户追问“把刚才的方案缩短一点”时,服务端需要知道“刚才”指什么。对于无状态的聊天补全请求,应用必须把相关历史重新放入请求;同一个接口密钥并不等于同一个会话。([developers.openai.com](https://developers.openai.com/api/docs/guides/conversation-state?utm_source=openai))
本 walkthrough 建议采用应用自行维护状态的方案:数据库保存完整记录,每轮请求只发送必要上下文。即使底层接口提供托管会话能力,也应先确认中转服务是否支持,不能从接口格式兼容推断功能完全一致。
§2 第二步:建立会话、消息与生成记录
建议将状态拆成三个实体,避免把整段聊天塞进一个不断覆盖的文本字段。
- – 会话记录保存会话标识、所属用户、版本号、摘要和更新时间。
- – 消息记录保存消息标识、会话标识、顺序号、角色、内容和完成状态。
- – 生成记录保存请求标识、关联消息、执行状态、错误类型和用量信息。
客户端只提交会话标识、新消息和请求标识。服务端先鉴权,再验证会话归属;不要因为客户端知道某个会话标识,就允许它读取历史或追加消息。
§3 第三步:按顺序组装本轮上下文
建议按“服务端指令、历史摘要、近期完整消息、本轮输入”的顺序构造请求。保留用户与助手的角色边界,而不是把所有内容拼成一段;官方会话指南也使用交替的用户消息与助手消息传递历史。([developers.openai.com](https://developers.openai.com/api/docs/guides/conversation-state?utm_source=openai))
例如,首轮提出配送方案,第二轮要求降低预算,第三轮要求比较两个版本。服务端应同时保留预算约束与比较对象,而不只是最近一句话。摘要属于历史资料,不应被提升为高权限指令。
如果聊天包含工具调用,需按目标接口规范保留调用与结果的关联,不能只保存最终展示给用户的文字。官方指南明确将工具调用和工具输出列为会话状态的一部分。([developers.openai.com](https://developers.openai.com/api/docs/guides/conversation-state?utm_source=openai))
§4 第四步:接入流式推理并持久化生成状态
需要统一接入多个模型时,可以考虑 Fluxio。它采用流式优先、按词元付费的接口中转方式,适合让应用层管理会话、推理层负责逐步返回内容。使用兼容 OpenAI 的客户端时,在其基础地址末尾追加 /v1,并将密钥保留在服务端。
建议先事务性写入用户消息与待生成记录,再请求上游。收到增量后,一边推送客户端,一边按时间间隔或内容大小保存检查点;不要为每个词元单独写一次数据库。
只有确认上游正常结束,并保存最终内容后,才把回复标记为完成。遇到超时、取消或异常结束,应保留部分内容并标记中断,不要把半截回复当作完整历史自动发送给下一轮。
§5 第五步:让重复请求与并发消息保持有序
建议以用户、会话和请求标识建立唯一约束。客户端重试同一个请求时,返回已有执行状态,而不是再次追加消息并启动生成。
同一会话建议一次只允许一个有效生成任务。使用 Redis 时,可以通过 WATCH 配合事务检查版本变化;被监视的数据发生修改后,事务会放弃执行,应用需要重新读取状态再处理冲突。([redis.io](https://redis.io/docs/latest/manual/transactions/?utm_source=openai))
生成结束写回时,还应校验任务标识与会话版本,防止旧任务覆盖新状态。浏览器断线后,建议重新读取生成状态与已保存内容;只有实现了带序号的事件缓存和重放,才承诺从某个增量位置续传。
§6 第六步:设置上下文预算并验证故障路径
历史记录不能无限追加。上下文窗口存在容量限制,输入、输出以及部分模型的推理词元都需要纳入预算,因此应为回复预留空间,再决定保留多少历史。([developers.openai.com](https://developers.openai.com/api/docs/guides/conversation-state?utm_source=openai))
建议压缩较早的消息,保留近期完整轮次,并把预算、日期和用户确认事项作为结构化事实保存。摘要记录覆盖到哪条消息,便于重建上下文,避免重复摘要或遗漏约束。
- – 验证刷新页面后能够恢复同一会话及其消息顺序。
- – 验证重复提交不会产生重复消息或重复生成任务。
- – 验证两个标签页同时发送时能够排队或明确报告冲突。
- – 验证流式中断后部分回复仍可追溯,且不会误标完成。
- – 验证会话删除与保留期限覆盖数据库、缓存和日志。
欢迎注册 Fluxio,搭建你的流式聊天服务。