.NET AI对话的流式响应与性能优化:StreamingChatMessage 深度实践系列:.NET C# Semantic Kernel 集成深度解析 ⑤/6难度:⭐⭐⭐(进阶源码,需.NET基础)源码仓库:github.com/zongge0812/zonggeAgent适用环境:.NET 9.0 + WPF一、引言流式响应是 AI 桌面应用中决定用户体验的关键因素。用户点击"发送"后,是等 5 秒一次性看到完整回复,还是 AI 逐字逐句显示在屏幕上?❌ 非流式:用户等待 → 等待 → 等待 → 一次性显示全部回复 ✅ 流式: 用户看到 AI 正在"打字" → 逐字显示 → 即时反馈zonggeAgent 的流式实现覆盖了4 个核心能力:┌──────────────────────────────────────────────────────────────┐ │ ① IAsyncEnumerable 流式处理 ← SK 原生流式 API │ │ ② Token 用量追踪 ← 从 Metadata["Usage"] 提取 │ │ ③ 智能分块与打字机效果 ← StreamingOptimizationService │ │ ④ 性能监控与日志 ← PerformanceMonitor │ └──────────────────────────────────────────────────────────────┘二、IAsyncEnumerable 流式处理2.1 流式调用入口IAIProviderService接口定义了两种流式方法:// 使用默认 ExecutionSettingsIAsyncEnumerableChatMessageSendMessageStreamAsync(stringuserMessage,ChatHistorychatHistory,AIProviderConfigconfig,CancellationTokencancellationToken=default);// 使用自定义 ExecutionSettingsIAsyncEnumerableChatMessageSendMessageStreamAsync(stringuserMessage,ChatHistorychatHistory,AIProviderConfigconfig,PromptExecutionSettings?executionSettings,CancellationTokencancellationToken=default);两个重载的设计意图很清晰——默认方法委托到自定义方法:publicasyncIAsyncEnumerableChatMessageSendMessageStreamAsync(stringuserMessage,ChatHistorychatHistory,AIProviderConfigconfig,CancellationTokencancellationToken=default){varexecutionSettings=CreateExecutionSettings(config);awaitforeach(varmessageinSendMessageStreamAsync(userMessage,chatHistory,config,executionSettings,cancellationToken)){yieldreturnmessage;}}2.2 流式核心实现publicasyncIAsyncEnumerableChatMessageSendMessageStreamAsync(stringuserMessage,ChatHistorychatHistory,AIProviderConfigconfig,PromptExecutionSettings?executionSettings,CancellationTokencancellationToken=default){varstartTime=DateTime.Now;_performanceMonitor.RecordRequestStart(ProviderType,DisplayName);_performanceMonitor.RecordStreamingStart(ProviderType);try{// ① 构建 ChatService 和 KernelvarchatService=awaitCreateChatServiceAsync(config);varkernel=CreateKernel(chatService);// ② 热加载插件PluginLoader.RegisterPlugin(kernel);// ③ 应用模式过滤kernel=ApplyChatModeFilter(kernel,chatService);// ④ 准备执行设置varpromptSetting=executionSettings??CreateExecutionSettings(config);// ⑤ 添加用户消息到对话历史chatHistory.Add(newChatMessageContent(AuthorRole.User,userMessage));// ⑥ 开始流式接收varfullContent=newStringBuilder();_streamingUsage=null;// 重置Token追踪awaitforeach(varmessageinchatService.Get