How to apply streaming in azure openai dotnet web application?

2024-09-06 04:44

本文主要是介绍How to apply streaming in azure openai dotnet web application?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意:"如何在 Azure OpenAI 的 .NET Web 应用程序中应用流式处理?"

问题背景:

I want to create a web api backend that stream openai completion responses.

"我想创建一个 Web API 后端,用于流式传输 OpenAI 的完成响应。"

How can I apply the following solution to a web api action in controller?

"如何将以下解决方案应用到控制器中的 Web API 操作?"

var client = new OpenAIClient(nonAzureOpenAIApiKey, new OpenAIClientOptions());
var chatCompletionsOptions = new ChatCompletionsOptions()
{DeploymentName = "gpt-3.5-turbo", // Use DeploymentName for "model" with non-Azure clientsMessages ={new ChatRequestSystemMessage("You are a helpful assistant. You will talk like a pirate."),new ChatRequestUserMessage("Can you help me?"),new ChatRequestAssistantMessage("Arrrr! Of course, me hearty! What can I do for ye?"),new ChatRequestUserMessage("What's the best way to train a parrot?"),}
};await foreach (StreamingChatCompletionsUpdate chatUpdate in client.GetChatCompletionsStreaming(chatCompletionsOptions))
{if (chatUpdate.Role.HasValue){Console.Write($"{chatUpdate.Role.Value.ToString().ToUpperInvariant()}: ");}if (!string.IsNullOrEmpty(chatUpdate.ContentUpdate)){Console.Write(chatUpdate.ContentUpdate);}
}

问题解决:

You can simply wrap your code inside the controller

"您可以简单地将代码包裹在控制器内。"

using Microsoft.AspNetCore.Mvc;
using OpenAI;
using OpenAI.Chat;
using System.Collections.Generic;
using System.Threading.Tasks;[ApiController]
[Route("[controller]")]
public class ChatController : ControllerBase
{[HttpGet]public async Task<ActionResult<List<string>>> GetChatCompletions(){var client = new OpenAIClient(nonAzureOpenAIApiKey, new OpenAIClientOptions());var chatCompletionsOptions = new ChatCompletionsOptions(){DeploymentName = "gpt-3.5-turbo",Messages ={new ChatRequestSystemMessage("You are a helpful assistant. You will talk like a pirate."),new ChatRequestUserMessage("Can you help me?"),new ChatRequestAssistantMessage("Arrrr! Of course, me hearty! What can I do for ye?"),new ChatRequestUserMessage("What's the best way to train a parrot?"),}};var responses = new List<string>();await foreach (StreamingChatCompletionsUpdate chatUpdate in client.GetChatCompletionsStreaming(chatCompletionsOptions)){if (chatUpdate.Role.HasValue){responses.Add($"{chatUpdate.Role.Value.ToString().ToUpperInvariant()}: ");}if (!string.IsNullOrEmpty(chatUpdate.ContentUpdate)){responses.Add(chatUpdate.ContentUpdate);}}return Ok(responses);}
}

If you don't want to hardcode the message and pass that as a body then you can do something like this

"如果您不想将消息硬编码并作为主体传递,那么您可以这样做"

using Microsoft.AspNetCore.Mvc;
using OpenAI;
using OpenAI.Chat;
using System.Collections.Generic;
using System.Threading.Tasks;[ApiController]
[Route("[controller]")]
public class ChatController : ControllerBase
{public class ChatRequest{public List<string> Messages { get; set; }}[HttpPost]public async Task<ActionResult<List<string>>> PostChatCompletions([FromBody] ChatRequest request){var client = new OpenAIClient(nonAzureOpenAIApiKey, new OpenAIClientOptions());var chatCompletionsOptions = new ChatCompletionsOptions(){DeploymentName = "gpt-3.5-turbo",Messages = new List<ChatRequestMessage>()};foreach (var message in request.Messages){chatCompletionsOptions.Messages.Add(new ChatRequestUserMessage(message));}var responses = new List<string>();await foreach (StreamingChatCompletionsUpdate chatUpdate in client.GetChatCompletionsStreaming(chatCompletionsOptions)){if (chatUpdate.Role.HasValue){responses.Add($"{chatUpdate.Role.Value.ToString().ToUpperInvariant()}: ");}if (!string.IsNullOrEmpty(chatUpdate.ContentUpdate)){responses.Add(chatUpdate.ContentUpdate);}}return Ok(responses);}
}

