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

本文主要是介绍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应用,从而提供更加流畅和动态的用户体验。希望本文所介绍的内容能够帮助到你,欢迎留言讨论。

这篇关于Semantic Kernel 中的流式输出SSE与Vue3前端接收示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1069535

相关文章

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

pandas中位数填充空值的实现示例

《pandas中位数填充空值的实现示例》中位数填充是一种简单而有效的方法,用于填充数据集中缺失的值,本文就来介绍一下pandas中位数填充空值的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是中位数填充?为什么选择中位数填充?示例数据结果分析完整代码总结在数据分析和机器学习过程中,处理缺失数

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Spring Boot 整合 SSE的高级实践(Server-Sent Events)

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实... 目录1、简述2、Spring Boot 中的SSE实现2.1 添加依赖2.2 实现后端接口2.3 配置超时时

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl