首页 / 文章 / 长上下文LLM服务中的真实权衡:内存、延迟、成本与准确性
← 返回
IT技术

长上下文LLM服务中的真实权衡:内存、延迟、成本与准确性

✍️ zhirenhun 📅 2026/8/3 👁 142 阅读 ⏱ 32 分钟
长上下文LLM服务中的真实权衡:内存、延迟、成本与准确性

“长上下文”的含义,以及为什么“支持”不等于“实际服务”

上下文是你在一次请求中发送给模型的所有内容:提示词、文档、代码、对话历史。它使用令牌(token)来衡量,令牌是词元片段,大约每1,000个令牌对应750个单词。128K令牌窗口(大约相当于一部小说的文本量)是当前常见的标准。Llama 3.1GPT-OSS-120B 均配备128K窗口。前沿的闭源模型更进一步。根据 DigitalOcean 的定价页面上的模型列表,Claude Sonnet 4.6、4.5 和 4 最多接受100万输入令牌,大约相当于十部小说。

规格表上的数字告诉你模型能接受什么,但并不能告诉你当许多用户同时向同一基础设施发送如此大的输入时会发生什么。支持是模型的能力,性能是服务的问题,两者在四个具体方面存在差异。本文将逐一说明,并附上数据。

你需要先了解两个背景知识。

预填充(Prefill)与解码(Decode) 推理分为两个阶段。在预填充阶段,模型在生成任何内容之前,以一次并行通行读取你的整个输入。预填充受计算限制,受限于 GPU 进行数学运算的速度。在解码阶段,模型一次生成一个令牌的回答。解码受内存限制,受限于数据从 GPU 内存移出的速度,而非算术运算。长输入主要对预填充造成压力,长输出主要对解码造成压力。

KV 缓存 模型每读取一个令牌,就会计算并存储两个向量:一个键和一个值,这样就不必在生成每个新令牌时重新读取整个输入。这个存储就是 KV 缓存。它会在整个请求生命周期内驻留在 GPU 内存中,并且与您发送的内容量成正比增长。

权衡1:内存

KV 缓存的内存占用遵循一个简单的公式:

2 × layers × KV heads × head dimension × sequence length × bytes per element

这里的2表示每个token存储两个向量,一个是键(key),一个是值(value)。这是服务文献中标准的缓存计算方式;PagedAttention论文(Kwon等人,SOSP 2023),即vLLM背后的工作,也得出了相同的每个token计算量。这里的公式使用KV头而不是总注意力头,因为像Llama 3这样的模型使用分组查询注意力,其中多个查询头共享少量KV头,这大大缩小了缓存。

下面按照DigitalOcean教程,以BF16精度的Llama 3 70B(80层,8个KV头,头维度128)和128K-token输入为例进行计算:

2 × 80 × 8 × 128 × 131,072 × 2 bytes ≈ 43 GB

先记住这个数字。单个用户的上下文需要43 GB的GPU内存,大约相当于模型本身重度压缩后的大小。一块NVIDIA A100或H100总共有80 GB,而模型权重已经占去了其中的大部分。如果上下文扩展到100万token,缓存的大小会超过模型本身。

将同样的公式应用于Llama 3系列(这三个模型都使用8个KV头,头维度为128;根据其公开配置,层数分别为32、80和126),你可以看到缓存如何随模型大小和上下文长度一起扩展。下表中仅列出缓存大小;权重占用另算:

单次请求的KV缓存(BF16) 4K token 32K token 128K token 1M token
Llama 3.1 8B(32层) 0.5 GB 4.3 GB 17.2 GB 137 GB
Llama 3 70B(80层) 1.3 GB 10.7 GB 43 GB 344 GB
Llama 3.1 405B(126层) 2.1 GB 16.9 GB 68 GB 541 GB

将128K这一列与80 GB的显卡对照来看。对于8B模型,单次请求占用显卡内存的21%;70B模型占用54%;405B模型占用85%,而且这还没有算上权重。再看看1M这一列。这一列中的每个数字都超过80 GB,这意味着无论怎样,单个百万token的请求都无法放在一块GPU上。缓存必须拆分到多张卡上,而在生成过程中,这些卡会不断地通过它们之间的连接来回传递注意力数据。这些连接的速度比GPU读取自身内存要慢很多倍,因此服务变慢且更复杂,而恰在这个时候它已经是最昂贵的了。(关于此表需要诚实说明的一点:Llama 3.1本身只支持128K token,所以1M这一列并非你实际上能在这些模型上运行的内容。它只是在1M时应用同样的公式,以展示那些确实宣称支持如此大的窗口的前沿模型在数学上会是怎样的结果。)

真正造成影响的地方在于批处理。GPU之所以能保持低廉的成本,是因为许多请求会被一起处理并分摊固定开销。长请求会从两个方面破坏这一点。单个巨大的缓存使得其他请求没有余量加入批处理,而大小请求的混合使用又会让GPU内存碎片化,即使有空闲空间也无法很好地利用。

PagedAttention——vLLM采用的技术——将缓存内存按页分配,而不是使用一个连续的内存块,从而恢复了一些浪费的空间。但一个128K的请求仍然需要128K大小的内存。因此,随着整个集群的平均上下文长度逐渐攀升,批处理规模缩小,利用率下降,每个token的成本上升,而硬件本身并没有任何问题。

权衡2:延迟

延迟就是等待时间:从发送请求到获得响应之间需要多久。对语言模型而言,延迟包含两个用户感受不同的部分。第一部分是任何输出出现之前的停顿,称为首令牌时间(TTFT)。第二部分是开始输出后,其余答案流入的速度。人们对较慢的流式输出远比长时间沉默停顿更能容忍,这使得TTFT成为决定应用是否感觉响应灵敏的关键指标。而长上下文恰恰会抬高TTFT。

原因如下。注意力机制是每个Transformer的核心操作,它会将输入中的每个token与其他所有token进行比较。计算量随输入长度的平方增长。上下文长度翻倍,工作量为原来的四倍。从32K到128K,长度变为4倍,注意力计算量则变为16倍。

所有这些都发生在预填充阶段,即在答案第一个词出现之前。这就是为什么TTFT在短上下文时是毫秒级,在长上下文时则变成整秒级。像FlashAttention这样的优化确实在此有所帮助。它们减少了GPU在快速内存和慢速内存之间来回搬运数据所浪费的时间,加速效果显著。但它们无法改变底层的数学原理。计算量仍然随输入平方增长;只是从更低的起点开始增长。只要标准注意力机制是二次复杂度,每增加一个token,下一个token的成本就会更高。

第二个延迟成本更容易被忽视:你的长请求对其他人造成的影响。一次128K token的预填充会占用GPU数秒,排在它后面的每个请求都要等待。受伤害最深的不是那些发送长请求的人,因为他们预期到要等待。而是那些发送短请求、却不幸排在长请求后面的用户。在仪表盘上,这看起来像是平均延迟健康,而p95和p99则在悄悄恶化,这种模式对智能体和副驾驶等交互式产品的损害最大。

权衡3:吞吐量与带宽上限

即使计算能力无限,解码也会撞上一堵与算术无关的墙。为了生成每个输出token,GPU必须从高带宽内存(HBM)中读取整个KV缓存。旗舰GPU的数据移动速度大约为3到4 TB/s,而且这个数字是固定的。一旦缓存达到几十GB,每生成一个token就读取一次缓存就成为真正的瓶颈。

二者之间的关系几乎是线性的。上下文长度翻倍,缓存翻倍,每一步解码读取的数据翻倍,每秒生成的token数大约减半。一个集群可能计算资源空闲,却仍然缓慢地服务长上下文,因为瓶颈已经从计算单元转移到了内存总线上。如果你用FLOPS来购买和衡量GPU容量,那么对这个工作负载而言,你衡量的其实是错误的约束。

你可以通过一次除法自己为这个计算设置一个上限。对于单个请求,每次解码步骤都会读取模型权重加上KV缓存,所以最佳可能速度是带宽除以读取的字节数。对于在H100 SXM(3.35 TB/s)上运行的BF16精度Llama 3 70B(141 GB权重):

上下文长度 KV缓存 上限:token/秒(单个请求)
4K 1.3 GB 23.5
32K 10.7 GB 22.0
128K 43 GB 18.2
1M 344 GB 6.9

有两个注意事项。这是单个未批处理请求的理论上限;没有任何系统能超过它,而且大多数系统远低于这个值。对于单个请求来说,在缓存增长到可比规模之前,权重读取占据主导地位,这就是为什么上限先缓慢下降然后急剧下降。在生产环境中,效果比表格显示的更糟糕,因为批处理在多个请求之间共享一次权重读取,而每个请求都带来自己的缓存流量。一旦缓存读取占据总线主导地位,就会出现上下文长度翻倍、吞吐量减半的行为。这些计算的意义不在于精确性,而在于你可以在三十秒内快速检验任何提供商吞吐量声明的合理性。

