chatgpt流式文本输出(纯文本+特殊文本)

news/2024/12/24 9:43:59/文章来源:https://www.cnblogs.com/yapi-wwj/p/18626665

最近做了一个demo,是有关gpt的流式文本输出,分为两个版本,一个是纯文本A,另一个是含数学公式等特殊文本的版本B。目前,A效果还不错,B能实现但是有缺憾;B只能在公式的latex全部输出完后才能转化为数学公式。如果B的返回结果比较长,那么一大段串的latex输出却迟迟不能转化为公式,这使用体验就差了点,目前还未解决,在想办法。
以下为目前两个版本

A

<script setup lang="ts">
import {onMounted, ref} from "vue";const displayContent = ref<string>('');
const currentIndex = ref<number>(0);const handleDisplayContent = (content: string) => {const delay = 50const tick = () => {if (currentIndex.value < content.length) {displayContent.value += content.charAt(currentIndex.value);currentIndex.value++;setTimeout(tick, delay);}}tick();
}onMounted(async () => {try {const response = await fetch('https://api.xygeng.cn/one');if (!response.body) return;const reader: ReadableStreamDefaultReader<Uint8Array> = response.body.getReader();//stream读取let receivedContent = '';const decoder: TextDecoder = new TextDecoder();//文本解码器, 用于将二进制数据转换为文本while (true) {const {done, value} = await reader.read();//value为二进制if (done) break;receivedContent += decoder.decode(value, {stream: true});}let json2ObjectContent = JSON.parse(receivedContent).data.content;//将json字符串转换为对象,并取得content字段handleDisplayContent(json2ObjectContent);} catch (error) {console.error("fetch请求错误:", error);}
});</script><template><div v-html="displayContent"></div>
</template><style scoped lang="scss">
/* 添加样式以美化输出 */
</style>

B

<script setup lang="ts">
import {onMounted, ref, nextTick} from "vue";
import Mathjax from "@/utils/mathjax.ts";const displayContent = ref<string>('');
const currentIndex = ref<number>(0);// 处理文本显示
const handleDisplayContent = (content: string) => {const delay = 5;const tick = async () => {if (currentIndex.value < content.length) {displayContent.value += content.charAt(currentIndex.value);currentIndex.value++;setTimeout(tick, delay);} else if (currentIndex.value === content.length) {await nextTick(() => {if (Mathjax.isMathjaxConfig) {Mathjax.initMathjaxConfig();}Mathjax.MathQueue('.displayViewContainer');});}};tick();
};onMounted(async () => {try {const response = await fetch('http://127.0.0.1:3007/api/test', {method: 'POST'});if (!response.body) return;const reader: ReadableStreamDefaultReader<Uint8Array> = response.body.getReader(); // stream读取let receivedContent = '';const decoder: TextDecoder = new TextDecoder(); // 文本解码器, 用于将二进制数据转换为文本while (true) {const {done, value} = await reader.read(); // value为二进制if (done) break;receivedContent += decoder.decode(value, {stream: true});}let json2ObjectContent = JSON.parse(receivedContent).content; // 将json字符串转换为对象, 并取得content字段handleDisplayContent(json2ObjectContent);} catch (error) {console.error("fetch请求错误:", error);}
});
</script><template><div class="displayViewContainer" v-html="displayContent"></div>
</template><style scoped lang="scss"></style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/857996.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建响应式数据

创建响应式数据 Vue2中 ​ 在vue2中数据写在对应的data中就是响应式的。 Vue3 ref :可以定义基本类型的响应式数据 先要导入对应的ref,然后才能使用 import {ref} from vue​ 作用:定义响应式变量。 ​ 语法:let xxx = ref(初始值)。 ​ 返回值:一个RefImpl的实例对象…

【深度剖析】自主可控的全国产方案,基于龙芯LS2K1000LA-i!

龙芯LS2K1000LA-i产品简介 LS2K1000LA-i是龙芯双核LoongArch LA264自主架构处理器。创龙科技基于LS2K1000LA-i设计的工业核心板(SOM-TL2K1000)板载的CPU、ROM、RAM、电源、晶振、连接器等所有元器件均采用国产工业级方案,国产化率100%。 此外,创龙科技基于LS2K1000LA-i设计的…

协作文档让销售工作事半功倍的秘密

在现代医疗销售行业中,高效协同是成功的关键。无论是销售方案的制定,客户拜访记录的共享,还是跨部门的合作,在线协作文档正在成为推动团队效率和精准度的核心工具。特别是在医疗销售这种信息密集型领域,在线协作文档不仅改变了团队的沟通方式,更重塑了销售流程,助力企业…

这款跨网文件安全交换系统 凭什么受到各行业的欢迎?

跨隔离网的文件传输交换,这是各个行业都会面临的场景,能解决传输问题的工具也不少,可为什么说有一款跨网文件安全交换系统,在各行业中应用都很广泛,受到各行业的欢迎呢?首先我们来看看跨网文件传输有哪些需求。一、跨网文件传输的普遍需求 跨网文件传输的普遍需求与挑战可…

模型上下文协议MCP

MCP(Model Context Protocol) Anthropic推出的一种开放协议,旨在统一LLM应用于外部数据源之间的通讯协议使之无缝集成,MCP提供了标准化协议使得LLM与所需要的上下文无缝衔接。使用MCP可以插件式为LLM的集成各种外部数据源。MCP概念上图为MCP官方所描述的MCP架构图,MCP Hosts…

TB级大文件如何安全又轻松地发送?FMail文件邮能实现

许多行业的企业存在着发送GB级、TB级大文件的业务场景,如半导体企业、汽车制造企业、跨境电商、地图测绘、生物科研等,都涉及大量大文件的内部及内外部流转需求。 在进行大文件传输时,企业常用的方式主要包括传统邮件、移动U盘拷贝、FTP传输,以及硬盘刻录通过车辆物理运输等…

客户不回消息?试试这些超实用沟通技巧

在销售与客户沟通过程中,我们时常会面临客户未回复消息的情境,这时应该如何妥善处理呢?以下提供了一些实用的沟通话术,旨在帮助你在各种情境下都能更有效地与客户取得联系。 初次接触后客户未回应 客户或许对初次接收的信息不感兴趣,又或是信息众多而被忽略。 推荐话术:“…

Spring事务管理深度解析-从实践到原理

事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制 分类 主要分为编程式事务和声明式事务两种。 编程式事务 是指在代码中手动的管理事务的提交、回滚等操作,代码侵入性比较强,如下示例: try {//TODO somethingtransactionManager.commit(status); } c…

创建用于预测序列的人工智能模型,设计模型架构。

上一篇:《创建用于预测序列的人工智能模型,设计数据集》 序言:在前一篇中,我们创建了用于训练人工智能模型的数据集。接下来,就要设计模型的架构了。其实,人工智能模型的开发关键并不在于代码量,而在于其中的数学原理和数据集(即人类经验)的深度与质量。 创建模型的架…

原来Flutter背后的布局原理是这样的

文章首发博客网站,由于格式解析问题,你可以前往阅读原文如果你是一名web开发者应该对于元素的布局不陌生,直接给目标元素定义尺寸就可以了,如css的width/height 、android的layout_width等等,但在flutter中同样的尺寸定义可能并不会呈现出自己想要的效果 扫码关注公众号,…

UML之包与包图

了解UML的人都知道UML中也有包的概念,包在UML中作用与面向对象编程语言中类似,它是管理对象的工具,也是解决对象同名冲突的手段。 在UML中,包的表示图形是一个左上角带标签的矩形,而包名可以标注于矩形中央(如下图所示,包名Package1位于矩形中央)或者左上角的标签之内。…