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;黑客入侵、非授权访问、窃听、假冒合法用户、病毒…

webpack 自动清理 dist 文件夹的两种实现方法

我们知道在做 vue 项目时&#xff0c;由于项目不断扩大&#xff0c;dist 文件越来越复杂&#xff0c;webpack 生成文件并将其默认放置在 /dist 文件夹中&#xff0c;但是它不会追踪哪些文件是实际在项目中需要的。 &#xff08;1&#xff09;webpack 配置 通常我们会在构建前…

Langevin动力学

Langevin动力学 Langevin动力学是一种数学模型&#xff0c;用于描述带有摩擦和随机扰动的粒子的运动。它是经典动力学与统计物理学的结合&#xff0c;尤其在研究布朗运动和其他由热涨落驱动的现象时非常重要。 数学上&#xff0c;Langevin方程可以写成以下形式&#xff1a; m…

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申请加…

提升学术研究效率与质量的关键

科研工具与资源的发展在信息时代尤为重要&#xff0c;它们不仅能够提升学术研究的效率&#xff0c;还能够促进科学成果的共享与交流。本文旨在探讨几种主要的科研工具与资源&#xff0c;涵盖文献检索、语言翻译、实验方案、数据库查询、在线绘图等多个方面&#xff0c;帮助研究…

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

(科学:某天是星期几)泽勒一致性是由克里斯汀泽勒开发的用于计算某天是星期几的算法。这个公式是: 其中: 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按钮&#…

说下你对Spring IOC 的理解

总结&#xff1a;IOC是一个容器&#xff0c;用来管理对象之间的依赖关系。 控制反转&#xff0c;依赖注入--->注入的方式。。。 说下你对Spring IOC 的理解 1. Spring IOC是一个管理对象之间依赖关系的容器&#xff0c;它实现了依赖注入技术&#xff0c;可以解决传统的紧耦…

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

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

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

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

STM32面试题

STM32面试题通常涉及STM32微控制器的特性、功能、应用以及编程知识。以下是一些可能的面试问题: STM32微控制器的基本介绍: STM32微控制器是由哪家公司生产的?STM32微控制器主要应用于哪些领域?STM32的特性和功能: STM32微控制器有哪些主要特性?请描述STM32的GPIO(通用输…

SQL join和EXISTS效率

先看两个查询&#xff0c;查询目的是在a表中找出b表出现的vid 1.join查询 select a.vid, a.attach_url, a.attach_url_type, a.create_time from ods_truck.tl_vehicle_attach_log ajoin (select distinct vidfrom ods_truck.tl_truck_log_20240613where oprater in (remove,…

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;是对我最大…