Remember the above implementation of the API does not support streaming responses. It waits for all the chat completions to be received from the OpenAI API, then sends them all at once to the client.

"请记住,上述 API 实现不支持流式响应。它会等待从 OpenAI API 接收到所有聊天完成后,再将它们一次性发送给客户端。"

Streaming responses to the client as they are received from the OpenAI API would require a different approach. This could be achieved using Server-Sent Events (SSE) or a similar technology, but it's important to note that not all clients and network environments support these technologies.

"将从 OpenAI API 接收到的响应流式传输给客户端需要采用不同的方法。这可以通过使用服务器发送事件 (SSE) 或类似技术来实现,但需要注意的是,并非所有客户端和网络环境都支持这些技术。"

Here's a simplified example of how you could implement this using Server-Sent Events in ASP.NET Core:

"以下是一个使用服务器发送事件 (SSE) 在 ASP.NET Core 中实现此功能的简化示例:"

[HttpPost]
public async Task PostChatCompletions([FromBody] ChatRequest request)
{var client = new OpenAIClient(nonAzureOpenAIApiKey, new OpenAIClientOptions());var chatCompletionsOptions = new ChatCompletionsOptions(){DeploymentName = "gpt-3.5-turbo",Messages = new List<ChatRequestMessage>()};foreach (var message in request.Messages){chatCompletionsOptions.Messages.Add(new ChatRequestUserMessage(message));}Response.Headers.Add("Content-Type", "text/event-stream");await foreach (StreamingChatCompletionsUpdate chatUpdate in client.GetChatCompletionsStreaming(chatCompletionsOptions)){if (chatUpdate.Role.HasValue){await Response.WriteAsync($"data: {chatUpdate.Role.Value.ToString().ToUpperInvariant()}: \n\n");}if (!string.IsNullOrEmpty(chatUpdate.ContentUpdate)){await Response.WriteAsync($"data: {chatUpdate.ContentUpdate}\n\n");}}
}

这篇关于How to apply streaming in azure openai dotnet web application?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Java Web指的是什么

Java Web指的是使用Java技术进行Web开发的一种方式。Java在Web开发领域有着广泛的应用,主要通过Java EE(Enterprise Edition)平台来实现。  主要特点和技术包括: 1. Servlets和JSP:     Servlets 是Java编写的服务器端程序,用于处理客户端请求和生成动态网页内容。     JSP(JavaServer Pages)

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

EasyPlayer.js网页H5 Web js播放器能力合集

最近遇到一个需求,要求做一款播放器,发现能力上跟EasyPlayer.js基本一致,满足要求: 需求 功性能 分类 需求描述 功能 预览 分屏模式 单分屏(单屏/全屏) 多分屏(2*2) 多分屏(3*3) 多分屏(4*4) 播放控制 播放(单个或全部) 暂停(暂停时展示最后一帧画面) 停止(单个或全部) 声音控制(开关/音量调节) 主辅码流切换 辅助功能 屏

9.8javaweb项目总结

1.主界面用户信息显示 登录成功后,将用户信息存储在记录在 localStorage中,然后进入界面之前通过js来渲染主界面 存储用户信息 将用户信息渲染在主界面上,并且头像设置跳转,到个人资料界面 这里数据库中还没有设置相关信息 2.模糊查找 检测输入框是否有变更,有的话调用方法,进行查找 发送检测请求,然后接收的时候设置最多显示四个类似的搜索结果

JavaWeb【day09】--(Mybatis)

1. Mybatis基础操作 学习完mybatis入门后,我们继续学习mybatis基础操作。 1.1 需求 需求说明: 根据资料中提供的《tlias智能学习辅助系统》页面原型及需求,完成员工管理的需求开发。 通过分析以上的页面原型和需求,我们确定了功能列表: 查询 根据主键ID查询 条件查询 新增 更新 删除 根据主键ID删除 根据主键ID批量删除