Agent 实现方法论
From Scratch
学习地图
练习
术语表
← 返回首页
本章教程
本章练习
第 03 章测验
第 03 章测验
对应章节:流式输出:手写 SSE 客户端
共 8 题,答对率 ≥ 80% 即通过。请完成全部题目后点击「提交」。
Q1
SSE 协议中,两个事件(frame)之间用什么分隔?
一个换行符 \n
一个空行(两个连续的换行符 \n\n)
一个逗号
一个分号
Q2
为什么调用 LLM 的流式接口时,不能用浏览器原生 EventSource?
因为 EventSource 不支持流式数据
因为 EventSource 只支持 GET 且无法自定义请求头
因为 EventSource 是服务器端 API,浏览器里没有
因为 EventSource 无法解析 JSON
Q3
TextDecoder 的 stream 模式({ stream: true })主要解决什么问题?
提高解码速度
让一个 chunk 恰好等于一个完整事件
一个多字节字符被切到两个 chunk 时,能缓存半字符等凑齐再输出
自动跳过 SSE 的 data: 前缀
Q4
解析流式响应时,为什么必须维护一个半行 buffer?
为了保存 usage 字段
因为 chunk 边界不对齐行边界,一个 JSON 行可能被切到多个 chunk 里
为了统计收到了多少 chunk
因为 [DONE] 必须单独缓冲
Q5
关于流式 chunk 中的 delta 与完整 message,下列说法正确的是?
delta 就是完整 message,直接拿来用
delta 是每一帧的增量,完整文本需要累积所有 delta.content 拼接
delta 包含完整的对话历史
delta.content 一定是 JSON 数组
Q6
流式响应末尾的 data: [DONE] 是什么?
一个需要 JSON.parse 的普通数据帧
表示流已结束的哨兵文本,必须先判断再解析,不能当 JSON
携带最终 usage 的帧
服务端出错时的错误信息
Q7
用户中途点了「停止生成」,正确的处理方式是?
抛出一个异常让程序崩溃
把连接中断当普通报错处理,rethrow 交给上层重试
用 AbortController 中止,resolve 已累积的部分文本并 reader.cancel()
忽略用户操作,等生成完再返回
Q8
相同生成时长下,为什么流式输出的用户体验明显更好?
流式让模型生成得更快
流式能减少 token 消耗
首字节延迟(TTFB)大幅缩短,用户很快看到进度而不是面对一片空白
流式一定比一次性更省电
提交