优化篇之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即可。


测试效果

资料获取

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

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

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

相关推荐
_OP_CHEN1 天前
【前端开发之JavaScript】(四)JS基础语法下篇:函数与对象核心要点深度解析
开发语言·前端·javascript·界面开发·前端开发·网页开发·语法基础
SuniaWang3 天前
Spring Boot + Spring AI + Vue 3 + TypeScript + Milvus 项目实战
java·人工智能·spring boot·spring·typescript·框架·前端开发
_OP_CHEN5 天前
【前端开发之JavaScript】(二)JS基础语法上篇:吃透变量 / 类型 / 输入输出
开发语言·javascript·html·ecmascript·前端开发·网页开发
全栈探索者8 天前
useState 换个名字叫 @State,仅此而已
react·harmonyos·arkts·前端开发·deveco studio·状态管理·鸿蒙next
全栈探索者11 天前
@Component + struct = 你的新函数组件——React 开发者的鸿蒙入门指南(第 2 期)
react·harmonyos·arkts·前端开发·deveco studio·鸿蒙next·函数组件
realhuizhu11 天前
为什么程序员配出的颜色像"斑斓的灰"?因为你还在靠直觉
前端开发·ai工具·ui设计·deepseek·程序员提升
bin915325 天前
(文后附完整代码)html+css+javascript 弓箭射击游戏项目分析
前端·javascript·css·游戏·html·前端开发
bin915325 天前
(文后附完整代码)html+css+javascript 弹球射击游戏项目分析
前端·javascript·css·游戏·html·前端开发
_OP_CHEN1 个月前
【前端开发之HTML】(三)HTML 常见标签(下):图文、链接与实战,解锁网页交互新姿势!
前端·html·交互·前端开发·网页开发·界面美化