NetCore ajax 实现chatgpt响应消息流式返回

概述

流式返回是指服务器将回复数据作为流逐步返回给客户端,而不是等待全部数据准备就绪后一次性返回。这对于聊天式应用程序非常有用,因为它允许实时更新对话内容,而不需要等待所有回复都准备好后才显示。

通过Ajax和XHRFields,你可以将用户的输入作为请求发送到ChatGPT服务器,然后将服务器返回的回复作为响应返回给客户端。

前端代码

使用Ajax和XHRFields进行与ChatGPT消息的流式返回的代码:

function sendChatMessage(message) {
  $.ajax({
    url: '/Chat',
    type: 'POST',
    data: { userMessage : message },
    xhrFields: {
      onprogress: function(e) {
        // 处理流式返回的数据
        var response = e.target.responseText;
        // 更新UI,显示新的回复
      }
    },
    success: function(data) {
      // 处理最终的响应数据
      var response = JSON.parse(data);
      // 更新UI,显示最终的回复
    },
    error: function() {
      // 处理请求错误
    }
  });
}

// 调用函数发送聊天消息
sendChatMessage("Hello!");

后端代码

使用Azure OpenAI的接口进行调用需要提前引入Azure.AI.OpenAI,关于Azure OpenAI的介绍可参考博文:使用Azure OpenAI服务创建聊天机器人_程序猿老罗的博客-CSDN博客

using Azure;
using Azure.AI.OpenAI;

接口实现代码仅供参考,具体实现需要根据具体要求来写。

注意需要设置响应的 ContentType = "application/octet-stream"

[Route("[controller]")]
public class OpenAIChatController : ControllerBase
{
	private string apiKey = "";
	private string endpoint = "";
	private string modelName = "";

	private ChatCompletionsOptions completionsOptions;
	public OpenAIChatController()
	{
		completionsOptions = new ChatCompletionsOptions
		{
			Messages =
			{
			new ChatMessage(ChatRole.System, "你是一个精通开发的资深工程师,熟悉全栈技术,任何问题都难不倒你。"),
			new ChatMessage(ChatRole.User, "你好"),
			}
		};
	}

	[HttpPost("Chat")]
	public async Task Chat(string userMessage )
	{
		HttpContext.Response.ContentType = "application/octet-stream";

		var client = new OpenAIClient(new Uri(endpoint), new AzureKeyCredential(apiKey));

		completionsOptions.Messages.Add(new ChatMessage(ChatRole.User, userMessage));//问题

		var completionsResponse = await client.GetChatCompletionsStreamingAsync(modelName, completionsOptions);

		await foreach (var choice in completionsResponse.Value.GetChoicesStreaming())
		{
			await foreach (var message in choice.GetMessageStreaming())
			{
				if (message.Content != null)
				{
					string data = message.Content;
					var bitys = Encoding.UTF8.GetBytes(data);

					await HttpContext.Response.Body.WriteAsync(bitys);
					await HttpContext.Response.Body.FlushAsync(); 

					await Task.Delay(TimeSpan.FromMilliseconds(100));
				}
			}
		}

	}
}

总结

流式返回允许服务器将回复数据分块发送给客户端,使客户端能够实时接收和显示这些数据,从而实现实时更新对话内容的效果。这在聊天式应用程序中非常有用。

通过Ajax和XHRFields配置,你可以发送用户的输入作为请求到ChatGPT服务器,并通过XHRFields的onprogress事件逐步接收和处理服务器返回的回复数据,从而实现流式返回。这样,你可以即时地在客户端上更新对话内容,而无需等待全部回复准备就绪后才显示。这对于实现实时对话功能非常有帮助。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Netcore 可以通过使用网络通信技术实现聊天功能。一种常见的方式是使用Socket套接字进行通信。 首先,我们需要一个服务器端和多个客户端。服务器端负责接收和转发消息,而客户端用于发送和接收消息。 服务器端的实现可以使用Netcore的TcpListener类。该类允许我们创建一个TCP服务器,监听指定的端口,等待客户端的连接。一旦有客户端连接,服务器通过TcpClient接收和发送消息。 客户端的实现可以使用Netcore的TcpClient类。该类允许我们连接到服务器端,并通过网络流发送和接收消息。 在聊天应用中,客户端可以输入消息并发送给服务器,服务器收到消息后转发给所有连接的客户端。客户端也能接收服务器和其他客户端发送的消息,并将其显示在用户界面上。 为了实现实时聊天,我们可以通过在服务器和客户端之间建立一个持久连接来实现。这意味着连接会一直保持打开状态,以便服务器和客户端可以实时发送和接收消息。 使用Netcore的异步编程模型可以提高聊天应用的性能和可扩展性。可以使用async和await关键字来处理异步任务。通过使用异步套接字操作,我们可以同时处理多个连接和消息,避免阻塞或挂起主线程。 总而言之,Netcore提供了丰富的网络编程功能,可以方便地实现聊天应用。通过使用Sockets和异步编程模型,我们可以构建一个高性能、实时的聊天系统。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿老罗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值