Semantic Kernel 中的流式输出SSE与Vue3前端接收示例

本文将介绍如何在使用 Semantic Kernel 框架的 ASP.NET 项目中使用流式输出 SSE(Server-Sent Events),并展示如何在Vue3前端应用中接收这些数据。并介绍了如何使用 @microsoft/fetch-event-source 库使用 POST 方法来接收 SSE 数据。

1. 背景

在大模型的应用场景中,用户经常需要与模型进行实时交互,例如,生成文本、回答问题等。这些场景要求数据传输能够快速且连续,以提供流畅的用户体验。SSE作为一种基于HTTP的标准协议,允许服务器向客户端推送实时数据,非常适合于此类应用。

2. 什么是 SSE

SSE 并不是一种新的技术,但是随着 ChatGPT 的火热,这种技术又重新受到了关注。

SSE(Server-Sent Events)是一种基于 HTTP 的服务器推送技术,允许服务器实时向客户端推送数据。与 WebSocket 不同,SSE 是单向通信,只能由服务器向客户端推送数据,而客户端无法向服务器发送数据。SSE 使用简单,易于实现,适用于需要实时数据推送的场景。

SSE 的工作原理是,客户端通过 EventSource 对象与服务器建立连接,服务器端通过发送特定格式的数据(如 data: Hello, world!\n\n)来推送消息给客户端。客户端收到消息后,可以通过监听 message 事件来处理数据。

3. 在 Semantic Kernel 中使用 SSE

如果要使用 SSE,首先需要在 ASP.NET 项目正确的引入 Semantic Kernel,并在控制器中添加 SSE 的处理逻辑。

3.1. 引入 Semantic Kernel

以下是 Program.cs 中引入 Semantic Kernel 的相关代码,这里以 Azure OpenAI 做演示:

using Microsoft.SemanticKernel;var builder = WebApplication.CreateBuilder(args);
// ··· 略去其他代码
// 添加语义内核
builder.Services.AddKernel();
builder.Services.AddOpenAIChatCompletion("gpt-4o", new OpenAIClient(new Uri("https://[your-gpt].openai.azure.com/"), new Azure.AzureKeyCredential("[your-key]")));
// ··· 略去其他代码

3.2. 控制器中添加 SSE 处理逻辑

在控制器中添加 SSE 处理逻辑,需要使用 KernelInvokePromptStreamingAsyncInvokeStreamingAsync 方法来获取模型的流式结果输出,并将输出推送给客户端。

示例代码如下:

using Sang.AspNetCore.CommonLibraries.Models;[HttpPost("test")]
[Produces("text/event-stream")]
public async Task<IResult> SSETest()
{var content = _kernel.InvokePromptStreamingAsync("什么是快乐星球?");Response.Headers.ContentType = "text/event-stream";Response.Headers.CacheControl = "no-cache";await Response.Body.FlushAsync();if (content is null){var error = JsonSerializer.Serialize(MessageModel<string>.Fail("生成失败"), _jsonSerializerOptions);await Response.WriteAsync($"data: {error}\n\n");await Response.Body.FlushAsync();}else{await foreach (var item in content){await Response.WriteAsync($"data: {MessageModel<string>.Ok(item.ToString())}\n\n");await Response.Body.FlushAsync();}}// 结束标记await Response.WriteAsync($"data: [DONE]\n\n");await Response.Body.FlushAsync();return Results.Empty;
}

在上面额代码中,我们使用 InvokePromptStreamingAsync 方法获取模型的流式输出,并通过 Response.WriteAsync 方法将输出推送给客户端。每个完整数据包后跟随两个换行符(\n\n),这是SSE协议的要求。在客户端接收到 [DONE] 标记后,表示数据传输结束。这里的 MessageModel 是一个自定义的消息模型,可以安装 Sang.AspNetCore.CommonLibraries 包来使用,每个数据包(message)都是一个完整的 json 数据,方便解析。下图是测试结果:

在这里插入图片描述

4. 前端接收

在Vue3应用中,我们可以使用 EventSource 接口或者第三方库来接收SSE数据。对于原生使用和 EventSource 的更多信息,请参考 MDN 文档。

这里,我们将使用 @microsoft/fetch-event-source 库来演示如何接收服务器发送的数据。

首先,安装 @microsoft/fetch-event-source 库:

npm install @microsoft/fetch-event-source

然后,在Vue组件中,我们可以这样接收数据:

