.NET Web应用实现OpenAI聊天响应流式输出的技术问询
如何在.NET Web应用中实现OpenAI聊天响应的真实流式输出?
我们团队基于OpenAI的gpt-3.5-turbo API开发烹饪短课程聊天机器人导师。因提示词(约2000token)和补全内容(约1000token)体量无法再压缩,响应耗时可达半分钟,必须通过真实流式输出提升用户体验。但我们熟悉Python和数学背景,对.NET技术陌生,查阅的现有方案要么是将内容输出到控制台而非应用,要么是伪流式(等完整响应生成后拆分模拟)。
我们需要一个极简示例:调用C#/.NET OpenAI API执行"写一首100token的诗"的提示词,实现真实流式输出到Web应用的HTTP响应,禁止使用控制台输出或伪流式手段。其余基于LangChain、Pinecone及MSSQL的后台逻辑已完成。
已尝试无效的方案
- 各类"后端技巧":无法通过循环逐句模拟流式,也不能拆分响应片段生成内容;提示词和响应无法缩短,需传递对话历史、语义搜索上下文及模型规则,还有无需展示的危险内容检测辅助机器人逻辑。
- 微软官方文档示例:仅使用
console.write()输出到控制台,且GitHub官方支持工单常未解决就关闭。 - Azure Functions:只能一次性获取完整响应;同时我们认为Python HTTP响应无法实现流式输出(单脚本对应单响应)。
极简实现示例
以下是ASP.NET Core Web应用中的真实流式输出端点示例,使用OpenAI官方NuGet包OpenAI:
1. 安装依赖
在项目中安装OpenAI的.NET包:
dotnet add package OpenAI
2. 编写API端点
在Program.cs(或控制器)中添加流式响应端点:
using OpenAI; using OpenAI.Chat; var builder = WebApplication.CreateBuilder(args); builder.Services.AddOpenAIClient(builder.Configuration["OpenAI:ApiKey"]); var app = builder.Build(); app.MapPost("/stream-poem", async (HttpContext context, IOpenAIClient openAIClient) => { // 设置响应头,指定为流式文本 context.Response.Headers.ContentType = "text/plain; charset=utf-8"; context.Response.Headers.TransferEncodingChunked = "true"; var chatCompletionOptions = new ChatCompletionCreateRequest { Model = "gpt-3.5-turbo", Messages = new List<ChatMessage> { new ChatMessage(ChatRole.User, "写一首100token的诗") }, Stream = true // 开启流式响应 }; // 流式获取OpenAI的响应块 await foreach (var chunk in openAIClient.ChatEndpoint.StreamCompletionAsync(chatCompletionOptions)) { if (chunk.Choices.FirstOrDefault()?.Delta?.Content is string content && !string.IsNullOrEmpty(content)) { // 将每个内容块写入HTTP响应流 await context.Response.WriteAsync(content); // 强制刷新响应流,确保内容即时发送到客户端 await context.Response.Body.FlushAsync(); } } }); app.Run();
说明
- 该端点通过
Stream = true开启OpenAI的流式API调用,逐块获取响应内容。 - 直接将每个内容块写入
HttpContext.Response,并通过FlushAsync()强制刷新流,确保内容即时推送到客户端,实现真实流式输出。 - 无需等待完整响应生成,也不依赖控制台输出,完全适配Web应用场景。
内容的提问来源于stack exchange,提问作者Antonio Krizmanić
相关产品推荐
相关产品推荐

