如何在ChatCompletionsOptions构造函数中传入ChatRequestMessages列表?
问题解决:ChatCompletionsOptions构造函数传参导致空引用错误
当使用对象初始化器初始化ChatCompletionsOptions.Messages时,GetChatCompletionAsync调用正常;但通过构造函数传入相同消息列表时,出现“未将对象引用设置到对象的实例”错误。以下是正确的代码实现:
原代码对比
可正常运行的代码
List<ChatRequestMessage> m = new List<ChatRequestMessage>{ new ChatRequestSystemMessage("You are a helpful assistant. You will talk like a pirate."), new ChatRequestAssistantMessage("Arrrr! Of course, me hearty! What can I do for ye?"), new ChatRequestUserMessage("How does one care for a parrot?"), }; // 此代码正常工作 var chatCompletionsOptions = new ChatCompletionsOptions() { DeploymentName = "MyGPT35Turbo", // 非Azure客户端使用DeploymentName对应"model"参数 Messages = { new ChatRequestSystemMessage("You are a helpful assistant. You will talk like a pirate."), new ChatRequestAssistantMessage("Arrrr! Of course, me hearty! What can I do for ye?"), new ChatRequestUserMessage("How does one care for a parrot?"), } }; Response<ChatCompletions> response = await client .GetChatCompletionsAsync(chatCompletionsOptions);
原报错代码
// 此代码报错:未将对象引用设置到对象的实例 var chatCompletionsOptions = new ChatCompletionsOptions(m) { DeploymentName = "MyGPT35Turbo" };
正确的构造函数传参方式
根据Azure OpenAI SDK的ChatCompletionsOptions定义,若要通过构造函数传入消息列表,需使用包含部署名称/模型名和消息集合的重载构造函数,或者在无参构造函数中直接赋值Messages属性:
方式1:使用正确的构造函数重载
var chatCompletionsOptions = new ChatCompletionsOptions("MyGPT35Turbo", m);
方式2:无参构造函数直接赋值Messages
var chatCompletionsOptions = new ChatCompletionsOptions { DeploymentName = "MyGPT35Turbo", Messages = m // 直接传入已初始化的消息列表 };
报错原因说明
原报错代码的问题在于:
- 官方SDK的
ChatCompletionsOptions并没有仅接受IList<ChatRequestMessage>的构造函数重载,直接传入消息列表会导致参数不匹配或内部属性未正确初始化; - 即使存在对应构造函数,也可能未正确将传入的列表赋值给
Messages属性,导致后续调用时该属性为空引用。
内容的提问来源于stack exchange,提问作者Intensivist
相关产品推荐
相关产品推荐

