你走进一家做“整套宴席”的餐厅:点了一桌八菜一汤,后厨确实开火了,可规矩是——所有菜全部做完、摆盘齐整,才一次性端上来。你坐在空荡荡的桌前,看着服务员来回穿梭却无菜可上,半小时过去,饥肠辘辘,心里发慌。另一家餐厅则截然不同:每做好一道菜,传菜员立刻端上。十分钟后第一道凉菜已经落胃,二十分钟后主菜陆续到位。你始终有东西可吃,觉得“这顿饭来得真快”。 大模型的输出也是这个道理。非流式模式要等模型把整段回答全部生成完才一次性返回;流式输出则每生成一个 token(相当于一小勺菜、几个字),就立即推送给前端展示。用户看到第一个字的时刻,就是“第一道菜上桌”的时刻——感知延迟因此被大幅压缩。 但“上菜快”背后是一整套设计:传菜员怎么上菜(前端渲染策略)、后厨怎么分盘(断句逻辑)、菜洒了怎么办(错误重连机制)、如何让顾客吃得舒服(用户体验设计)、如何控制库存与盈利(工程与成本权衡)。这篇文章,就把流式输出的这桌菜,一道道拆给你看。
对流式输出设计的深度理解,是 AI 产品经理与前端/全栈工程师在对话式 AI 产品中的核心竞争力——它直接决定用户对“快不快、顺不顺”的第一印象,也是区分优秀 AI 产品与平庸产品的关键细节。
可视化演示
动态演示深入理解流式输出设计的核心机制,通过全局/局部/动态/静态四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
深入理解流式输出设计:流式输出 流式输出的感知延迟优化原理 流式传输协议选型:SSE与We 核心机制可视化 深入理解流式输出设计整体架构与关键组件
流式输出原理
第一家餐厅的规矩是“菜齐开席”,第二家餐厅的规矩是“做一道、上一道”。两者的后厨工作量几乎相同,顾客的体感却天差地别。流式输出在 AI 世界里做的正是第二家餐厅的规矩:模型边生成边发送,前端收到一点就显示一点,用户看到第一个字的时刻,远比“全部生成完”来得早。
大模型生成文本是一个“自回归”过程:每预测出一个 token(可以理解为一小撮文字),就把它拼回去继续预测下一个。传统接口会等整个序列全部生成完,再一次性返回完整 JSON;流式接口则把“生成”与“传输”并行起来,最常用的通道是 SSE(Server-Sent Events)——一种基于 HTTP 的单向推送协议。客户端发一个带 stream: true 的请求,服务端就把每个增量块以 data: {...} 的形式逐行推过来,前端边读边解析边渲染。
于是一个原本“等 8 秒才看到全部”的请求,变成了“0.3 秒看到第一个字,之后边看边等”。感知延迟的差距,用下面这个加速比公式可以看得更清楚:
说到底,流式输出的原理就是把“等待”这场煎熬,拆解成“有内容的等待”。用户从对着空桌子干瞪眼,变成了边吃边等后面的菜——等菜的耐心,远比等一桌空桌子要足得多。
- 分子完整生成时长:$T_{\text{total}}$ 是非流式模式下模型从头到尾生成完整回复所需的时间,用户在这段时间里什么都看不到。
- 分母首 Token 时延:$T_{\text{first}}$ 是流式模式下用户看到第一个 token 的时间,只比“开始生成”晚一点点。
- 感知加速比$S$ 表示流式带来的“感知加速倍数”,当 $T_{\text{first}} \ll T_{\text{total}}$ 时,$S$ 远大于 1。
- 具象示例一顿饭总共 10 分钟做好,第一道菜 30 秒上桌,感知加速 $S = 20$,顾客自然觉得“这餐厅真快”。
前端渲染策略
传菜员接住了 20 道菜,怎么上桌?如果他坚持攒齐 20 道再一起摆盘,那和第一家餐厅毫无区别;如果他端着一碗汤一路小跑,汤洒了一路,顾客照样不满。上菜的节奏与方式,学问不亚于做菜本身。
前端拿到流式数据后,首要任务是“增量渲染”——只把新增的部分接续到已有文本后面,而不是每次把全部文本重绘一遍。这里有个隐藏的难点:Markdown 是实时到达的。用户可能正看着一段“还没有闭合”的代码块或标题,如果每次到达都全量重新解析,页面就会不断闪烁跳动,像一碗被端得左摇右晃的汤。
成熟的渲染策略是“节流合并 + 局部更新”:把高频到达的 token 攒进渲染队列,用 requestAnimationFrame(每帧约 16ms)统一落一次 DOM;识别到代码块开始符号后先不高亮,等配对的结束符到达再整块高亮。再加上闪烁的光标、轻微的打字机节奏,让“等待”变成一段有呼吸的叙事。渲染速率跟不上生成速率时,积压就会产生:
传菜员的“上菜节奏”直接决定顾客的观感。前端渲染策略就是流式输出的传菜节奏:既要保证汤不洒(不抖动)、菜不断档(不卡顿),又要让人真实地感觉到“正在上菜”。
- 生成速率$r_{\text{gen}}(\tau)$ 表示后厨每秒端出几道菜——也就是模型每秒吐出多少个 token。
- 渲染速率$r_{\text{render}}(\tau)$ 表示传菜员每秒能把几道菜摆上桌——也就是前端每秒实际渲染的 token 数。
- 积压量$C_{\text{buffer}}(t)$ 是到时刻 $t$ 为止“后端已产出、前端还没显示”的累积量,积分把每一瞬间的差累计起来。
- 稳定条件想让积压不无限增长,必须保证渲染速率不低于生成速率,否则页面会越来越卡、内存越占越高。
断句输出逻辑
后厨分盘是一门手艺:把一整条鱼端上桌,考验的是锅够不够大;把鱼剁成肉末再一勺勺端,顾客只会觉得离谱。分盘的原则是“一道菜一个完整语义”——红烧肉就是红烧肉,不能把一块肉劈成两半端两次。
对应到流式输出,“断句”就是决定把多少个 token 装进一个推送块。装得太少,网络往返次数暴增,渲染层被高频小碎片打懵;装得太多,第一块迟迟出不来,流式优势荡然无存。更基础的红线是:绝不能把多字节字符从中截断,否则中文和 emoji 会直接变成乱码,相当于把好端端的一道菜端成了碎渣。
成熟的断句策略分三层:第一层按标点切,句号、感叹号、换行是最高优先级边界;第二层按长度兜底,超过设定字符数即使没有标点也切;第三层做边界修正——切完后往回找最近的空白或标点,宁可少切也不切碎。好的断句结果可以用平均块长来衡量:
断句逻辑决定的是“盘子怎么装”:盘盘完整、大小适中,顾客吃得舒服,传菜员跑得轻松,后厨也不至于为了赶工把菜剁碎。好的分盘让人察觉不到“这是被切过的”——这就是断句的最高境界。
- 分块集合一次完整回复被切成 $K$ 个推送块,每块是一个语义单元,用序号标记。
- 总长守恒所有块的长度之和恰好等于回复总长度,切块只是“分盘”,并不会凭空多出或减少内容。
- 平均块长$\bar{l}$ 是平均每块包含的字符数,它反映“一盘菜”的平均大小。
- 权衡区间块长太小则网络开销大、渲染碎片化;块长太大则首块迟到、流式失效,所以要约束在合理区间。
错误重连机制
传菜员端着第六道菜穿过走廊,被一位起身的顾客撞了个趔趄,盘子碎了一地。最糟的处理方式是什么?愣在原地发呆,或者跑回后厨要求把一整桌菜全部重做。正常餐厅的做法是——先安抚顾客:“稍等,这道菜马上补上”,然后只让后厨补第六道,其余已经上桌的照吃不误。
流式连接同样会“摔盘子”:Wi-Fi 抖动、服务端重启、网关超时,都可能让数据流突然中断。网络世界不存在“永不掉线”,所以重连策略必须内建在设计里。重连的第一原则是“断点续传”:客户端记录已经正常渲染到的位置,重连时带上这个位置,服务端只补发之后的增量——就像后厨只补第六道菜。
重连的等待时间需要用“指数退避”来控制:第一次等 0.5 秒、第二次 1 秒、第三次 2 秒……每次翻倍,避免断网恢复瞬间几十万客户端同时重试,把服务器挤成雪崩。同时设置最大尝试次数(如 3-5 次),超过后提示用户手动重试。服务端通常配合“游标”(cursor)或事件序号,让客户端能精确说出“我要从第 N 块之后的内容”。
好的重连机制就像训练有素的传菜员:不慌、不重来、先安抚顾客再补菜。用户那边看到的只是“网络不佳,正在续传”,而不是一段对话从零开始重演——这份从容,正是流式产品专业度的体现。
- 初始等待$T_0$ 是第一次重试前的等待时间,通常取 0.5 秒左右,既不过于急躁也不过于迟钝。
- 翻倍规律第二次等待 $2T_0$,第三次等待 $4T_0$,间隔逐次翻倍,给网络恢复留出时间。
- 一般形式第 $k$ 次重试的等待时间由指数函数给出,这就是“指数退避”名称的来历。
- 截止条件等待时间不能无限增长,超过上限 $t_{\max}$ 后应当放弃自动重试,转为人工介入。
用户体验设计
顾客评价一餐饭,不光看菜好不好吃,还看“空桌时间”有多长:等菜时有没有小菜垫垫(即时反馈)、能不能看到后厨在冒烟(进度感知)、吃饱了能不能喊停(停止生成)、出状况时有没有人解释(状态提示)。这些细节共同决定“这顿饭值不值得五星”。
对话式 AI 产品的体验同理。第一层是即时反馈:流式让内容像打字机一样持续出现,用户随时有东西可读;第二层是进度感知:配合“正在思考…”“生成中”等状态提示,用户知道系统还活着,而不是卡死了;第三层是控制权:一个“停止生成”按钮,让用户随时叫停,避免模型滔滔不绝。
从数据上看,流式把“干等”压缩到首 token 之前,之后的时间变成了“边读边等”,焦虑感显著降低。空窗占比 $\theta$ 越小,体验越顺滑。产品细节上还要注意:用户点击停止后,前端要发送中止信号(abort)并停止后续渲染;中途显示“已生成 N 字”这类微进度,也能进一步消除不确定感。
用户体验设计的本质,是把“等待”重新包装成“体验”——就像餐厅用开胃小菜、上菜进度和随叫随停的服务,把顾客从焦虑的干等变成从容的用餐。在 AI 产品里,这份从容就是留存率的隐形推手。
- 首字时延$T_{\text{first}}$ 是从用户发出请求到看到第一个字的时间,这是流式体验的“第一印象”。
- 总生成时长$T_{\text{total}}$ 是完整回复全部生成所需的时间,它决定了整场体验的宏观长度。
- 空窗占比把两者相除得到 $\theta$,表示用户在没有任何内容可看的状态下度过的时间比例。
- 体验目标当 $\theta \to 0$ 时,用户几乎全程“嘴里都有菜”,等待的焦虑感趋近于零。
工程实现要点
一家餐厅要同时服务 100 桌客人,光靠传菜员狂奔是不够的,还需要:食材提前备好(缓存管理)、厨房通道不堵死(内存控制)、多个灶台并行(并发处理),以及一个能看到全店的领班(性能监控)。
流式输出的工程实现同样有四大支柱。缓存管理:把用户的高频提示词或前缀计算结果缓存起来,命中时从缓存位置开始接续生成,省去重复计算;内存控制:流式长回复可能长达数千 token,前端要用有界缓冲(背压)防止内存暴涨,服务端则要警惕“流不关闭”导致的连接泄漏。
并发处理上,一个用户可能同时开多个对话窗口,每个窗口一条独立的流式连接,必须按会话隔离管理;当生成速率高于渲染速率时,积压的块要有上限和丢弃策略,而不是无限堆积。性能监控则盯紧两个黄金指标:TTFT(首 Token 时延)与 ITL(Token 间时延)——前者管“第一印象”,后者管“持续流畅度”。
这些工程细节平时藏在界面之下,却正是它们决定了餐厅能否从容应对晚市高峰。流式体验的稳定,靠的是后厨那套看不见的调度系统——把缓存、内存、并发的每一环都拧紧。
- 请求时刻$t_{\text{req}}$ 是客户端发出流式请求的时刻,它是所有延迟计算的起点。
- 首 Token 时延TTFT 是“请求发出”到“首块到达”的间隔,直接对应感知体验中的第一秒。
- Token 间时延ITL 用“末块到达时刻减首块到达时刻”除以“块数减一”,得到平均每两块之间的间隔。
- 稳定要求ITL 的方差要小,否则输出忽快忽慢,用户会明显感觉到“卡一下、蹦一下”。
质量成本权衡
开餐厅终究要算账:食材成本、厨师生意、翻台率。每道菜都上满汉全席,客人是爽了,店却亏不起;每道菜都偷工减料,店保住了,口碑却没了。好的后厨,要在品质与成本之间找到那条精明的线。
流式输出的成本账要从 token 计量算起。无论流式还是非流式,同样一段回复消耗的输出 token 数基本一致——但流式引入了两个新的成本变量:其一,用户可能看到一半就喊停,节省了后面的 token;其二,断线重连如果设计不当,可能重复生成,白白烧钱。与此同时,提示词(输入 token)也按量计费,长上下文对话每轮都在累积成本。
常见的成本优化手段包括:命中前缀缓存,让重复提示词不再重新计算;控制超长回复的截断策略,对高频短问答直接用缓存答案而不调模型;重连时精确续传,避免重复生成已发送过的内容。质量权衡上要认清一点:流式输出本身不改变模型质量——生成过程完全一样,只是传输方式不同;真正损害质量的是为了省成本而做的激进截断和过度缓存。
好餐厅的账本是“精打细算而不亏待客人”。流式输出的成本控制,同样要在体验与账单之间找到平衡点——这也是 AI 产品经理每天都要做的算术题,算得好的产品,才能既快又省地活下去。
- 输入成本$p_{\text{in}}$ 是输入 token 单价,$N_{\text{in}}$ 是提示词消耗的 token 数,两者相乘是输入费用。
- 输出成本$p_{\text{out}}$ 是输出 token 单价(通常高于输入),$N_{\text{out}}$ 是模型生成的 token 数。
- 重试开销$C_{\text{retry}}$ 是断线重连导致的额外消耗,包括重复请求的 token 与算力,设计不当会让它迅速膨胀。
- 优化方向压低 $N_{\text{in}}$(压缩提示词)、缩减 $N_{\text{out}}$(提前停止)、消除 $C_{\text{retry}}$(断点续传),三条路同时走。
AI 应用场景
智能客服对话机器人
阶段:前端交互设计 / 模型服务调用
解决的问题:传统方式下,用户提交问题后要干等 5-10 秒才能看到完整答复,焦虑感与流失率居高不下。AI 将流式输出接入后,首字 0.5 秒内出现,配合“正在为你查询”状态提示与“停止生成”按钮,把用户的等待从“煎熬”变成“可控”。
具体案例:某电商售前机器人接入流式接口后,用户能看到答案逐字浮现,投诉率明显下降、对话完成率上升;长答案允许用户中途喊停,节省了约 20% 的无效输出 token,每月接口账单同步下降。
AI 代码补全与 IDE 插件
阶段:服务端工程实现 / 断句逻辑设计
解决的问题:代码补全需要“边写边出”,非流式会让光标卡死半秒到几秒,打断心流。流式配合增量渲染和“代码块闭合后再高亮”的策略,让补全像真人打字一样跟手。
具体案例:某 IDE 插件按语义切块推送补全结果,断句逻辑专门避免切碎标识符与字符串字面量;弱网环境下使用指数退避与断点续传,补全中途断线也能接着给出后半段,而不是从头再来。
会议实时转写与字幕
阶段:模型服务与部署 / 错误重连机制
解决的问题:语音转写必须“边说边出”,等整段说完再出字幕毫无意义。流式转写配合前端防抖渲染,保证字幕平滑不闪烁;错误重连机制让弱网环境下的转写不长时间静默。
具体案例:某会议软件在弱网环境用 SSE 流式推送转写结果,断线后从断点续传,而非重新转写已验证的段落;配合“转写中…”状态提示,参会者始终知道系统在正常工作,会议效率不被技术故障拖累。
Python 演示
# -*- coding: utf-8 -*-"""流式输出模拟器: 演示语义断句、增量渲染与指数退避重连"""import randomimport time def chunk_by_punctuation(text, max_len=12): """断句逻辑: 有标点就切, 超长兜底切, 避免切碎语义""" parts = [] temp = "" for char in text: temp += char if char in "。!?,、;\n" or len(temp) >= max_len: parts.append(temp) temp = "" if temp: parts.append(temp) return parts def stream_with_retry(chunks, max_retry=3, fail_rate=0.15): """流式推送 + 断点续传: 中断后指数退避重试""" wait, attempt, resume = 0.5, 0, 0 while resume < len(chunks) and attempt < max_retry: try: for idx in range(resume, len(chunks)): if random.random() < fail_rate: raise ConnectionError("第 %d 块传输中断" % idx) yield chunks[idx] resume = idx + 1 except ConnectionError: attempt += 1 print("连接断开, %.1fs 后第 %d 次重试..." % (wait, attempt)) time.sleep(wait) wait *= 2 if resume < len(chunks): raise RuntimeError("重试次数耗尽, 请人工介入") def main(): answer = "流式输出能降低感知延迟。用户看到首字时, 体验已经启动。" chunks = chunk_by_punctuation(answer) print("断句结果: %d 个语义块" % len(chunks)) shown = "" for part in stream_with_retry(chunks): shown += part print("增量渲染: %s" % shown) print("最终答复: %s" % shown) if __name__ == "__main__": main()
if char in "。!?,、;\n" or len(temp) >= max_len:有标点立刻切块,没标点超长兜底切,保证每个“盘子”语义完整。def stream_with_retry(chunks, max_retry=3, fail_rate=0.15):把流式推送、断点记录、指数退避整合在一个生成器里。resume = idx + 1记住已经成功送到的位置,重连后只补后面的菜,绝不从头再来。if random.random() < fail_rate:以 15% 概率模拟网络中断,制造“摔盘子”的场景。wait *= 2指数退避的核心一行:每次重试等待时间翻倍,保护服务器免受重试风暴。yield chunks[idx]生成器逐块产出,前端每收到一块就可以立即渲染一次。
常见误区
误区流式输出不就是把响应速度调快吗?同样一段话,以前 3 秒一次性返回,现在每 0.5 秒发一段,所以模型生成变快了。
正解流式输出并不改变模型推理速度,甚至因为分块传输会带来微小的额外开销,总生成时间基本不变。真正的改变是“用户何时看到第一个字”——就像传菜再快,后厨做完整桌菜的总时间不变,但顾客第一口下肚的时间被大大提前。流式优化的是“感知延迟”,不是“生成延迟”。
为何常见:把“边生成边发送”误认为是“更快生成”,忽视了模型推理本身与传输方式的区别。
误区既然追求即时反馈,那就每个 token 生成完立刻推给前端,更新越频繁越流畅。
正解每 token 一推会导致网络往返次数暴增、渲染层频繁重排布局,还可能把多字节字符或 emoji 从中截断产生乱码,用户反而看不清内容。理想块长是“语义完整、大小适中”的块,像传菜员按“一盘菜”上桌,而不是按“一粒米”上桌。
为何常见:直觉上“更新越快越流畅”,忽略了渲染成本、网络开销与语义完整性之间的平衡。
误区网络断了就重新发一次请求,让模型把回答重新生成一遍,反正也就几百个字。
正解重新生成会重复消耗大量 token 与算力,用户还要重新经历一遍等待。正确做法是客户端记录已渲染的断点位置,重连后从断点继续拉取(服务端支持位置续传),就像传菜员摔了第三道菜,后厨只补第三道,而不是重新做整桌菜。
为何常见:把流式请求当作“一次性事务”,不知道流式协议可以携带游标位置做断点续传。
误区反正到最后文本都一样,我把累积的文本直接塞进 innerHTML 不就行了?又省事又简单。
正解每次全量重绘会造成布局抖动、滚动跳动,未闭合的 Markdown 与代码块还会引起样式闪烁;innerHTML 还存在 XSS 注入风险。正确姿势是增量渲染:解析器维护状态,只渲染新增片段,等代码块闭合后再整块高亮。
为何常见:前端初学者习惯“全量赋值”思维,忽略了流式场景下文本是分批到达、且带格式语义这一核心事实。
面试题
Q1. 流式输出的核心价值是什么?
- A.显著降低用户感知等待时间← 正确答案
- B.大幅提升模型生成文本质量
- C.减少服务端的整体计算开销
- D.降低大模型的训练数据需求
答案:A。流式输出改变的是“传输与展示的节奏”,模型推理速度与质量不变,也不能降低算力或训练成本。它的核心价值是把等待摊薄,让用户提前看到内容,也就是降低感知等待时间,故选 A。
Q2. 衡量流式响应快慢最合适的指标是什么?
- A.首 Token 到达所需时长← 正确答案
- B.总 Token 生成所需时长
- C.模型上下文窗口大小
- D.前端页面整体加载耗时
答案:A。流式体验的起点是“用户看到第一个字”,因此首 Token 时延(TTFT)是最直接的指标。总生成时长在流式下不再让用户干等,上下文窗口大小与页面加载耗时则与流式响应快慢无关。
Q3. 用户点击“停止生成”按钮后,前端最合理的行为是什么?
- A.发送中止信号并停止渲染← 正确答案
- B.继续接收但隐藏全部新内容
- C.刷新页面强制断开所有连接
- D.等待全部生成完成后统一展示
答案:A。用户喊停后,前端应发送 abort 中止信号并立即停止渲染,既符合用户意图又节省 token。继续接收会浪费资源,刷新页面会破坏对话状态,等生成完再展示更是与用户意图背道而驰。
Q4. 关于 SSE 用于流式输出,下列说法正确的是?
- A.SSE 基于 HTTP 且适合单向推送← 正确答案
- B.流式输出必须使用 WebSocket 协议
- C.SSE 只能一次性传输全部数据
- D.SSE 传输必然产生双向通信开销
答案:A。SSE 建立在 HTTP 之上,天然支持增量文本推送,且流式场景是“服务端到客户端”的单向流,SSE 足够胜任,无需 WebSocket 的双向开销。B、C、D 都与 SSE 的实际特性矛盾。
Q5. 断句逻辑中,最需要避免的操作是什么?
- A.在标点符号处划分语义块
- B.优先在换行处切开长文本
- C.随机截断多字节字符边界← 正确答案
- D.每次推送一到两个完整句子
答案:C。多字节字符(中文、emoji)被从中截断会产生乱码,这是断句逻辑的红线。在标点、换行处切分、按整句推送都是合理做法,只有“随机截断字符边界”是必须避免的。
Q6. 流式连接断线后,最合理的恢复策略是什么?
- A.从断点续传并只补齐缺失内容← 正确答案
- B.清空已显示内容后从头再来
- C.忽略错误持续等待旧连接恢复
- D.提示用户刷新页面重新发起对话
答案:A。断点续传只补缺失部分,不重复生成也不清空进度,是流式重连的标准做法。清空进度、干等旧连接或让用户刷新,都会大幅破坏体验并浪费 token。
Q7. 打字机效果出现“一顿一顿”的卡顿,优先排查的方向是什么?
- A.生成频率与渲染频率是否匹配← 正确答案
- B.用户的屏幕分辨率是否过小
- C.页面背景颜色是否设置正确
- D.浏览器历史记录是否存储过多
答案:A。卡顿的根源通常是“后端推送频率高于前端渲染能力”,导致积压和跳跃。应优先检查生成速率与渲染速率是否匹配,必要时用 requestAnimationFrame 节流合并,与屏幕分辨率、背景色、历史记录无关。
Q8. 指数退避策略中,第 3 次重试的等待时长为首次的多少倍?
- A.等于首次等待时间
- B.首次等待时间的 2 倍
- C.首次等待时间的 4 倍← 正确答案
- D.首次等待时间的 8 倍
答案:C。指数退避满足 $t_k = T_0 \times 2^{k-1}$,第一次是 $T_0$,第二次 $2T_0$,第三次 $4T_0$,故选 C。2 倍对应第二次,8 倍对应第四次。指数退避的目的是避免重试风暴压垮服务端。
Q9. 关于打字机效果的渲染优化,正确的做法有哪些?
- A.后端把推送频率提高到每秒数十次
- B.前端把高频到达的增量节流合并← 正确答案
- C.每帧对全部历史文本进行完整重排
- D.只渲染新增片段并维护解析状态← 正确答案
答案:BD。过高的推送频率会加剧渲染压力,A 错误;每帧全量重排会造成布局抖动,C 错误。正确做法是前端用 requestAnimationFrame 等机制节流合并增量(B),并采用增量渲染、只处理新增片段(D)。
Q10. 流式输出的成本控制手段包括哪些?
- A.用户提前停止生成以节省输出 Token← 正确答案
- B.缓存常见提示词以减少重复计算← 正确答案
- C.用免费套餐规避全部 Token 计量
- D.重连时避免重复请求已生成的段落← 正确答案
答案:ABD。提前停止能直接减少输出 token(A),提示词缓存能省去重复计算(B),断点续传避免重复生成(D),都是合理的成本控制手段。免费套餐无法“规避计量”,C 既不现实也不属于正当的设计手段。