LLM无状态架构详解:为什么大模型本身不会记住你的对话?

LLM无状态架构详解:为什么大模型本身不会记住你的对话?

文章目录

    • 开场:你的 AI 不是失忆,是根本没记过
    • 第一幕:有状态架构,程序员的"恋爱脑"
      • 2.1 什么叫有状态?
      • 2.2 生产环境的"三大暴击"
    • 第二幕:无状态——HTTP 的"渣男哲学"
      • 3.1 渣男的自我修养
      • 3.2 无状态的三大超能力
    • 第三幕:LLM 的"金鱼记忆"是怎么骗过你的
      • 4.1 你以为它记得你,其实它只是在"读剧本"
      • 4.2 代码里的真相
    • 第四幕:chatHistory 膨胀——你的钱包正在经历中年危机
      • 5.1 Token 账单:越聊越贵
      • 5.2 为什么 ChatGPT 不会变慢?
    • 第五幕:从 Prompt Engineering 到 Loop Engineering——打怪升级之路
      • 6.1 第一层:Prompt Engineering(抽卡阶段)
      • 6.2 第二层:Context Engineering(管家阶段)
      • 6.3 第三层:Loop Engineering(永动机阶段)
    • 终章:无状态不是缺陷,是地基

P.S. 目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。

开场:你的 AI 不是失忆,是根本没记过

大家好,我是那个在 AI 领域摸爬滚打了 22 年的老家伙。

当你调用await client.chat.completions.create()的时候,你以为你在跟一个有灵魂的数字生命促膝长谈,实际上你在干的事情跟刷微博没区别:发一个 HTTP 请求,等服务器回包,然后连接断开,服务器把你忘得一干二净。

对,就是 HTTP。那个 1991 年出生、比你家猫还老的协议。你的千亿参数大模型,本质上就是一台会写散文的 Apache 服务器。

扎心吗?更扎心的还在后面。

第一幕:有状态架构,程序员的"恋爱脑"

2.1 什么叫有状态?

有状态架构,通俗地说,就是服务器"动了真情"。

用户 A 来了,服务器在内存里给 A 开了个小房间,摆上沙发、茶几、对话历史,还贴了张合影。A 每次发消息,都得回这个房间聊。负载均衡器要是敢把 A 的请求转发到另一台服务器,那台服务器就会一脸懵:“你谁啊?我们认识吗?”

这像什么?像极了我那恋爱脑的朋友。对方回个"嗯",他能脑补出一部 80 集连续剧,还非得在同一家咖啡馆续集。

2.2 生产环境的"三大暴击"

这种架构在 demo 里跑起来温馨得像《老友记》,一到生产环境就秒变《死神来了》。

暴击一:内存爆炸。十万用户同时在线,每人存 8K token 的历史。8K token 是什么概念?大概是一篇小学生作文。十万篇小学生作文塞进内存,你的服务器会当场表演什么叫"内存溢出型自杀"。

暴击二:扩容噩梦。你想加两台机器分担压力?不好意思,有状态的请求就像认主的狗,只认原来的服务器。新机器在旁边干瞪眼,老机器累到吐舌头。这叫水平扩展?这叫水平摆烂。

暴击三:单点故障。存着你状态的那台服务器要是挂了,你的对话历史就跟你前任的承诺一样——烟消云散,查无此人。用户刚聊到"我打算买你们年费会员",服务器一重启,模型回一句:“您好,请问有什么可以帮您?” 用户:“帮我?帮我消消气吧。”

第二幕:无状态——HTTP 的"渣男哲学"

3.1 渣男的自我修养

无状态架构的核心理念就一句话:服务器不记仇,也不记恩。

每次请求都是一次全新的邂逅。你带着完整的自我介绍、前因后果、上下文背景,啪地拍在服务器脸上。服务器看完,生成回复,然后——格式化硬盘,清空记忆,迎接下一个请求。

这像什么?像渣男。但这是个高效率、可扩展、高可用的渣男。他不占你内存,不绑你服务器,不让你担心"他要是宕机了怎么办"。因为他对每个请求都一视同仁,来者不拒,去者不留。

RESTful API 为什么用 Header 传身份、用 Body 传数据?因为 HTTP 从娘胎里就信奉这个哲学:每个请求必须自包含。就像你去相亲,不能假设对方看过你前 20 次相亲的简历,你得每次都把房车学历重新报一遍。

3.2 无状态的三大超能力

超能力一:水平扩展自由。请求落到哪台机器上都一样,因为每台机器都"不认识"你,所以每台机器都能正确处理你。加机器就加容量,线性扩容,像给流水线加工人,而不是给恋爱关系加第三者。

超能力二:容错性拉满。一台服务器挂了?请求自动飘到另一台。用户完全无感。没有状态,就没有"状态丢失"。这就像你从不存钱,所以银行倒闭对你毫无影响——虽然听起来有点惨,但在工程上这叫"鲁棒性"。

超能力三:绝对公平。所有请求在服务器眼里都是陌生人。不存在"老用户插队"或"粘性会话"导致的资源倾斜。新用户的第一条请求和老用户的第 100 条请求,消耗的 CPU cycles 一模一样。社会主义架构,了解一下。

第三幕:LLM 的"金鱼记忆"是怎么骗过你的

4.1 你以为它记得你,其实它只是在"读剧本"

来,做个实验。你跟 ChatGPT 说:“请记住我叫张三。” 然后聊 20 轮别的。再问:“我叫什么名字?”

它答对了,对吧?你感动了,觉得它好温柔,好有记忆。

停。它答对不是因为它"记住了",而是因为客户端在每次请求时,都偷偷把你们前面 20 轮的对话全塞进了 messages 数组里。

模型每次推理都像是在读一个全新的剧本——从第一页读到最后一页,然后即兴续写下一页。它根本没见过"上一场戏",因为对它来说,从来就没有"上一场"。是客户端把前后两场戏的剧本缝在了一起,才让它看起来像个有记忆的老朋友。

这就好比你去看话剧,每幕之间灯光全黑,演员卸妆换场。你以为故事是连续的,其实演员每幕都是第一次演——是导演把剧本串了起来。模型就是那个演员,客户端就是那个导演,而你还以为演员真的入戏了。

4.2 代码里的真相

看看这段再普通不过的代码:

constchatHistory=[{role:'system',content:'你是一个严谨的助手'}];// 第一轮chatHistory.push({role:'user',content:'请记住我叫字节戴'});constresponse=awaitclient.chat.completions.create({model:'deepseek-v4-flash',messages:chatHistory// 全量提交});chatHistory.push({role:'assistant',content:response.choices[0].message.content});// 第二轮chatHistory.push({role:'user',content:'请问我的名字是什么?'});constresponse2=awaitclient.chat.completions.create({model:'deepseek-v4-flash',messages:chatHistory// 还是全量提交});

看明白了吗?第二轮请求的时候,messages 数组里已经塞了 4 条消息。模型看到的不是"用户问:我叫什么名字",而是"用户说请记住我叫字节戴 → 助手说好的 → 用户问请问我的名字是什么"。

模型:“哦,原来你叫字节戴啊。”

你:“哇,它记得我!”

模型内心:“我第一次见到你,但我从你带来的剧本里读到了。”

这就像你第一次见一个人,对方递给你一本自传,你翻到第 50 页看到"我叫字节戴",然后对方说"你居然记得我名字!"——你当然记得,因为刚看的。

第四幕:chatHistory 膨胀——你的钱包正在经历中年危机

5.1 Token 账单:越聊越贵

无状态架构有个隐藏 boss:chatHistory 会膨胀。

第 1 轮,messages 里有 3 条。第 10 轮,可能有 21 条。第 50 轮,那就是 101 条消息。而 LLM 的推理成本跟输入长度呈超线性关系——更长的上下文意味着更多的注意力计算、更高的 GPU 显存占用、更慢的响应速度。

以及,最重要的——更贵的 API 账单。

你每多发一条消息,前面所有的历史都要重新被模型"读一遍"。模型不是在"续写",它是在"重写"。你第 50 轮的回复,模型得把前 49 轮全部重新理解一遍,才能写出第 50 轮。

这就像你每跟朋友说一句话,都得把你们认识以来的所有聊天记录重新朗读一遍。你们的友谊能坚持多久?你的钱包会先坚持不住。

5.2 为什么 ChatGPT 不会变慢?

你可能会问:那为什么我在 ChatGPT 里聊 50 轮,感觉还是很快?

因为 OpenAI 在客户端做了 LRU 淘汰和容量限制。你的上下文窗口有个隐形的盖子,可能是 128K token,也可能是 32K。当历史消息快满的时候,最老的消息会被摘要、截断或直接丢弃

这就像你的大脑。你不会记得三天前午饭吃了什么,但你会记得五分钟前别人骂了你什么——因为"刚才的信息"对当前任务还关键。

但问题来了:哪些历史能丢?

把用户第 2 轮提到的关键约束删掉,第 15 轮的回复可能就完全跑偏。单纯的 LRU 策略无法区分"不再需要的闲聊"和"贯穿全程的核心需求"。

这就好比你扔衣服,按"最久没穿"扔,结果把唯一一套西装扔了,留了一堆 T 恤。下次面试的时候,你穿着"Hello Kitty"T 恤就去了。

第五幕:从 Prompt Engineering 到 Loop Engineering——打怪升级之路

6.1 第一层:Prompt Engineering(抽卡阶段)

这是最原始的手段。你字斟句酌地写 system prompt,试图让模型一次性理解所有需求。

这就像抽卡。好的 prompt 能提高抽到 SSR 的概率,但结果本质上不可精确控制。你写了 500 字的 prompt,模型回你一句"作为 AI 助手,我不能…",你当场想给服务器拔网线。

它的天花板很明显:无论 prompt 写得多好,模型始终只能看到"当前这一次"的信息。它是个"一次性选手",没有上下文,就没有灵魂。

6.2 第二层:Context Engineering(管家阶段)

从这里开始,你不再纠结"怎么写好 prompt",而是琢磨"怎么管好上下文"。

RAG(检索增强生成)把外部知识库动态塞进上下文。MCP(模型上下文协议)让模型按需调用工具获取实时信息。Skills 把领域能力封装成可组合的模块。

核心思想就一句:与其寄望于模型"知道",不如确保模型"看到"。

这就好比你考试。Prompt Engineering 是试图把答案背进脑子里;Context Engineering 是允许你带一张小抄进考场——但小抄上的内容,是你精心筛选过的。

6.3 第三层:Loop Engineering(永动机阶段)

这是当前最前沿的玩法。在上下文工程的基础上,引入反馈闭环。

单次推理扩展为"执行 → 观察 → 反思 → 再执行"的自主循环。每一次迭代都是一次独立的、无状态的 LLM 调用,但循环本身产生了涌现的"状态感"。

就像电影是由一帧帧静止画面连起来产生的运动错觉。每一帧本身不会动,但 24 帧每秒,你就看到了《阿凡达》。

Harness AI 工程就是这个思路。Agent 不是"一个有记忆的模型",而是"一个会循环调用无状态模型的系统"。记忆不在模型里,在循环的轨迹里。

这就好比你不是记住了怎么骑自行车,而是你的神经系统通过无数次"歪了→修正→歪了→修正"的循环,把平衡感刻进了肌肉。模型没有肌肉,但循环有痕迹。

终章:无状态不是缺陷,是地基

回过头看,无状态不是 LLM 的 bug,而是整个 AI 工程化的基石。

正是因为每次请求都是自包含的、无依赖的、可独立处理的,我们才能在其上构建出弹性伸缩的集群、实现容错转移、控制 token 预算、堆叠出越来越智能的系统行为。

理解这一点,再看那些眼花缭乱的 AI 框架和产品——LangChain、LlamaIndex、AutoGPT、Claude 的 Computer Use——你会发现它们的底层逻辑其实是相通的。

都在做同一件事:在无状态的 HTTP 请求之上,精密地管理"该带哪些信息给模型"。

Chatbot 的对话历史、RAG 的检索片段、Agent 的工具调用结果、Skill 的领域指令——本质上,它们都是在构造一个比上一次更"完整"的 messages 数组,然后发起一次新的、独立的、无状态的 HTTP 请求。

所以,LLM 工程的终极秘密是什么?

模型不需要记忆,你需要。

模型是个金鱼,但你可以当它的导演。每次喊 action,你把剧本拍它脸上,它演得比影帝还真。幕落了,它忘了。你记住了。然后你带着更厚的剧本,喊下一场 action。

22 年前,我刚开始搞AI的时候,最大的模型还没现在一个手机 app 大。那时候没人想到,"没有记忆"这件事,会成为千亿参数巨兽最核心的工程优势。

技术就是这么讽刺。你以为的缺陷,往往是设计的智慧。你以为的"忘记",恰恰是"自由"的开始。

好了,散场。记得把 chatHistory 清一下,token 挺贵的。

P.S. 目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。