.NET 8 MAUI应用中基于ChatGPT实现会话续存的多主题聊天需求
基于.NET 8 MAUI的ChatGPT多用户多主题会话实现方案
一、用OpenAI-DotNet维持会话
OpenAI的Chat Completion API不需要显式传递conversationId,会话的维持是通过完整保留对话上下文消息列表实现的。每次发起新请求时,把历史消息(用户提问、助手回复、系统提示)全部传入ChatRequest即可。
核心实现步骤
- 初始化并维护用户专属的消息列表
- 每次用户发送新消息时,将消息添加到列表
- 携带完整消息列表发起请求,获取助手回复后再将回复添加到列表
代码示例
// 按用户ID维护消息列表,支持多用户会话 private Dictionary<string, List<Message>> _userConversations = new Dictionary<string, List<Message>>(); // 初始化用户会话(首次进入或新用户) private void InitUserConversation(string userId, string systemPrompt = "You are a helpful assistant designed to output JSON.") { if (!_userConversations.ContainsKey(userId)) { _userConversations[userId] = new List<Message> { new Message(Role.System, systemPrompt) }; } } // 发送新消息并获取回复 private async Task SendUserMessage(string userId, string userInput) { var api = new OpenAIClient(); var conversation = _userConversations[userId]; // 添加用户新消息到上下文 conversation.Add(new Message(Role.User, userInput)); var chatRequest = new ChatRequest( messages: conversation, model: Model.GPT4o, responseFormat: ChatResponseFormat.Json ); var response = await api.ChatEndpoint.GetCompletionAsync(chatRequest); // 将助手回复添加到上下文 if (response.Choices?.FirstOrDefault()?.Message != null) { conversation.Add(response.Choices.First().Message); } // 后续可更新UI展示对话 }
二、会话持久化:页面重进后恢复对话
要实现用户离开页面再返回时继续会话,需要将每个用户的消息列表持久化到本地存储。推荐使用MAUI的Preferences(轻量数据)或SQLite(复杂数据)。
用Preferences实现简单持久化
// 保存用户会话到本地 private void SaveUserConversation(string userId) { if (_userConversations.TryGetValue(userId, out var messages)) { // 将消息序列化为JSON字符串 string json = JsonSerializer.Serialize(messages); Preferences.Set($"Conversation_{userId}", json); } } // 从本地加载用户会话 private void LoadUserConversation(string userId) { if (Preferences.ContainsKey($"Conversation_{userId}")) { string json = Preferences.Get($"Conversation_{userId}", string.Empty); var messages = JsonSerializer.Deserialize<List<Message>>(json); if (messages != null) { _userConversations[userId] = messages; } } else { // 初始化新会话 InitUserConversation(userId); } }
调用时机
- 用户离开聊天页面时调用
SaveUserConversation - 用户进入聊天页面时调用
LoadUserConversation
三、官方OpenAI NuGet包的实现方式
如果觉得OpenAI-DotNet使用复杂,官方OpenAI包的实现逻辑完全一致,核心也是维护消息上下文:
代码示例
using OpenAI.Chat; private Dictionary<string, List<ChatMessage>> _userConversations = new Dictionary<string, List<ChatMessage>>(); private void InitUserConversation(string userId, string systemPrompt = "You are a helpful assistant designed to output JSON.") { if (!_userConversations.ContainsKey(userId)) { _userConversations[userId] = new List<ChatMessage> { new SystemChatMessage(systemPrompt) }; } } private async Task SendUserMessage(string userId, string userInput) { var client = new OpenAIClient(); var conversation = _userConversations[userId]; conversation.Add(new UserChatMessage(userInput)); var chatCompletionOptions = new ChatCompletionOptions { Messages = conversation, Model = "gpt-4o", ResponseFormat = ChatResponseFormat.JsonObject }; var response = await client.Chat.CompleteChatAsync(chatCompletionOptions); if (response.Choices?.FirstOrDefault()?.Message != null) { conversation.Add(response.Choices.First().Message); } }
会话持久化逻辑和之前一致,只需要将Message替换为官方包的ChatMessage进行序列化即可。
内容的提问来源于stack exchange,提问作者Enrico
相关产品推荐
相关产品推荐

