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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 14:25:19