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


测试效果

资料获取

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

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

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

相关推荐
妍妍爱学习3 天前
前端开发的就业现状及前景
前端开发·未来趋势·就业现状·技术需求·个人发展路径
寒水馨6 天前
Windows下载、安装 Tailwind CSS-v4.3.3(附安装包tailwindcss-windows-x64.exe)
前端·css·前端开发·tailwind css·utility-first·css 框架·独立 cli
寒水馨6 天前
Linux下载、安装 Tailwind CSS-v4.3.3(附安装包tailwindcss-linux-x64)
响应式设计·前端开发·工具类·tailwind css·utility-first·css 框架·oxide 引擎
无巧不成书02189 天前
Vue+Vue-CLI全平台零基础搭建教程
前端·javascript·vue.js·vue·前端开发·vue-cli·前端环境搭建
咖啡星人k14 天前
GitHub Copilot 加入 Agent 浏览器:验证 Web 应用进入编码闭环
前端·人工智能·github·copilot·前端开发·ai agent
蓝星空18 天前
【开发者常犯的一个错】没有一个用户能发现我做的很好用的 Ctrl + V 粘贴截图上传功能
前端开发·image-2
前端进阶之旅22 天前
AI Agent 直连禅道 bug 平台的完整链路实战
前端开发
山海云端有限公司25 天前
随机诗词API实战:Vue项目接入完整示例与5个常见坑
vue·实战·前端开发·跨域·api调用·随机诗词api
红信鸽2 个月前
鸿蒙原生应用上架全记录:ArkTS如何重塑移动端开发范式?
前端开发
红信鸽2 个月前
React 19 Server Components:前端性能的终极重构
前端开发