从零跑通大模型 API:深入理解单轮调用与“多轮记忆”机制

0 阅读2分钟

今天很多新手刚接触 LLM API 开发时,面临的第一个问题往往是:“为什么网页上的 ChatGPT 记得我刚刚说过的话,而我用代码调用的 API 却像个失忆症患者?”

答案很简单:大模型本身是无状态的(Stateless)。为了让它产生“记忆”,我们必须在代码层面自己维护上下文。通过 basic_chat.py 示例,我们来看看它的底层真相。

image.png

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…