今天很多新手刚接触 LLM API 开发时,面临的第一个问题往往是:“为什么网页上的 ChatGPT 记得我刚刚说过的话,而我用代码调用的 API 却像个失忆症患者?”
答案很简单:大模型本身是无状态的(Stateless)。为了让它产生“记忆”,我们必须在代码层面自己维护上下文。通过 basic_chat.py 示例,我们来看看它的底层真相。
1. OpenAI 兼容格式的三种角色 (Role)
目前行业内所有主流大模型(无论是 OpenAI、智谱、Kimi 还是 DeepSeek),在传递消息时都沿用了统一的角色规范:
system(系统):这是给 AI 设置“人设”的最高指令。比如你是一个资深翻译家。AI 会极其敬畏这一条指令。user(用户):顾名思义,这就是你当前提问的话。assistant(助手):这是 AI 曾经回复过的话。它也是实现上下文记忆的秘密武器!
2. 单轮对话的典型请求
在单轮请求中,你发送的其实是一个大数组(List):
[
{"role": "system", "content": "用一句话回答我的问题。"},
{"role": "user", "content": "请问天空为什么是蓝色的?"}
]
AI 回复完:因为瑞利散射。 对局就结束了,服务器立刻丢掉这段记忆。
3. 多轮上下文(记忆)是如何实现的?
如果用户紧接着问:“那晚间为什么是红色的?” 由于模型失忆,如果你只发这一句话过去,它根本不知道你提到的“晚间”前面对应的是“天空”。
因此,正确的代码逻辑是:在本地维护一个大数组,把 AI 刚才的回答打包塞进去,和新问题一起发给服务器。
[
{"role": "system", "content": "用一句话回答我的问题。"},
{"role": "user", "content": "请问天空为什么是蓝色的?"},
{"role": "assistant", "content": "因为瑞利散射。"},
{"role": "user", "content": "那晚间为什么是红色的?"}
]
看到了吗?这就是多轮对话的本质!我们是把整个历史聊天记录像雪球一样越滚越大,每次都完整地一起发给 AI。
所以,这也就解释了为什么对话越长,API 消耗的 Token 计费就越贵了,因为历史记录每次都被重新算钱提交了一遍!
本文是个人学习大模型方向时的实战小记,希望对准备入门 AI 开发的大家有所启发。
感谢关注,我会持续更新,欢迎查看相关源码实现与学习记录:
github.com/start007-sm…