优化篇之AI Chat响应换行渲染效果不生效

文章目录

前言

博主介绍:✌目前全网粉丝4W+,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。

涵盖技术内容:Java后端、大数据、算法、分布式微服务、中间件、前端、运维等。

博主所有博客文件目录索引:博客目录索引(持续更新)

CSDN搜索:长路

视频平台:b站-Coder长路

问题背景

ai对话框页面的实现在进行ai回复消息的时候,你会发现没有换行情况,问题的描述是让其生成符合要求的的json文件,但是ai返回的内容页面上展示为没有换行:

我点击复制,得到的内容如下:

复制代码
{
   "title": "",
   "tags": "Milvus,Docker Compose,向量数据库,Attu可视化,镜像加速",
   "categories": "数据库,容器化,AI工具",
   "articleSummary": "保姆级教程教你用 Docker Compose 一键部署 Milvus 2.5.9 向量数据库,含镜像加速、密码配置、Attu 可视化工具安装与 Web UI 访问,全程命令复制即用,轻松搭建高性能 RAG 存储后端。"
}

实际又是有换行的,这个到底是什么问题?

问题分析

我们的chat接口是事件机制响应内容的,本次chat的事件返回内容如下:

复制代码
  data:{"content":"{\n","event":"resp","isFinish":false,"type":"text"}
  data:{"content":" ","event":"resp","isFinish":false,"type":"text"}
  data:{"content":" \"","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"title","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"\":","event":"resp","isFinish":false,"type":"text"}
  data:{"content":" \"\",\n","event":"resp","isFinish":false,"type":"text"}
  data:{"content":" ","event":"resp","isFinish":false,"type":"text"}
  data:{"content":" \"","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"tags","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"\":","event":"resp","isFinish":false,"type":"text"}
  data:{"content":" \"","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"Mil","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"vus","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"向量","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"数据库","event":"resp","isFinish":false,"type":"text"}
  data:{"content":",D","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"ocker","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"安装","event":"resp","isFinish":false,"type":"text"}
  data:{"content":",","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"Att","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"u","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"可视化","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"工具","event":"resp","isFinish":false,"type":"text"}
  data:{"content":",","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"镜像","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"加速","event":"resp","isFinish":false,"type":"text"}
  data:{"content":",D","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"ocker","event":"resp","isFinish":false,"type":"text"}
  data:{"content":" Compose","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"\",\n","event":"resp","isFinish":false,"type":"text"}
  data:{"content":" ","event":"resp","isFinish":false,"type":"text"}
  data:{"content":" \"","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"categories","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"\":","event":"resp","isFinish":false,"type":"text"}
  data:{"content":" \"","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"向量","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"数据库","event":"resp","isFinish":false,"type":"text"}
  data:{"content":",D","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"ocker","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"容器","event":"resp","isFinish":false,"type":"text"}
  data:{"content":",","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"AI","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"工具","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"\",\n","event":"resp","isFinish":false,"type":"text"}
  data:{"content":" ","event":"resp","isFinish":false,"type":"text"}
  data:{"content":" \"","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"article","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"Summary","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"\":","event":"resp","isFinish":false,"type":"text"}
  data:{"content":" \"","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"本文","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"手把手","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"教你","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"用","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"Docker","event":"resp","isFinish":false,"type":"text"}
  data:{"content":" Compose","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"在","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"Linux","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"/Mac","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"上","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"极速","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"部署","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"Mil","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"vus","event":"resp","isFinish":false,"type":"text"}
  data:{"content":" ","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"2","event":"resp","isFinish":false,"type":"text"}
  data:{"content":".","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"5","event":"resp","isFinish":false,"type":"text"}
  data:{"content":".","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"9","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"向量","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"数据库","event":"resp","isFinish":false,"type":"text"}
  data:{"content":",","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"含","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"镜像","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"加速","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"、","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"密码","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"配置","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"、","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"Att","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"u","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"可视化","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"连接","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"及","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"常见","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"坑","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"解决","event":"resp","isFinish":false,"type":"text"}
  data:{"content":",","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"一站式","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"搞定","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"生产","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"级","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"R","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"AG","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"底座","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"。\"\n","event":"resp","isFinish":false,"type":"text"}
  data:{"content":"}","event":"resp","isFinish":false,"type":"text"}
  data:{"event":"resp","isFinish":true,"type":"text"}

你会发现其实其中是有\n的,那为什么页面上的展示没有展示换行效果呢?

对于页面上内容为一个message框,这个实际上是使用的markdown渲染器来实现的可视化:

本质问题原因为markdown渲染情况下,如果是一个\n 是不会显示出换行来的,对于本地的typora、语雀之类的,实际应该是做了兼容,理论需要两个\n\n即可实现换行。

解决思路实现

1)页面渲染展示部分

每次将ai返回的片段部分内容进行替换\n为\n\n即可实现:

2)页面复制功能优化

需要将\n\n去替换为一个\n即可!

实际就是复制给用户只需要一个\n即可。


测试效果

资料获取

大家点赞、收藏、关注、评论啦~

精彩专栏推荐订阅:在下方专栏👇🏻

更多博客与资料可查看👇🏻获取联系方式👇🏻,🍅文末获取开发资源及更多资源博客获取🍅

相关推荐
带娃的IT创业者15 小时前
数字考古学:当整个操作系统史被装进一个浏览器
操作系统·前端开发·webassembly·虚拟化技术·数字考古学·windows 95·复古计算
谷哥的小弟20 小时前
(最新版)VSCode安装图文详解教程
ide·vscode·编辑器·教程·前端开发·图文
海市公约5 天前
Axios网络请求库核心特性与拦截器封装实践
axios·前端开发·promise·拦截器·网络封装
冴羽yayujs8 天前
前端周报:Google I/O 发布 Agentic Web、TypeScript 6.0 正式版、npm 安全新策略
前端·javascript·前端开发·前端学习·前端周报
冴羽yayujs12 天前
快速夯实 JavaScrilpt 基础的 33 个概念
前端·javascript·github·前端开发
冴羽yayujs15 天前
前端周报:Rolldown 1.0 正式发布、TanStack 遭遇史诗级供应链攻击、Bun 全面迁移至 Rust
前端·rust·前端开发·前端周报
极客小俊25 天前
【从零到一】用HTML5+CSS+JavaScript实现一个属于自己的mp3免费音乐播放器 (4) JS交互功能(音乐进度条)
javascript·css·html5·前端开发·免费教程·代码案例·手搓音乐播放器
你好潘先生1 个月前
Next.js + Spring Boot 实现 AI 多模型并行对话系统(架构设计与关键实现)
spring boot·向量检索·next.js·pgvector·ai对话·多模型对比·sse流式输出
不会写程序的未来程序员2 个月前
nvm 安装教程:Node.js 版本管理全攻略 (Win/Mac/Linux) + .nvmrc 实战
linux·macos·node.js·前端开发·环境配置·nvm
神州数码云基地2 个月前
AI助手语音交互:从技术到体验
人工智能·ai·语音识别·前端开发·tts·ai语音