谈谈前端AI系列
- sse请求,在ai中的应用,如何发sse请求,请求头如何配置
- AI对话的流式内容如何实现
- 服务端的逐块内容返回如何实现
- 使用服务端的sdk
- 谈谈大模型的token
AI对话的流式内容如何实现
在 AI 对话中(如 ChatGPT、Claude、Gemini 等),可以看到“回答逐字输出”的效果,这种 流式响应(Streaming Response) 通常是通过 SSE 协议 实现的
- SSE(Server-Sent Events)
- 是一种单向通信机制,由服务器主动推送消息到客户端
- AI 对话中,服务端通常不会一次性返回整段文本,而是随着模型生成 token 就实时发送给客户端
- 前端通过fetch请求来获取流式内容
- 通过响应内容的:
- response.body.getReader();
- 使用循环持续读取 SSE 数据,来进行不断获取读取文本来渲染
客户端接收流(fetch 实现)
async function requestStream() {
const response = await fetch('/api/ai/stream', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
});
const reader = response.body.getReader();
const decoder = new TextDecoder('utf-8');
while (true) {
const { done, value } = await reader.read();
if (done) break;
const text = decoder.decode(value, { stream: true });
console.log(text); // 打印流式数据
}
}
服务端逐块内容返回实现
服务端通过 HTTP 分块传输(Chunked Transfer Encoding) 向客户端持续推送内容
响应头配置
HTTP/1.1 200 OK
Content-Type: text/event-stream
Connection: keep-alive
Cache-Control: no-cache
Transfer-Encoding: chunked
| Header | 作用 |
|---|---|
| Connection: keep-alive | 保持长连接,持续推送内容, 避免请求结束后自动关闭 |
| Content-Type: text/event-stream | 告诉浏览器这是 SSE 数据流 |
| Cache-Control: no-cache | 禁止中间层缓存,确保实时性 |
| Transfer-Encoding: chunked | 启用分块传输模式,让数据可以一块块推送 |
注意问题
- 一定要禁用缓存
- 若没有设置
Cache-Control: no-cache,中间层(如 CDN 或 Nginx)可能会缓存流式数据,导致内容卡顿或延迟。
- 若没有设置
- 必须使用 UTF-8
- SSE 要求
text/event-stream的内容必须是 UTF-8 编码,否则浏览器端可能解码异常。
- SSE 要求
- 保持连接不断开
- 若请求超过一定时间(如 60 秒)被网关或反向代理断开,可以:
- 定期发送心跳:
res.write(': ping\n\n') - 或调整 Nginx / Cloudflare 超时时间。
- 定期发送心跳:
- 若请求超过一定时间(如 60 秒)被网关或反向代理断开,可以:
- 最后一块要显式结束
- 服务端发送
[DONE]或调用res.end()明确告知流结束。
- 服务端发送
大模型的token
- token是模型理解的文本的最小单位
- 不同模型的有不同的token的分词计算规则
- 模型计算成本按 token 计费
需要理解好模型的token
- 控制成本:模型按 token 计费
- 控制上下文长度:模型有最大 token 限制(如 GPT-4o = 128k tokens)
agent是如何工作的?
- 理解模型底层怎么运作
- 用户发消息给模型,构造上下文,工具/技能调用,调用了就执行,把结果喂回去,继续循环,直接模型觉得任务完成了
- 用户意图识别 → 选择上下文 → 选择工具/技能 → 执行 → 观察结果 → 继续循环 → 满足停止条件后输出。
- 这里工具指 agent可调用外部的能力,如搜索、读写文件、 调用api、执行命令等等
- 这里的继续循环是指 agent不会只思考一次,不会调用一次工具就结束,而是会根据上一步的结果,继续思考决定下一步,这是一个反复的过程
- 继续循环 可以理解为继续思考,思考每一步决定要做的事情
- 很多任务不是一步就能完成,需要经过几轮的思考,每一步都依赖上一步都结果,因此需要循环
- 简单的理解:继续循环就是 agent 会根据上一步的结果继续思考,并决定下一步要做什么;做完之后再根据新结果继续判断,直到任务完成
AI应用的TTFB指标如何优化?
用户发起请求,到看到第一个 token 的时间
- 减少上下文体积 context
- 精简的提示词 prompt
AI应用内容输出的流畅度如何优化?
- 增量渲染
- 分块 markdown parse
- 虚拟列表