成本也随之而来。你可能会认为一个128K token的请求成本大约是1K请求的128倍,与token数量成正比。但一旦将二次方预填充、缩减的批处理、饱和的带宽以及后面阻塞的队列都计算在内,实际成本往往更高。一些定价已经承认了这一点。根据DigitalOcean的模型定价页面(2026年7月查询),Anthropic的Claude Sonnet模型在输入达到200K token之前每百万输入token收费$3.00,超过后每百万收费$6.00,输出价格从$15.00上升到$22.50。提示缓存的存在主要是为了缓解这一问题:你为处理一个长而稳定的上下文支付一次费用(Claude Sonnet写入缓存的费用是每百万token $3.75,缓存生命周期为5分钟),之后每次复用只需支付每百万token $0.30。

理解这含义的最清晰方式是给一次会话定价,而不是给单个token定价。以一次携带稳定128K token上下文的10轮智能体对话为例,比如一个代码库或文档集,每轮增加一个500 token的问题并获得一个500 token的回答,采用上述Claude Sonnet的费率:

策略 每轮发送的内容 会话成本
每轮重新发送完整上下文 128,500 输入token $3.93
缓存128K上下文并复用 500个新token + 缓存读取 $0.95
改为检索:8K相关上下文 8,500 输入token $0.33

携带128K token上下文的10轮智能体会话的累计成本,三种策略对比:每轮重新发送完整上下文达到$3.93,缓存达到$0.95,检索8K切片达到$0.33

图片

该图清晰地展示了每种策略的运行形态。重新发送(Resending)呈陡峭增长且永不停歇。缓存(Caching)的起始位置高于检索(Retrieval),原因在于第一轮对话时需要一次性写入缓存(可以看到它在第一轮到第二轮之间与重新发送的曲线相交),随后逐渐趋于平缓,每轮成本几乎为零。而检索的曲线始终保持在低位且平稳。

在相同的对话和模型条件下,缓存使账单降低了4倍,而检索则降低了12倍。在每天数千次会话的规模下,架构选择的重要性远超单令牌价格。检索也并非零成本,它需要独立的基础设施支持,这就引出了下一部分的内容。

权衡四:准确率,以及为什么准确率同样是一个速度问题

前三个权衡属于基础设施问题。第四个权衡起初源于模型问题,最终却演变为基础设施问题。

模型在回答长输入问题时,其可靠性不如短输入。这一点已有充分的文献记录。RULER研究表明,许多模型的有效上下文长度——即它们仍能保持良好性能的长度——远低于其宣传的最大值。Lost in the Middle研究则显示,当关键信息位于长输入的中部而非开头或结尾时,准确率会急剧下降。

