如何在C#中通过OpenAI API调用ChatGPT函数获取标准化选择题?
问题描述
需要借助ChatGPT从文本中提取选择题并返回标准化格式结果。已实现C# .NET Core Windows服务,能通过OpenAI API传递文本给ChatGPT,但当前使用普通补全接口,无法利用gpt-3.5-turbo-0613/gpt-4-0613的函数调用功能生成指定格式的结果。
现有代码:
using OpenAI.API; using OpenAI.API.Completions; OpenAIAPI client = new OpenAIAPI(api_key); var parameters = new CompletionRequest { Model = model, Prompt = CADEmain.decodeXML(o["content"].ToString()), Temperature = temperature, MaxTokens = maxTokens }; var response = await client.Completions.CreateCompletionAsync(parameters); string generatedText = response.Completions[0].Text;
期望返回格式对应的C#类:
public class CustomResponse { public string Question { get; set; } public string[] Answers { get; set; } public int CorrectAnswer { get; set; } // 对应Answers数组中的正确选项索引 public string Feedback { get; set; } }
需要指导如何在C#中调用OpenAI的函数调用API,实现标准化结果返回。
解决方案
1. 切换到ChatCompletion接口
函数调用功能仅支持Chat Completions接口(对应gpt-3.5-turbo-0613/gpt-4-0613模型),而非普通的Completions接口,需替换原有的CompletionRequest为ChatCompletionRequest。
2. 定义函数描述
将期望的返回格式定义为函数参数结构,以结构化形式告知OpenAI API:
var functionDefinition = new FunctionDefinition { Name = "generate_multiple_choice_question", Description = "从给定文本中提取选择题,包含题目、选项、正确选项索引和反馈", Parameters = new JsonObject { ["type"] = "object", ["properties"] = new JsonObject { ["Question"] = new JsonObject { ["type"] = "string", ["description"] = "选择题的题干内容" }, ["Answers"] = new JsonObject { ["type"] = "array", ["items"] = new JsonObject { ["type"] = "string" }, ["description"] = "选择题的所有选项,按顺序排列" }, ["CorrectAnswer"] = new JsonObject { ["type"] = "integer", ["description"] = "正确选项在Answers数组中的索引(从0开始)" }, ["Feedback"] = new JsonObject { ["type"] = "string", ["description"] = "对该题目的解析或反馈内容" } }, ["required"] = new JsonArray { "Question", "Answers", "CorrectAnswer", "Feedback" } } };
3. 构造并发送ChatCompletion请求
配置对话消息、函数定义,强制模型调用指定函数:
using OpenAI.API; using OpenAI.API.Chat; using OpenAI.API.Models; // 初始化客户端 var api = new OpenAIAPI(api_key); // 构造对话消息,传入待提取的文本 var messages = new List<ChatMessage> { new ChatMessage(ChatMessageRole.User, CADEmain.decodeXML(o["content"].ToString())) }; // 构造请求 var chatRequest = new ChatCompletionRequest { Model = Model.GPT3_5_Turbo_0613, // 或Model.GPT4_0613 Messages = messages, Functions = new List<FunctionDefinition> { functionDefinition }, FunctionCall = new FunctionCall { Name = "generate_multiple_choice_question" }, // 强制调用目标函数 Temperature = temperature, MaxTokens = maxTokens }; // 发送请求并获取响应 var chatResponse = await api.Chat.CreateChatCompletionAsync(chatRequest);
4. 解析返回结果
从响应中提取函数调用参数,反序列化为CustomResponse对象:
using System.Text.Json; // 获取函数调用的参数内容 var functionCall = chatResponse.Choices[0].Message.FunctionCall; if (functionCall != null && !string.IsNullOrEmpty(functionCall.Arguments)) { // 反序列化为自定义类 CustomResponse result = JsonSerializer.Deserialize<CustomResponse>(functionCall.Arguments); // 后续处理标准化结果 }
注意事项
- 确保使用的OpenAI .NET SDK版本支持函数调用功能(建议使用最新稳定版)。
JsonObject和JsonArray来自OpenAI SDK的OpenAI.API.Models命名空间,也可使用Dictionary<string, object>和List<object>替代构造参数结构。- 若无需强制调用函数,可将
FunctionCall设为"auto",但为确保返回标准化格式,建议强制指定函数调用。
内容的提问来源于stack exchange,提问作者Velocedge
相关产品推荐
相关产品推荐

