大模型多轮对话配置:从零搭建带上下文记忆的接口
多轮对话配置的本质,是在每次请求时把历史对话按顺序重新发给模型,让模型根据完整上下文生成回复。
大模型 API 本身通常不保存会话状态,所谓“记忆”需要你在客户端或服务端维护一个消息列表。
本文以 OpenAI 兼容接口为例,讲清楚从零配置多轮对话的步骤、代码和排错方法,适用于刚接触大模型 API 的开发者。
先确认接口格式和运行环境
大多数大模型服务商提供 OpenAI 兼容的 /v1/chat/completions 接口。
开始前需要准备三样东西:
- 一个可用的 API Key,以及服务商提供的 Base URL(例如
https://api.example.com/v1,请替换为你实际使用的地址) - 支持 HTTP 请求的运行环境,本文用 Python 3.8 及以上版本演示
- 安装
requests库:pip install requests
关键概念先理清:多轮对话请求体中的 messages 是一个数组,每个元素包含 role 和 content。role 通常取 system(系统设定)、user(用户输入)、assistant(模型回复)。
模型只根据你本次传入的 messages 生成下一条回复,不会自动记住上一轮。
配置多轮对话的核心步骤
维护消息历史列表
每次用户输入后,把用户消息追加到列表,再连同历史一起发送。
收到回复后,把助手回复也追加进去,供下一轮使用。
下面是一个最小可运行示例:
import requests
API_KEY = "你的API Key"
BASE_URL = "https://api.example.com/v1/chat/completions"
messages = [
{"role": "system", "content": "你是一个简洁的技术助手。"}
]
def chat(user_input):
messages.append({"role": "user", "content": user_input})
resp = requests.post(
BASE_URL,
headers={"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"},
json={"model": "你的模型名称", "messages": messages},
timeout=60
)
resp.raise_for_status()
reply = resp.json()["choices"][0]["message"]["content"]
messages.append({"role": "assistant", "content": reply})
return reply
print(chat("你好,我叫小明"))
print(chat("我叫什么名字?"))
预期结果:第二次调用时模型能回答出“小明”,说明历史消息被正确携带。
如果回答不知道,优先检查 messages 是否在两次调用之间被重置。
控制上下文长度
历史越长,请求 token 越多,成本和延迟都会上升,还可能超出模型上下文上限。
建议在追加消息前做简单裁剪:保留 system 消息,从最早的非系统消息开始丢弃,直到总长度低于你设定的阈值。
不要直接按条数一刀切,因为单条消息长度差异可能很大。
把配置放到服务端
如果面向网页或 App 用户,API Key 不能放在前端。
应在服务端维护会话,例如用会话 ID 对应一个 messages 列表,存到内存或 Redis 中。
每次请求带上会话 ID,服务端取出历史、追加新消息、调用模型、再写回。
注意设置会话过期时间,避免历史无限增长。
容易踩坑的地方
- 角色顺序错误:
messages中user和assistant应交替出现,不要把两条user消息连续发送,部分服务商会返回 400。 - 忘记追加助手回复:只追加用户消息,模型会丢失自己上一轮说过什么,表现为前后矛盾。
- system 消息位置:通常放在数组第一条,部分模型对位置敏感,不要随意插到中间。
- 超时设置过短:多轮长上下文响应可能较慢,建议客户端超时不低于 30 秒,并根据实际响应调整。
- 密钥泄露:不要把 API Key 写进前端代码或公开仓库,使用环境变量或服务端配置文件。
验证多轮配置是否生效
配置完成后,按以下顺序检查:
- 连续发送两轮相关提问,例如先自我介绍再问“我刚才说了什么”,确认模型能引用前文。
- 打印每次请求的
messages长度和内容,确认历史在增长且角色交替正确。 - 用
resp.status_code和返回体检查是否出现 400、401、429。401 多为密钥问题,429 多为频率或额度限制,400 常见于消息格式或上下文超限。 - 观察 token 用量是否随轮次合理上升,若异常暴涨,检查是否重复追加了相同历史。
多轮对话配置并不复杂,核心就是“保存历史、按序发送、控制长度、服务端保管密钥”。
先把最小示例跑通,再逐步加入会话存储和裁剪逻辑,遇到报错时优先核对 messages 的结构和角色顺序。