You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 17:30:56