如何用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
相关产品推荐
相关产品推荐

