Azure.AI.OpenAI 1.0.0-beta.14版C#多轮上下文对话实现咨询
问题:Azure OpenAI多轮上下文对话实现(C#,Azure.AI.OpenAI 1.0.0-beta.14)
我需要创建程序化应用,向Azure OpenAI托管的GPT模型发送并接收同一上下文下的多轮消息,大致流程如下:
Uri azureOpenAIResourceUri = new Uri(azureOpenAIResourceUriEndpoint); AzureKeyCredential azureOpenAIApiKeyCredential = new AzureKeyCredential(azureOpenAIApiKey); OpenAIClient client = new OpenAIClient(azureOpenAIResourceUri, azureOpenAIApiKeyCredential); ChatCompletionsOptions chatCompletionsOptions = GenerateInitialChatCompletionsOptions(AITemplate, customAITemplate, query); //Send message: "What is 1 + 1" //Get answer, print to user //Send message: "Can you add 2 to the previous answer" //Get answer, print to user //etc...
我已能通过以下代码完成第一轮对话:
await client.GetChatCompletionsAsync(chatCompletionsOptions)
但收到第一轮回复后,不知如何基于该回复继续对话,找不到获取对话“上下文”的方式,也未发现相关对象的方法或属性支持“基于当前上下文回复”。网上有一些使用GetChatCompletionsStreaming的帖子,但未找到在第一轮回复后继续发送消息并维持上下文的示例。
当前使用的Azure.AI.OpenAI版本为1.0.0-beta.14,若该版本并非最优,请告知。此外API版本迭代快,导致GPT生成的代码常存在语法兼容性问题。
现咨询:在上述指定版本的库中,如何用C#实现与聊天机器人的多轮上下文交互?
解决方案
核心原理
在Azure.AI.OpenAI的ChatCompletionsOptions中,Messages列表就是对话上下文的载体。每一轮对话后,需要将用户的提问和AI的回复都添加到这个列表中,后续请求时模型会基于整个列表的内容生成回应。
针对1.0.0-beta.14版本的实现代码
以下是完整的多轮对话示例:
using Azure; using Azure.AI.OpenAI; var azureOpenAIResourceUri = new Uri("你的Azure OpenAI资源端点"); var azureOpenAIApiKeyCredential = new AzureKeyCredential("你的API密钥"); var client = new OpenAIClient(azureOpenAIResourceUri, azureOpenAIApiKeyCredential); // 初始化对话选项,包含系统提示(可选)和第一轮用户消息 var chatCompletionsOptions = new ChatCompletionsOptions() { DeploymentName = "你的模型部署名称", // 例如gpt-35-turbo Messages = { new ChatMessage(ChatRole.System, "你是一个专业的计算器助手"), new ChatMessage(ChatRole.User, "What is 1 + 1") } }; // 第一轮对话 Response<ChatCompletions> response = await client.GetChatCompletionsAsync(chatCompletionsOptions); ChatMessage assistantReply = response.Value.Choices[0].Message; Console.WriteLine($"AI回复: {assistantReply.Content}"); // 将AI的回复添加到上下文列表 chatCompletionsOptions.Messages.Add(assistantReply); // 第二轮对话:基于上下文提问 chatCompletionsOptions.Messages.Add(new ChatMessage(ChatRole.User, "Can you add 2 to the previous answer")); response = await client.GetChatCompletionsAsync(chatCompletionsOptions); assistantReply = response.Value.Choices[0].Message; Console.WriteLine($"AI回复: {assistantReply.Content}"); // 后续轮次重复上述逻辑:添加用户消息→请求→添加AI回复→循环
关键说明
- 上下文维护:每次对话后必须将用户消息和AI回复都追加到
chatCompletionsOptions.Messages中,不能替换或清空列表,否则会丢失上下文。 - 版本建议:1.0.0-beta.14是预览版,API存在变更风险。建议升级到稳定版(如1.2.0及以上),稳定版的API更可靠,兼容性更好,后续迭代也不会频繁破坏现有代码。
- 流式对话的上下文维护:如果使用
GetChatCompletionsStreamingAsync,流程逻辑完全一致——收集完完整的AI回复后,将其作为ChatMessage添加到Messages列表即可,无需特殊处理。
内容的提问来源于stack exchange,提问作者Dave R
相关产品推荐
相关产品推荐

