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

相关文章

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批量删除

利用Django框架快速构建Web应用:从零到上线

随着互联网的发展,Web应用的需求日益增长,而Django作为一个高级的Python Web框架,以其强大的功能和灵活的架构,成为了众多开发者的选择。本文将指导你如何从零开始使用Django框架构建一个简单的Web应用,并将其部署到线上,让世界看到你的作品。 Django简介 Django是由Adrian Holovaty和Simon Willison于2005年开发的一个开源框架,旨在简

web群集--nginx配置文件location匹配符的优先级顺序详解及验证

文章目录 前言优先级顺序优先级顺序(详解)1. 精确匹配(Exact Match)2. 正则表达式匹配(Regex Match)3. 前缀匹配(Prefix Match) 匹配规则的综合应用验证优先级 前言 location的作用 在 NGINX 中,location 指令用于定义如何处理特定的请求 URI。由于网站往往需要不同的处理方式来适应各种请求,NGINX 提供了多种匹

构建高性能WEB之HTTP首部优化

0x00 前言 在讨论浏览器优化之前,首先我们先分析下从客户端发起一个HTTP请求到用户接收到响应之间,都发生了什么?知己知彼,才能百战不殆。这也是作为一个WEB开发者,为什么一定要深入学习TCP/IP等网络知识。 0x01 到底发生什么了? 当用户发起一个HTTP请求时,首先客户端将与服务端之间建立TCP连接,成功建立连接后,服务端将对请求进行处理,并对客户端做出响应,响应内容一般包括响应

(南京观海微电子)——GH7006 Application Note

Features ⚫ Single chip solution for a WXGA α-Si type LCD display ⚫ Integrate 1200 channel source driver and timing controller ⚫ Display Resolution: ◼ 800 RGB x 480 ◼ 640 RGB x 480 ⚫ Display int