为什么多轮对话必须带上 `assistant` 角色的历史回复 我们会把标记为assistant角色、也就是模型之前输出过的所有回复重新追加到对话历史中。为什么必须带上模型自己生成的消息 因为模型在两次接口调用之间不存在任何记忆留存。 每一次 API 请求都是无状态独立运行模型每次都会从零开始、完全清空上下文。 模型唯一能读取到的 “记忆”就是你手动填入消息列表messages list里的全部内容。 因此如果想要实现连贯的多轮对话你必须手动把完整历史上下文随请求一并传入。你需要携带的内容包括系统提示词、用户第一轮提问、模型上一轮给出的回复以及用户本次新的追问。模型会读取完整的整段对话记录。当它读到 “这座城市人口是多少” 时能明白句里的 “这座城市” 指代巴黎 —— 因为前一轮对话内容完整存放在消息列表中。 如果历史记录里缺少模型输出的 assistant 消息模型完全无法判断 “这座城市” 究竟指代什么。所有聊天机器人都是依靠这套机制维持上下文连贯性的 它没有真正意义上的持久记忆而是每一次调用接口时都把整段聊天记录完整重传给模型。为什么多轮对话必须带上assistant角色的历史回复1. 底层核心大模型 API 是无状态Stateless的大模型服务端不会保存任何对话缓存、会话记忆。 每一次你调用 API 发送请求都是一次全新、孤立的运算模型进程不会记住上一轮对话两次请求之间没有共享内存、没有持久化聊天记录它唯一的输入就是你本次请求里完整的messages数组。所有对话上下文只能由调用方你的代码手动拼接、完整传给模型。2. 指代、上下文依赖完全依靠完整对话链理解拿图里的例子拆解[ {role: system, content: Travel assistant}, {role: user, content: Capital of France?}, {role: assistant, content: Paris.}, {role: user, content: Population of that city?} ]用户第二句里的that city这座城市是指代代词必须依靠上文才能确定指代对象若缺失assistant: Paris.这条记录 模型只能看到法国首都是什么→ 这座城市人口多少 中间缺少模型给出的答案 “巴黎”模型无法推断that city指巴黎会出现语义断裂、答非所问。带上完整assistant回复 对话逻辑闭环用户提问→模型给出答案→用户基于模型的答案继续追问代词的指代关系完整可追溯。3. 对话角色规则要求交替 user /assistant主流大模型OpenAI、通义千问、DeepSeek、GLM 等都强制要求messages遵循交替结构system → user → assistant → user → assistant ...角色顺序错乱、缺少assistant消息会触发接口报错即使不报错模型也会混淆 “谁说了什么”分不清哪些是用户指令、哪些是自己之前的回答逻辑混乱。4. 模型学习逻辑区分双方发言边界训练时模型通过role字段区分两种身份user人类用户的提问、需求assistant模型自身输出的回答。当它生成新一轮回复时会模仿自己历史assistant消息的语气、格式、回答风格 如果删掉历史assistant内容模型丢失自己之前的输出样本回答风格、上下文承接都会脱节。5. 通俗总结模型没有 “大脑记忆”每一轮对话都要你把完整聊天剧本发给它。 剧本里不能只写用户说的话必须同时写上模型自己上一轮说了什么否则它不知道自己之前给出了什么结论看不懂你后续带指代、承接上文的追问。简单类比 你每次和模型聊天都要把完整聊天记录截图发给它它只看这张截图来回答截图里少了它自己上一句的回答它就看不懂你接下去的话。