百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

AI对话, 流式输出响应, 前端对接解析

ztj100 2025-09-19 06:32 2 浏览 0 评论

在 AI 对话场景中,流式输出是提升用户体验的关键技术 —— 它能让 AI 响应像人类对话一样 “逐句呈现”,而非让用户等待完整内容加载完毕,尤其适合长文本生成(如万字报告、多轮复杂对话)。前端对接流式输出的核心,是理解 “服务器如何分块推送数据” 以及 “前端如何实时解析、渲染这些数据”,以下是结合本人自身开发的实际项目做一些解析, 希望对有意对接AI, 开发自身应用的小伙伴有一些帮助, 少走一些弯路。

一、先搞懂:AI 流式输出的底层逻辑

传统接口请求是 “请求 - 全量响应” 模式(前端发请求→服务器生成完整内容→一次性返回),而流式输出是 “请求 - 分块响应” 模式,核心依赖 HTTP/2 或 HTTP/1.1 的 Chunked Transfer Encoding(分块传输编码)—— 服务器无需等待所有内容生成,每生成一段文本就封装成一个 “数据块” 推送给前端,前端接收一块渲染一块。

具体流程如下:

前端:发起流式请求(需在请求头中声明 “接受分块数据”);

后端 / AI 服务:收到请求后,启动 AI 生成任务,按 “句子 / 段落” 粒度拆分生成结果;

传输层:服务器通过 Chunked 编码,将每个数据块标记长度(如5\r\nhello\r\n),逐块发送;

前端:监听 “数据块接收” 事件,每收到一块就解析内容,追加到页面对话区;

结束标识:服务器发送 “空数据块”(0\r\n\r\n),表示流式传输结束,前端关闭连接。

二、前端对接核心方案:按技术栈分类

前端对接流式输出的核心是 “监听数据流”,不同技术栈(原生 JS、Vue2)的实现逻辑一致,但语法细节有差异,以下是落地性极强的实战方案。

原生 JavaScript(无框架通用)

依赖浏览器原生的 Fetch API(支持流式响应)或 new EventSource,推荐用 Fetch(更简洁,支持 ReadableStream)。

关键步骤:

发起流式请求:在 fetch 中设置请求头 Accept: text/event-stream(告诉服务器 “我要流式数据”),且需关闭缓存(Cache-Control: no-cache);

处理响应流:通过 response.body.getReader() 获取 “数据读取器”,循环读取每一块数据;

解码与解析:AI 返回的分块数据是 Uint8Array 格式,需用 TextDecoder 转成字符串,再按后端约定格式解析(如 JSON、SSE 格式);

实时渲染:每解析出一段有效文本,就追加到对话 DOM 中,避免频繁重绘(建议用 textContent 而非 innerHTML,防止 XSS)。

vue2 中 Fetch示例:




vue2 中 new EventSource示例 这个只支持get方式请求:



三、关键细节:避坑与体验优化

前端对接流式输出时,容易遇到 “解析乱码”“渲染卡顿”“断流” 等问题,以下是必须注意的细节:

1. 数据格式解析:避免 “拆包” 导致的 JSON 错误

AI 服务返回的流式数据可能有两种格式,解析逻辑不同:

SSE(Server-Sent Events)格式:标准流式格式,每块以 data: 开头,换行分隔(如 data: {"content":"你好"}\n\ndata: {"content":"今天..."}),需过滤空行、去掉 data: 前缀,再解析 JSON;

纯文本 / JSON 分块:后端直接按文本片段推送(如 “你好”→“今天天气不错”),或按 JSON 数组推送(如 ["你好","今天..."]),需确保 “每块是完整的 JSON”(后端需避免将一个 JSON 拆成多个块,否则前端解析会报错)。

避坑点:若后端返回 JSON 分块,需在后端做 “边界处理”(如按句子结束符分割),前端若遇到 JSON 解析错误,可暂存不完整的分块,待下一块到来后拼接再解析。

数据包的拆分与续接可参考下面代码:

2. 编码统一:防止中文乱码

服务器返回的分块数据是二进制(Uint8Array),前端需用 TextDecoder 转码,必须指定正确的编码格式(默认是 utf-8,但部分后端可能用 gbk),否则会出现中文乱码。

3.vue本地开发, 后端按流式返回,前端却没有流式输出而是一次性输出

这个需要看下前端代理配置,需要自行处理, 去除缓存,禁止代理自动处理数据,这是我项目的代理配置,仅供参考

4. ai对话流一般输出的都是使用markdown语法,还有公式也是需要处理, 能使界面美观

