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

如何用C# HTTP实现GPT-3.5-Turbo多会话并保留对话上下文

实现C#调用GPT-3.5-Turbo的多会话上下文管理

1. 定义会话实体

先创建用于存储单会话信息的实体类,包含会话ID和消息历史:

public class ChatSession
{
    public string SessionId { get; set; }
    public List<ChatMessage> Messages { get; set; } = new List<ChatMessage>();
}

public class ChatMessage
{
    public string Role { get; set; } // 可选值:"user", "assistant", "system"
    public string Content { get; set; }
}

2. 实现会话管理器

用线程安全的字典存储所有会话,提供创建、获取、删除会话的核心方法:

using System.Collections.Concurrent;

public class ChatSessionManager
{
    private readonly ConcurrentDictionary<string, ChatSession> _sessions = new ConcurrentDictionary<string, ChatSession>();

    // 创建新会话,返回唯一会话ID
    public string CreateSession()
    {
        var sessionId = Guid.NewGuid().ToString();
        _sessions.TryAdd(sessionId, new ChatSession { SessionId = sessionId });
        return sessionId;
    }

    // 根据ID获取会话,不存在则返回null
    public ChatSession GetSession(string sessionId)
    {
        _sessions.TryGetValue(sessionId, out var session);
        return session;
    }

    // 删除指定会话
    public bool DeleteSession(string sessionId)
    {
        return _sessions.TryRemove(sessionId, out _);
    }
}

3. 修改GPT API调用逻辑

结合会话管理器,在每次请求时携带对应会话的历史消息,并将新的交互内容追加到会话中:

using System.Net.Http;
using System.Text;
using System.Text.Json;

public class GptApiClient
{
    private readonly HttpClient _httpClient;
    private readonly string _apiKey;
    private readonly ChatSessionManager _sessionManager;

    public GptApiClient(string apiKey, ChatSessionManager sessionManager)
    {
        _apiKey = apiKey;
        _sessionManager = sessionManager;
        _httpClient = new HttpClient();
        _httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");
    }

    public async Task<string> SendMessage(string sessionId, string userMessage)
    {
        var session = _sessionManager.GetSession(sessionId);
        if (session == null)
        {
            throw new ArgumentException("无效的会话ID");
        }

        // 将用户消息加入会话历史
        session.Messages.Add(new ChatMessage { Role = "user", Content = userMessage });

        // 构建API请求体
        var requestBody = new
        {
            model = "gpt-3.5-turbo",
            messages = session.Messages,
            temperature = 0.7
        };

        var jsonContent = new StringContent(JsonSerializer.Serialize(requestBody), Encoding.UTF8, "application/json");
        var response = await _httpClient.PostAsync("https://api.openai.com/v1/chat/completions", jsonContent);
        
        response.EnsureSuccessStatusCode();
        var responseBody = await response.Content.ReadAsStringAsync();
        var result = JsonSerializer.Deserialize<GptResponse>(responseBody);

        var assistantMessage = result.Choices[0].Message.Content.Trim();
        // 将AI回复加入会话历史
        session.Messages.Add(new ChatMessage { Role = "assistant", Content = assistantMessage });

        return assistantMessage;
    }

    // 用于反序列化API响应的内部模型
    private class GptResponse
    {
        public List<GptChoice> Choices { get; set; }
    }

    private class GptChoice
    {
        public ChatMessage Message { get; set; }
    }
}

4. 使用示例

展示创建会话、多轮交互、切换会话的完整流程:

class Program
{
    static async Task Main(string[] args)
    {
        string apiKey = "你的OpenAI API密钥";
        var sessionManager = new ChatSessionManager();
        var gptClient = new GptApiClient(apiKey, sessionManager);

        // 创建第一个会话并交互
        var sessionId1 = sessionManager.CreateSession();
        Console.WriteLine($"会话1 ID: {sessionId1}");
        var reply1 = await gptClient.SendMessage(sessionId1, "你好,我叫张三");
        Console.WriteLine($"AI回复1: {reply1}");
        var reply2 = await gptClient.SendMessage(sessionId1, "还记得我叫什么吗?");
        Console.WriteLine($"AI回复2: {reply2}");

        // 创建第二个会话,切换到新会话交互
        var sessionId2 = sessionManager.CreateSession();
        Console.WriteLine($"\n会话2 ID: {sessionId2}");
        var reply3 = await gptClient.SendMessage(sessionId2, "你好,我叫李四");
        Console.WriteLine($"AI回复3: {reply3}");

        // 切回第一个会话继续交互
        var reply4 = await gptClient.SendMessage(sessionId1, "给我讲讲C#异步编程的核心概念");
        Console.WriteLine($"\nAI回复4: {reply4}");

        // 不再使用的会话可以删除
        sessionManager.DeleteSession(sessionId2);
    }
}

关键说明

  • 采用ConcurrentDictionary保证多线程场景下的会话操作安全,适合Web应用等并发环境。
  • 每个会话独立维护消息历史,切换会话仅需传入对应的sessionId即可。
  • 可根据需求扩展会话管理器,比如添加会话过期自动清理、持久化到数据库等功能。

内容的提问来源于stack exchange,提问作者Akram Al-Qaifi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 20:47:29