import { ref } from 'vue';
import { fetchEventSource } from '@microsoft/fetch-event-source';const dataStream = ref('');const fetchDataStream = () => {fetchEventSource('/test', {method: 'POST',headers: {"Content-Type": 'application/json',},body: JSON.stringify({ /* 请求体 */ }),onmessage(event) {if (event.data === '[DONE]') {console.log('Stream ended');return;}let data = JSON.parse(event.data);dataStream.value += data.data;// 更新UI等操作},onerror(error) {console.error('Stream encountered error:', error);}});
};

在上面的代码中,我们使用fetchEventSource方法订阅了服务器端的SSE。每当服务器发送新的数据时,onmessage回调就会被触发,我们可以在这里更新Vue组件的状态,以实现数据的实时展示。

注意,这里演示使用的是 POST 请求,在这个案例中直接将服务端和接收端使用 GET 请求也是可以的。但是默认浏览器 EventSource API 对允许发出的请求类型施加了一些限制作,其中就包括不允许使用 POST 请求。因此,如果需要使用 POST 请求,可以使用 @microsoft/fetch-event-source 库。具体的更多信息可以参考 GitHub 仓库 Azure/fetch-event-source。

5. 结语

SSE提供了一种高效、简单的方法,允许服务器向客户端推送实时数据。通过结合Semantic Kernel和Vue3,我们可以构建出能够实时响应大模型推理结果的Web应用,从而提供更加流畅和动态的用户体验。希望本文所介绍的内容能够帮助到你,欢迎留言讨论。

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

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

相关文章

ABAP开发:屏幕输入中,在多个选项卡中如何确定选择了哪个Tab Strips?

在ABAP开发中&#xff0c;使用了SELECTION-SCREEN来创建了一个带有多个选项卡&#xff08;Tab Strips&#xff09;的屏幕。每个选项卡对应一个不同的屏幕编号&#xff08;SCREEN 101, 102, 103&#xff09;&#xff0c;如下图&#xff1a; 屏幕中有Name、Age、City三个标签选择…

39、基于深度学习的(拼音)字符识别(matlab)

1、原理及流程 深度学习中常用的字符识别方法包括卷积神经网络&#xff08;CNN&#xff09;和循环神经网络&#xff08;RNN&#xff09;。 数据准备&#xff1a;首先需要准备包含字符的数据集&#xff0c;通常是手写字符、印刷字符或者印刷字体数据集。 数据预处理&#xff1…

【网络安全】网络安全威胁及途径

1、网络安全威胁的种类及途径 &#xff08;1&#xff09;网络安全威胁的主要类型 网络安全面临的威胁和隐患种类繁多&#xff0c;主要包括人为因素、网络系统及数据资源和运行环境等影响。网络安全威胁主要表现为&#xff1a;黑客入侵、非授权访问、窃听、假冒合法用户、病毒…

18. 第十八章 继承

18. 继承 和面向对象编程最常相关的语言特性就是继承(inheritance). 继承值得是根据一个现有的类型, 定义一个修改版本的新类的能力. 本章中我会使用几个类来表达扑克牌, 牌组以及扑克牌性, 用于展示继承特性.如果你不玩扑克, 可以在http://wikipedia.org/wiki/Poker里阅读相关…

概率论拾遗

条件期望的性质 1.看成f(Y)即可 条件期望仅限于形式化公式&#xff0c;用于解决多个随机变量存在时的期望问题求解&#xff0c;即 E(?)E(E(?|Y))#直接应用此公式条件住一个随机变量&#xff0c;进行接下来的计算即可 定义随机变量之间的距离为&#xff0c;即均方距离 随机…

Redis分布式锁的实现、优化与Redlock算法探讨

Redis分布式锁最简单的实现 要实现分布式锁,首先需要Redis具备“互斥”能力,这可以通过SETNX命令实现。SETNX表示SET if Not Exists,即如果key不存在,才会设置它的值,否则什么也不做。利用这一点,不同客户端就能实现互斥,从而实现一个分布式锁。 举例: 客户端1申请加…

(科学:某天是星期几)泽勒一致性是由克里斯汀·泽勒开发的用于计算某天是星期几的算法。

(科学:某天是星期几)泽勒一致性是由克里斯汀泽勒开发的用于计算某天是星期几的算法。这个公式是: 其中: h是一个星期中的某一天(0 为星期六;1 为星期天;2 为星期一;3 为星期二;4 为 星期三;5 为星期四;6为星期五)。 q 是某月的第几天。 m 是月份(3 为三月&#xff0c;4 为四月,…

朴素贝叶斯分类器 #数据挖掘 #Python

朴素贝叶斯分类器是一种基于概率统计的简单但强大的机器学习算法。它假设特征之间是相互独立的&#xff08;“朴素”&#xff09;&#xff0c;尽管在现实世界中这通常不成立&#xff0c;但在许多情况下这种简化假设仍能提供良好的性能。 基本原理&#xff1a;朴素贝叶斯分类器…

笔记本开机原理

从按下开机键开始&#xff0c;机器是如何开到OS的呢&#xff1f;今天这篇文章和大家极少EC-BIOS-OS的整个开机流程。首先大家要对笔记本的基本架构有所了解&#xff0c;基本架构如下图所示&#xff08;主要组成部分为大写黑体内容&#xff09;。 一、按下PowerButton按钮&#…

人工智能发展历程了解和Tensorflow基础开发环境构建

目录 人工智能的三次浪潮 开发环境介绍 Anaconda Anaconda的下载和安装 下载说明 安装指导 模块介绍 使用Anaconda Navigator Home界面介绍 Environment界面介绍 使用Jupter Notebook 打开Jupter Notebook 配置默认目录 新建文件 两种输入模式 Conda 虚拟环境 添…

酷开会员丨酷开系统K歌模式,父亲节的家庭欢聚时光

K歌以其独特的魅力&#xff0c;为家庭娱乐带来了无限乐趣。想象一下&#xff0c;父亲节这天&#xff0c;打开电视进入K歌频道&#xff0c;与家人一起嗨唱&#xff0c;客厅里充满了欢声笑语&#xff0c;酷开系统的K歌应用也就成为了连接亲情的桥梁&#xff0c;让爸爸们都能在这个…

Nvidia芯片Jetson系列 系统烧录环境 搭建

一、序言 Jetson 系列产品烧录系统的方法一般有两种&#xff1a; 一种为使用 NVIDIA 官方提供 的 SDK manager 软件给 Jetson 设备烧录系统&#xff08;请查看说明文档《Jetson 产品使用 SDKmanager 烧录系统》&#xff09;。 另一种即为当前文档所描述的&#xff0c;在安装 Ub…

基于SSM+Jsp的旅游景点线路网站

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

开源新纪元:ChatTTS——引领对话式文本转语音的新潮流

✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的点赞、关注、收藏、评论&#xff0c;是对我最大…

好用的库函数,qsort函数大详解(干货满满!)(进阶)

前言&#xff1a; 小编在上一篇文章说了这一篇将要写qsort函数的模拟实现&#xff0c;那么废话不多说&#xff0c;现在开始进入今天的代码之旅喽&#xff01; 目录&#xff1a; 1.qsort函数的模拟实现的逻辑和思路 2.qsort函数模拟实现的代码实现 3.代码展示 1.qsort函数的模…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第41课-动态添加3D对象

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第41课-动态添加3D对象 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎…

2.华为配置静态路由

通过配置静态路由让PC1和PC2互通 AR1 [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 192.168.1.254 24 [Huawei]int g0/0/1 [Huawei-GigabitEthernet0/0/1]ip add 1.1.1.1 24 [Huawei]ip route-static 192.168.2.0 24 1.1.1.2AR2 [Huawei]int g0/0/0 [Huawei-Gig…

盘点有趣的人工智能开源项目一

字幕导出 zh_recogn是一个专注于中文语音识别的字幕生成工具&#xff0c;基于魔塔社区Paraformer模型。它不仅支持音频文件&#xff0c;还能处理视频文件&#xff0c;输出标准的SRT字幕格式。这个项目提供了API接口和简单的用户界面&#xff0c;使得用户可以根据自己的需求灵活…

GitLab、jenkins

Gitlab服务器&#xff1a;192.168.10.20 jenkins服务器&#xff1a;192.168.10.30 web应用服务器&#xff1a;192.168.10.100 通过容器部署gitlab&#xff1a; 安装容器管理软件podman 修改主机的22端口&#xff0c;该gitlab软件包中会使用到该端口 gitlab容器需要使用/etc/res…

一二三应用开发平台应用开发示例(3)——生成库表及后端代码

生成库表 前端页面的配置&#xff0c;也就是视图功能&#xff0c;我们先放一放&#xff0c;来看看生成库表和后端代码。 关闭实体配置界面&#xff0c;回到实体列表&#xff0c;勾选“文件夹”实体&#xff0c;点击“生成库表”&#xff0c;并确定。 系统提示成功后&#xff…