当前位置: 首页 > news >正文

前端实现大模型流式响应方案

文章目录

  • 需求背景
  • 方案实现
    • Fetch API 实现
    • Axios 实现
  • 方案对比
  • 优化建议

需求背景

在大模型对话场景中,传统的一次性响应方式会导致用户需要等待较长时间才能看到完整结果。流式响应可以将响应内容分块传输,实现逐字或逐段渲染的效果,显著提升用户体验。

方案实现

Fetch API 实现

const requestBody = {session_id: '1', // 会话唯一标识符messages: [val], // 对话消息数组background_info: background_info.value // 上下文信息
};const response = await fetch(`${import.meta.env.VITE_API_JYH_URL6}chat/stream`, {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify(requestBody)
});if (!response.ok) {setTimeOutAddText('检测异常');over.reqOver = true;over.inputOver = true;loading.value = false;return;
}const reader = response.body.getReader();
const decoder = new TextDecoder('utf-8');
let allText = '';
let first = true;while (true) {const {done, value} = await reader.read();loading.value = false;if (done) break;const chunk = decoder.decode(value, {stream: true});allText += chunk;if (first) {first = false;list.value.push({text: marked.parse(allText), type: 6});} else {list.value[list.value.length - 1].text = marked.parse(allText);}setScrollToBottom();
}

特点:

  • 使用原生 Fetch APIReadableStream
  • 支持 Markdown 格式实时渲染
  • 简单直接,无需额外依赖

Axios 实现

// 接口封装
export const decisionChat = (data, onMessage, onComplete, onError) => {axios.request({url: '/chat',method: 'POST',data: { ...data },headers: {'Accept': 'text/event-stream',},responseType: 'stream',onDownloadProgress: (progressEvent) => {const chunk = progressEvent.currentTarget.responseText;if (chunk) {try {const lines = chunk.split('\n').filter(line => line.trim());lines.forEach(line => {if (line.startsWith('data: ')) {const jsonStr = line.slice(6).trim();try {const parsed = JSON.parse(jsonStr);if (parsed.type === 'token' && parsed.content) {onMessage(parsed.content);}} catch (err) {console.error('解析 SSE 数据失败:', err, '原始行:', line);}}});} catch (err) {console.error('流式数据解析错误:', err);onError?.(err);}}}}).then(() => onComplete?.()).catch((err) => {console.error('流式请求错误:', err);onError?.(err);});
};// 接口调用
const submitForm = async () => {if (!over.value) return ElMessage.warning("请等待上一次回答完成");if (text.value == "\n") {text.value = "";return ElMessage.warning("请输入问题");}over.value = false;list.value.push(text.value);list.value.push('');const lastIndex = list.value.length - 1;await setScrollToBottom();await decisionChat({message: text.value,conversation_id: null},(content) => {list.value[lastIndex] += content;setScrollToBottom();},() => {if (!window.isSpecialHandled) over.value = true;console.log("流式返回结束");},(err) => {console.error("接口请求失败:", err);list.value.push("请求失败,请重试");over.value = true;});text.value = "";
};

解析markdown

import MarkdownIt from 'markdown-it';const md = new MarkdownIt({html: true,         // 允许HTML标签linkify: true,      // 自动识别URLtypographer: true   // 智能标点
})
// 使用 computed 定义可响应的解析函数
const parsedMarkdown = computed(() => {return (content: string) => {if (!content) return '';return md.render(content);};
});

特点:

  • 基于 Axios 封装,适合已有 Axios 集成的项目
  • 支持 Server-Sent Events (SSE) 协议
  • 提供完整的回调机制(消息、完成、错误)

方案对比

特性Fetch API 方案Axios 方案
兼容性现代浏览器现代浏览器
依赖需要 Axios
复杂度简单中等
错误处理基础完善
Markdown 支持内置需额外实现
适合场景简单流式需求复杂企业级应用

优化建议

  1. 错误处理增强

    • 添加网络异常和超时处理
    • 实现重试机制
  2. 性能优化

    • 添加防抖机制避免频繁渲染
    • 考虑使用 Web Worker 处理大数据量
  3. 用户体验

    • 添加加载动画
    • 实现中断请求功能
  4. 代码结构

    • 将流式处理逻辑封装为独立 Hook/组件
    • 添加 TypeScript 类型定义
  5. 兼容性处理

    • 添加对旧浏览器的 polyfill
    • 考虑降级方案(非流式)

两种方案各有优势,可根据项目具体需求选择。对于新项目或简单需求,推荐使用 Fetch API 方案;对于已有 Axios 集成的复杂项目,Axios 方案更为合适。

http://www.dtcms.com/a/316087.html

相关文章:

  • 播放器音频后处理实践(一)
  • LeetCode——2683. 相邻值的按位异或
  • 3. 为什么 0.1 + 0.2 != 0.3
  • Physics Simulation - UE中Projectile相关事项
  • Android 性能基准测试(Benchmark)完全指南:专业方法与最佳实践
  • VNC连接VirtualBox中的Ubuntu24.04 desktop图形化(GUI)界面
  • 【npm 解决】---- TypeError: crypto.hash is not a function
  • 相机拍摄的DNG格式照片日期如何修改?你可以用这款工具修改
  • Android --- Bug调查经验记录
  • linux 破解密码
  • LangGraph学习笔记 — LangGraph中State状态模式
  • 恶魔轮盘赌
  • 对 .NET线程 异常退出引发程序崩溃的反思
  • 基于vscode连接服务器实现远程开发
  • Redis之Set和SortedSet类型常用命令
  • Rust + WebAssembly 上线实战指南
  • LangChain入门:内存、记录聊天历史 ChatMessageHistory、模型、提示 ( Prompt )、模式 ( Schema )
  • Linux3
  • 在CentOS 7上搭建GitLab服务器的完整指南
  • 第二十五天(数据结构:树)
  • 智慧社区(七)——基于 ECharts 与 Spring Boot 实现小区住户数据统计可视化
  • Java面试宝典:对象的内存布局
  • 龙芯(loongson) ls2k1000 openwrt
  • 人工智能领域、图欧科技、IMYAI智能助手2025年3月更新月报
  • 网络巡查平台管理办法对政务管理有哪些作用
  • 进阶向:PDF合并/拆分工具
  • RabbitMQ削峰填谷详解:让系统在流量洪峰中“稳如泰山”
  • 在 MCP 中实现 “askhuman” 式交互:原理、实践与开源方案
  • Java: jwt 入门介绍(Introduction to JSON Web Tokens)
  • Spring 的依赖注入DI是什么?