大模型无状态架构:从 HTTP 协议到 Harness AI 工程的深度解析

本文基于 agent/stateless 目录下的设计笔记与 Demo 项目,系统性地梳理无状态(Stateless)架构在大模型应用中的核心原理、工程演进路径及实践方案。


目录

  1. [引言:LLM 调用的本质是什么?](#引言:LLM 调用的本质是什么? "#1-%E5%BC%95%E8%A8%80llm-%E8%B0%83%E7%94%A8%E7%9A%84%E6%9C%AC%E8%B4%A8%E6%98%AF%E4%BB%80%E4%B9%88")
  2. 无状态架构深度解析
  3. [LLM 无状态运行机制](#LLM 无状态运行机制 "#3-llm-%E6%97%A0%E7%8A%B6%E6%80%81%E8%BF%90%E8%A1%8C%E6%9C%BA%E5%88%B6")
  4. 工程化三阶段演进
  5. [ChatHistory 的挑战与对策](#ChatHistory 的挑战与对策 "#5-chathistory-%E7%9A%84%E6%8C%91%E6%88%98%E4%B8%8E%E5%AF%B9%E7%AD%96")
  6. [实践:Demo 项目剖析](#实践:Demo 项目剖析 "#6-%E5%AE%9E%E8%B7%B5demo-%E9%A1%B9%E7%9B%AE%E5%89%96%E6%9E%90")
  7. 总结与展望

1. 引言:LLM 调用的本质是什么?

在讨论无状态架构之前,我们需要回到一个最根本的问题:调用大模型(LLM)接口的本质是什么?

答案出奇地简单:

ini 复制代码
调用 LLM = HTTP 请求 → 消耗算力 → 生成结果
sequenceDiagram participant Client as 客户端 participant LB as 负载均衡器 participant GPU1 as GPU 服务器 1 participant GPU2 as GPU 服务器 2 participant GPU3 as GPU 服务器 3 Client->>LB: POST /v1/chat/completions LB->>GPU2: 转发请求(任意节点) GPU2->>GPU2: 推理计算 GPU2-->>LB: 返回生成结果 LB-->>Client: 响应

这不是魔法,就是一次标准的 HTTP 调用。OpenAI、Claude、Gemini ------ 所有主流 LLM 服务商提供的都是基于 HTTP 协议的 RESTful API。理解了这一点,就理解了为什么无状态(Stateless)是 LLM 服务端架构的唯一正确选择

核心需求:高并发 + 高可用 → 后端必须支持无状态(Stateless)


2. 无状态架构深度解析

2.1 什么是无状态?

无状态的概念最早来源于 HTTP 协议本身 。HTTP 是一个天然的无状态协议: 无状态的核心特征

特征 说明
每次请求独立 不依赖于之前的请求
服务器不存储客户端状态 身份信息通过 Header 传递(Cookie / Authorization)
所有人都公平 没有"特殊"的连接,每个请求被平等对待
水平扩展友好 任何服务器都可以处理任何请求

2.2 有状态 vs 无状态:为什么 LLM 不能有状态?

如果 LLM 服务采用有状态架构会发生什么?

css 复制代码
有状态模式(不可行):
  用户A → 始终路由到 GPU-01 → GPU-01 维护用户A的上下文
  用户B → 始终路由到 GPU-02 → GPU-02 维护用户B的上下文
  用户C → 始终路由到 GPU-01 → GPU-01 压力过大!

问题:
  1. 服务器需要记住"你是谁",内存压力巨大
  2. GPU 资源无法弹性分配
  3. 单点故障导致会话丢失
  4. 无法水平扩展

关键结论:LLM 服务器压力太大了,绝不能让它维护会话状态。无状态让服务器可以水平扩展,因为每个请求都是独立的。


3. LLM 无状态运行机制

3.1 核心规则

LLM 基于 HTTP 的无状态运行遵循两条简单规则:

3.2 具体实现:把全部对话塞进一个请求

这是 LLM 无状态架构最精妙的设计 ------ 客户端负责维护对话历史,每次请求时把完整上下文发送给服务端

json 复制代码
// 第一次请求
{
  "messages": [
    { "role": "user", "content": "解释什么是量子计算" }
  ]
}

// 第二次请求 ------ 把上一轮的回复也带上
{
  "messages": [
    { "role": "user", "content": "解释什么是量子计算" },
    { "role": "assistant", "content": "量子计算是利用量子力学..." },
    { "role": "user", "content": "能用简单例子说明吗?" }
  ]
}

// 第 N 次请求 ------ 携带完整的上下文链
{
  "messages": [
    { "role": "user", "content": "解释什么是量子计算" },
    { "role": "assistant", "content": "量子计算是利用量子力学..." },
    { "role": "user", "content": "能用简单例子说明吗?" },
    { "role": "assistant", "content": "当然,想象一下硬币..." },
    // ... 更多历史消息
    { "role": "user", "content": "这和传统计算机的区别是什么?" }
  ]
}
sequenceDiagram participant Client as 💻 客户端<br/>(维护对话历史) participant Server as ☁️ LLM 服务器<br/>(无状态) Note over Client,Server: 第1轮对话 Client->>Server: messages: [user:&#34;你好&#34;] Server-->>Client: assistant:&#34;你好!有什么可以帮你?&#34; Note over Client,Server: 第2轮对话 Client->>Server: messages: [user:&#34;你好&#34;, assistant:&#34;你好!...&#34;, user:&#34;今天天气如何?&#34;] Server-->>Client: assistant:&#34;抱歉,我无法获取实时天气...&#34; Note over Client,Server: 第3轮对话 Client->>Server: messages: [4条历史消息..., user:&#34;那你能做什么?&#34;] Server-->>Client: assistant:&#34;我可以帮你解答问题...&#34; Note over Client,Server: 每次请求都是完整独立的!

这就是"尝试让大模型 LLM 懂我们"的底层机制 ------ 不是服务器记住了你,而是你每次都把"记忆"重新讲给它听。


4. 工程化三阶段演进

从调用 LLM 到构建生产级 AI 应用,工程化经历了三个阶段的演进:

timeline title AI 工程化演进路径 Prompt Engineering : 聊天对话为主 : 历史对话、知识库 : 类似&#34;抽卡&#34;,不够可控 Context Engineering : RAG、MCP : 更优质的上下文 : Skill 机制 Loop Engineering : Harness AI 工程 : 自主循环 : 智能体闭环

4.1 第一阶段:Prompt Engineering(提示词工程)

关键词:聊天对话为主、历史对话、知识库、Claude.md / agent.md、上下文

早期的 AI 应用以单轮或简单多轮对话为核心。开发者通过精心设计的 Prompt 来引导模型行为:

  • 📝 历史对话作为上下文注入
  • 📚 知识库(如 Claude.mdagent.md)提供领域知识
  • 🎴 "抽卡"效应:Prompt 质量能提升抽到"金卡"的概率,但不是特别可控

4.2 第二阶段:Context Engineering(上下文工程)

关键词:RAG、MCP、Skill

当 Prompt Engineering 的天花板逐渐显现,工程化的重心转向了上下文质量

技术 解决的问题 说明
RAG LLM "不懂"你的业务 检索增强生成,把相关知识注入上下文
MCP LLM 没有最新数据 Model Context Protocol,标准化的工具/数据接入
Skill 复杂任务编排 将能力模块化,按需组合

4.3 第三阶段:Loop Engineering(循环工程)

关键词:Harness AI 工程、自主循环

这是当前的前沿阶段 ------ AI 不只是被动响应,而是进入自主循环

Loop Engineering 的核心思想:

  • 🔄 自主迭代:AI 自己判断任务是否完成
  • 🛠️ 工具调用闭环:思考 → 调用工具 → 观察结果 → 再思考
  • 🏗️ Harness 层:提供运行循环的基础设施

5. ChatHistory 的挑战与对策

5.1 问题分析

虽然"每次带上全部对话"是无状态架构的基石,但它也带来了显著的挑战:

核心矛盾

问题 描述
历史不完整 没有维护全部 history,但大模型的回复也是关键上下文,丢弃不得
Token 膨胀 messages 越来越大,token 开销呈线性甚至指数级增长
任务中断 一次长对话中,任务还没完成,上下文窗口已经不够用了

5.2 对策:LRU 策略 + Capacity 管理

LRU(Least Recently Used)策略在对话管理中的应用

markdown 复制代码
核心原则:
  最近在聊的内容 → 保留(相关性高)
  久远的历史消息 → 适当删除(相关性衰减)

配合手段:
  1. 摘要压缩:对久远对话做摘要,保留关键信息但大幅减少 Token
  2. Capacity 限制:为每次请求设定最大 Token 预算
  3. 滑动窗口:只保留最近 N 轮对话的完整内容
gantt title 对话历史的 Capacity 管理 dateFormat X axisFormat %s section 上下文窗口 完整保留(最近N轮) :done, 0, 60 摘要压缩(中段) :active, 60, 80 丢弃(久远历史) :crit, 80, 100

平衡之道:既要让 LLM "懂"我们(足够上下文),又要控制成本(合理 Token 用量),这是一门需要在实践中不断调优的工程艺术。


6. 实践:Demo 项目剖析

agent/stateless/demo/ 目录下是一个最小化的 LLM 调用示例项目,展示了无状态架构的落地方式。

6.1 项目结构

bash 复制代码
demo/
├── package.json          # 项目配置
├── node_modules/         # 依赖(openai SDK)
└── (index.js)            # 入口文件

6.2 依赖解析

package.json 可以看到两个核心依赖:

依赖 版本 作用
openai ^6.44.0 OpenAI 官方 SDK,封装了 Chat Completions API
dotenv ^17.4.2 环境变量管理,安全管理 API Key

6.3 无状态调用的代码模式

Demo 项目体现了无状态架构的核心模式:

伪代码示例(体现无状态核心模式):

javascript 复制代码
import OpenAI from 'openai';
import 'dotenv/config';

const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

// 🔑 核心:客户端维护 messages 数组
const messages = [
  { role: 'system', content: '你是一个有帮助的助手。' }
];

async function chat(userInput) {
  // 1️⃣ 追加用户消息到历史
  messages.push({ role: 'user', content: userInput });

  // 2️⃣ 发送完整历史(无状态请求)
  const response = await client.chat.completions.create({
    model: 'gpt-4o',
    messages: messages,  // ← 每次都带上全部上下文
  });

  // 3️⃣ 将回复也追加到历史
  const reply = response.choices[0].message;
  messages.push(reply);

  return reply.content;
}

// 多轮对话 ------ 每次都把完整历史发给服务器
await chat('解释量子计算');
await chat('能用简单例子说明吗?');
await chat('这和传统计算机的区别是什么?');

这就是无状态的实践:服务端不存储任何会话状态,客户端全权负责维护对话历史。每次 HTTP 请求都是自包含的、独立的。


7. 总结与展望

7.1 核心要点回顾

mindmap root((无状态架构)) HTTP 基础 每次请求独立 Header 传递身份 RESTful 风格 LLM 应用 手动带上全部对话 客户端维护历史 服务端水平扩展 工程演进 Prompt Engineering Context Engineering Loop Engineering 挑战应对 LRU 策略 Token 管理 摘要压缩

7.2 关键洞察

层次 洞察
本质 LLM 调用就是一次 HTTP 请求,消耗算力并返回结果
架构 无状态 = 服务端不存状态,客户端每次带上全部上下文
优势 高并发、高可用、水平扩展、任意节点无差别处理
代价 Token 开销随对话增长,需要 LRU / 摘要等策略管理
演进 Prompt → Context → Loop,从单轮对话到自主智能体

7.3 未来方向

随着 Loop Engineering(Harness AI)的成熟,无状态架构将进入新阶段:

  • 🤖 自主 Agent:AI 在无状态基础设施上实现有状态的"幻觉"------通过循环和自我管理模拟连续性
  • 🔗 多 Agent 协作:多个无状态 Agent 通过消息传递协同工作
  • 📡 协议标准化:MCP 等协议让上下文工程更加标准化
  • 边缘推理:无状态特性天然适合边缘部署

一句话总结:LLM 无状态架构不是限制,而是解放 ------ 它让 AI 服务像 Web 服务一样可伸缩、可维护、可进化。从 Prompt 到 Context 再到 Loop,每一次工程化升级都建立在"无状态"这块基石之上。


相关推荐
霜落长河6 天前
抛弃TCP改用UDP,HTTP3怎么了?
http
之歆7 天前
现代 HTTP 客户端深度解析:Fetch 与 Axios
chrome·网络协议·http
程序员mine7 天前
HTTPS-TLS加密与证书完全指南(下)
网络协议·http·https
SomeOtherTime7 天前
http协议处理播放video/mp4视频
http
llz_1128 天前
web-第五次课后作业
前端·后端·http
曾阿伦8 天前
netcat / ncat / socat 用法详解与示例
linux·http·信息与通信
cyforkk8 天前
破除网络协议迷雾:TCP、TLS 与 HTTP 的“连环套”逻辑
网络协议·tcp/ip·http
VidDown8 天前
视频协议传输全解析:从 HTTP/HTTPS 到 HLS/DASH 的完整旅程
javascript·网络·http·https·编辑器·音视频·视频编解码
Patrick_Wilson9 天前
Cookie 作用域避坑:父域泄漏、同名优先级与多环境隔离
前端·http·浏览器