在项目中可以安装"katex": "^0.15.2", "marked": "^5.0.0", marked可以将markdown语法转为 html, vue里面用v-html展示即可, katex可以美化公式相关的展示

import marked from 'marked';

import katex from 'katex';

import 'katex/dist/katex.min.css'; // 引入KaTeX样式


然后在需要使用的地方调用 this.renderMathInElement(this.marked.parse(this.curStr,{ mangle: false, headerIds: false, highlight: null, langPrefix: ''})) 这样就可以了. mangle: false, headerIds: false, highlight: null, langPrefix: ''这些配置是用来解决marked的语法警告, this.curStr是AI对话流返回的markdown语法数据

ai流式输出的前端对接大体上就上面那些内容, 欢迎大家一起探讨, 觉得对你有帮助就帮忙点个赞, 有不清楚的可以评论留言



相关推荐

离谱!写了5年Vue,还不会自动化测试?

前言大家好,我是倔强青铜三。是一名热情的软件工程师,我热衷于分享和传播IT技术,致力于通过我的知识和技能推动技术交流与创新,欢迎关注我,微信公众号:倔强青铜三。Playwright是一个功能强大的端到...

package.json 与 package-lock.json 的关系

模块化开发在前端越来越流行,使用node和npm可以很方便的下载管理项目所需的依赖模块。package.json用来描述项目及项目所依赖的模块信息。那package-lock.json和...

Github 标星35k 的 SpringBoot整合acvtiviti开源分享,看完献上膝盖

前言activiti是目前比较流行的工作流框架,但是activiti学起来还是费劲,还是有点难度的,如何整合在线编辑器,如何和业务表单绑定,如何和系统权限绑定,这些问题都是要考虑到的,不是说纯粹的把a...

Vue3 + TypeScript 前端研发模板仓库

我们把这个Vue3+TypeScript前端研发模板仓库的初始化脚本一次性补全到可直接运行的状态,包括:完整的目录结构所有配置文件研发规范文档示例功能模块(ExampleFeature)...

Vue 2迁移Vue 3:从响应式到性能优化

小伙伴们注意啦!Vue2已经在2023年底正式停止维护,再不升级就要面临安全漏洞没人管的风险啦!而且Vue3带来的性能提升可不是一点点——渲染速度快40%,内存占用少一半,更新速度直接翻倍!还在...

VUE学习笔记:声明式渲染详解,对比WEB与VUE

声明式渲染是指使用简洁的模板语法,声明式的方式将数据渲染进DOM系统。声明式是相对于编程式而言,声明式是面向对象的,告诉框架做什么,具体操作由框架完成。编程式是面向过程思想,需要手动编写代码完成具...

苏州web前端培训班, 苏州哪里有web前端工程师培训

前端+HTML5德学习内容:第一阶段:前端页面重构:PC端网站布局、HTML5+CSS3基础项目、WebAPP页面布局;第二阶段:高级程序设计:原生交互功能开发、面向对象开发与ES5/ES6、工具库...

跟我一起开发微信小程序——扩展组件的代码提示补全

用户自定义代码块步骤:1.HBuilderX中工具栏:工具-代码块设置-vue代码块2.通过“1”步骤打开设置文件...

JimuReport 积木报表 v1.9.3发布,免费可视化报表

项目介绍积木报表JimuReport,是一款免费的数据可视化报表,含报表、大屏和仪表盘,像搭建积木一样完全在线设计!功能涵盖:数据报表、打印设计、图表报表、门户设计、大屏设计等!...

软开企服开源的无忧企业文档(V2.1.3)产品说明书

目录1....

一款面向 AI 的下一代富文本编辑器,已开源

简介AiEditor是一个面向AI的下一代富文本编辑器。开箱即用、支持所有前端框架、支持Markdown书写模式什么是AiEditor?AiEditor是一个面向AI的下一代富文本编辑...

玩转Markdown(2)——抽象语法树的提取与操纵

上一篇玩转Markdown——数据的分离存储与组件的原生渲染发布,转眼已经鸽了大半年了。最近在操纵mdast生成md文件的时候,心血来潮,把玩转Markdown(2)给补上了。...

DeepseekR1+ollama+dify1.0.0搭建企业/个人知识库(入门避坑版)

找了网上的视频和相关文档看了之后,可能由于版本不对或文档格式不对,很容易走弯路,看完这一章,可以让你少踩三天的坑。步骤和注意事项我一一列出来:1,前提条件是在你的电脑上已配置好ollama,dify1...

升级JDK17的理由,核心是降低GC时间

升级前后对比升级方法...

一个vsCode格式化插件_vscode格式化插件缩进量

ESlint...

取消回复欢迎 发表评论: