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


测试效果

资料获取

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

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

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

相关推荐
不会写程序的未来程序员6 天前
nvm 安装教程:Node.js 版本管理全攻略 (Win/Mac/Linux) + .nvmrc 实战
linux·macos·node.js·前端开发·环境配置·nvm
神州数码云基地6 天前
AI助手语音交互:从技术到体验
人工智能·ai·语音识别·前端开发·tts·ai语音
是席木木啊18 天前
前端接口熔断:概念、场景、自定义封装及企业级库对比
性能优化·前端开发·接口熔断
尘中客18 天前
放弃 Echarts?前端直接渲染后端高精度 SVG 矢量图流的踩坑记录
前端·javascript·echarts·前端开发·svg矢量图·echarts避坑
烛衔溟21 天前
TypeScript 特殊类型与空值安全
安全·typescript·前端开发·空值处理
烛衔溟23 天前
TypeScript 基础类型(上):string、number、boolean 与类型注解
javascript·typescript·前端开发·类型注解
烛衔溟23 天前
TypeScript 基础类型(下):数组、元组与枚举
typescript·前端开发·枚举·数组·元组
漠月瑾-西安25 天前
JavaScript 字符串处理技巧:substring 与 indexOf 的灵活组合
javascript·前端开发·indexof·代码优化·substring·字符串处理
Pu_Nine_91 个月前
前端SSE(Server-Sent Events)实现详解:从原理到前端AI对话应用
前端·langchain·sse·ai对话
叫我一声阿雷吧1 个月前
JS 入门通关手册(24):Promise:从回调地狱到异步优雅写法
javascript·前端开发·promise·前端面试·异步编程·js进阶·js异步