IBM Research与代尔夫特理工大学联合开展的一项2026年测量研究,题为《准确率即速度:面向分布式LLM服务的长上下文感知路由》(Yoshimura, van de Beek 和 Chiba, EuroMLSys '26),补充了两项发现,对于在生产环境中运行长上下文工作负载的人来说值得关注。

图片

图片

第一个发现是,准确率的退化方式往往打破直觉。作者在4K到64K令牌的上下文长度下,使用英语、日语和中文,对五款模型进行了键值查找任务的测试。模型大小并不能预测长上下文的准确率。Phi3-mini作为测试中规模最小的模型,往往是准确率最高的,甚至超越了更大的Phi3-medium。在32K和64K令牌长度下,一款2B模型的表现优于其8B的同类模型。还有一款模型在16K内表现稳定,但在32K时就骤然崩溃。语言因素同样重要:在英语中表现最佳的模型,未必在日语或中文中也是最好的。各模型间的延迟排名保持稳定,但准确率排名却并非如此。

第二个发现是论文的核心论点:准确性失败会转化为延迟。当模型回答错误时,用户或系统会重试,而时钟一直在走。论文将这种现象命名为“正确回答时间”(Time-to-Correct-Answer,TTCA):即从首次尝试到首次正确回答的总挂钟时间。一个有一半时间都答错的高速模型,可能比一个首次就能答对的较慢模型体验更差,因为重试会累积时间。正如作者所说,在长上下文服务场景下,准确性即速度。

他们还表明你可以据此采取行动。他们的路由设计LAAR(轻量级准确性感知路由,Lightweight Accuracy-Aware Routing)将每个候选模型的预期延迟除以预期成功概率作为评分,所用特征不过是输入长度和语言,并且不会将对已失败模型的请求重发。在A100 GPU上对五个模型的测试中,与负载感知路由相比,平均TTCA最多降低了31%;与会话亲和路由相比,最多降低了49%。具体数字不如原则重要。如果你在多个模型之间提供长上下文服务,上下文长度应有助于决定哪个模型来处理请求,因为最佳选择会随上下文长度而变化。

当上下文窗口如此之大时,RAG仍然重要吗?

问得合理。如果模型能接受一百万个token,为什么还要保留向量数据库,分块流水线和检索步骤呢?为什么不把整个语料库粘贴到提示词中?

因为上述一切都是这种粘贴的代价。把窗口塞满意味着要承担二次方预填充成本、数秒的首token时间,以及每次请求按token分层计费的费用,即使只需要输入中的三段话来回答。这也意味着在模型最不可靠的区域工作。RULER发现,有效上下文长度通常达不到宣传的窗口大小,而“迷失在中间”(Lost in the Middle)发现,模型最弱的时刻恰恰是相关细节埋在上下文中间时,而整个语料库放入时通常都是这种情况。检索以同样的方式绕开了这四种权衡:它保持请求短小。模型只读取关键片段,因此预填充成本低、缓存小、答案响应快,而且模型在它可靠的长度范围内工作。

因此,长上下文并没有让检索过时。它改变了每种方法各自的胜出时机,并且在两个方向上都提出了警告:例如,关于两种方法结合的研究Long-Context LLMs Meet RAG发现,向大窗口中检索更多段落并不总能可靠地改善答案,反而可能随着无关文本的堆积而降低答案质量。更大的窗口并不是允许你粗心检索的许可。

跳过检索的代价

这四种权衡就是可见的代价。放弃检索、押注上下文窗口的团队还会遇到一组直到系统进入生产环境才会显现的成本。其中五项反复出现。

账单随窗口大小而非问题规模而增长。 使用检索时,你只为实际相关的几千个token付费。不使用检索时,每个请求都要为整个窗口付费,无论模型是否需要。按Claude Sonnet每百万输入token $3.00的费率,一个128K-token的请求仅输入费用就约为$0.38。每月10,000个请求,在不计算任何输出token的情况下,每月的输入支出就是$3,840。同样的流量通过8K检索上下文大约只需$240。没有出错,没有故障,但账单却高了16倍。

缓存会过期,空闲时间再次向你收费。 提示缓存看起来可以解决上述成本问题,而且通常也确实如此,但Claude Sonnet的廉价缓存层级只有5分钟的存活时间。用户阅读了六分钟然后提出后续问题,就会触发缓存的完全重写,按每百万写入$3.75的费率,一个128K上下文又要花费$0.48。具有突发性、人工节奏流量的系统会不断重复支付这笔费用,而这在原始成本模型中很少出现。

质量在中间悄悄下降。 《迷失在中间》测量到,当相关信息位于上下文中间而不是开头或结尾时,准确率会下降两位数的百分点。没有报错,也没有日志。只是答案变差了,取决于真相在你的语料库中的位置,这是一种你如果没有改变答案位置的评估集就无法察觉的失败模式。

请求可能在宣称的限制内失败。 规格表上的窗口假设提供服务的内存在那一刻是空闲的。在并发负载下,一个非常长的请求的KV缓存和激活值可能会超出可用容量,即使该请求在模型声明的限制之内,也会失败。检索形态的流量——数千个小请求而不是少数巨大请求——对服务系统来说更容易履行承诺。

交互延迟预算无法承受窗口。 构建良好的检索步骤会增加几十到几百毫秒。在非常大的上下文上的预填充需要数秒,任何输出流式传输都无法掩盖缓慢的启动。如果你的产品响应时间目标是几秒,那么架构决策实际上已经为你做出了。

这些都不是说检索是免费的。而是说窗口的成本是后置的:演示便宜,运营昂贵。检索的成本是前置的基础设施成本,并且每个查询的成本会下降。这种不对称性就是为什么演示和生产账单经常不一致的原因。

实用的选择方法

当工作集稳定且被重复使用时,长上下文加缓存胜出。 许多请求针对同一文档集,且该集合适合窗口?缓存一次,完全跳过检索基础设施。持续累积历史记录的整整一天的智能体会话也是同样形态:上下文就是状态,没有可检索的内容。

当语料库很大、不断变化或每个查询大部分内容无关时,RAG胜出。 知识库比任何窗口都大、文档每天更新、或者每个问题只触及数据的一小部分。在每个请求中重新发送不需要的多数内容,只会带来成本和延迟,毫无益处。

即使语料库放得下,精确查找也更青睐RAG。 如果任务是查找一个特定事实,检索能让模型保持较短的上下文长度,而上述准确性测量表明在这种长度下模型表现稳定。

大多数生产系统最终会同时使用两种方式:用检索决定哪些内容进入上下文,用长窗口容纳大量的上下文,并在内容重复时进行缓存。

提供商和团队如何应对

每一种已知的缓解措施都有所收获,也有所牺牲:

技术 收益 代价
FlashAttention 通过减少GPU内部的数据移动,大幅加快注意力计算 仅改善常数项;二次曲线仍然存在
PagedAttention 减少缓存内存浪费,在高负载下支持更大的批次 128K缓存仍然需要128K内存
滑动窗口注意力 通过限制token能回溯的距离来限制缓存增长 失去跨文档的真正长程召回能力
线性注意力变体 消除二次方计算开销 在需要精确长程召回的任务上质量下降
提示缓存 一次性支付完整的预填充成本,低成本复用稳定的上下文 仅当长上下文在多次请求中重复时才有效;写入和存储费用因提供商而异
检索(RAG)而非塞入 只发送相关片段,保持请求简短 增加了检索基础设施及其自身的故障模式
准确性感知路由 减少重试次数,缩短获得正确答案的时间 需要按模型和长度进行离线准确性分析(LAAR论文

这些方法都不能让你以短上下文的代价获得长上下文能力。它们汇总起来就是一份简短的行动手册:

不要发送你不需要的内容。 检索、总结旧轮次和修剪失效上下文,胜过任何GPU端修复,因为最便宜的token就是你从未发送过的那个。

缓存重复的内容。 跨请求共享的稳定长前缀(系统提示、文档、代码库)正是提示缓存的用武之地。一次性支付预填充成本,然后廉价地复用。

将模型与长度匹配。 最近的研究结果表明,在8K下最准确的模型在64K下可能并不是最准确的,而且更大的模型不一定更好。如果你控制路由,请将上下文长度作为输入条件。如果不能,就在你的实际长度下测试模型,而不是相信宣传的窗口。RULER的存在正是因为这两者经常不一致。

关注尾部延迟和上下文混合,而不是平均值。 损害隐藏在p95和p99中,也隐藏在那些统计请求数而非token数的自动扩缩容信号中。十个128K请求和一千个1K请求在请求速率仪表盘上看起来可能完全相同,直到延迟崩溃。

在决定采用某家提供商进行长上下文工作之前,有四个问题值得询问:长上下文吞吐量是如何衡量的,是单独测量还是在并发负载下测量?当长请求到来时,其他租户的延迟会发生什么变化?定价是否随token线性扩展,还是反映了真实的非线性成本?他们能否向你展示prefill与decode的延迟拆分?最后一条是一个不错的成熟度测试。一家已对该拆分进行检测的提供商,会知道自己的时间花在了哪里。

开始使用

如果你正在评估自己的技术栈在上下文增长时的表现,DigitalOcean的推理引擎提供长上下文模型(包括Claude Sonnet的100万token输入窗口),按模型公布每token定价,同时列出提示缓存费率,并提供专用推理,用于需要与嘈杂邻居隔离的工作负载。请使用真实的上下文长度和真实的并发度进行测试,而不是在演示中只发送单个请求。这是最快的方法,能让你知道上下文窗口是产品可以依赖的功能,还是仅仅在技术上支持而已。

来源

  • DigitalOcean Gradient AI 平台定价(分层长上下文和提示缓存费率,2026年7月核对)
  • ——

    🧑‍💻

    zhirenhun

    一个热爱技术的程序员,喜欢分享前沿AI知识和开发经验。

    ← 上一篇
    你的智能体为每个从未调用的工具付出代价
    下一篇 →
    提示工程与循环工程:开发者指南

    📌 相关推荐

    GraphRAG 是推理问题,而非数据库问题
    2026/8/30
    构建市场时光机:使用 Python 和 WebSocket 重放交易会话
    2026/8/30
    如何自行基准测试LLM推理:值得信赖的数字设计标准
    2026/8/30
    ← 返回文章列表