网上找了半天完整版的调用Betalgo.OpenAI.GPT3的方法,但都不够完整,研究了一下源库的属性和方法,参考python的openai库的调用方法,我找到了以下方法实现完整对话:
static async Task Main(string[] args)
{
Console.WriteLine("****************************");
OpenAIService openAIService = GetService();
ChatCompletionCreateResponse completionResult = new ChatCompletionCreateResponse();
ChatCompletionCreateRequest cr = new ChatCompletionCreateRequest
{
Messages = new List
{
//ChatMessage.FromSystem("You are a helpful assistant."),
//ChatMessage.FromUser("Who won the world series in 2020?"),
//ChatMessage.FromAssistant("The Los Angeles Dodgers won the World Series in 2020."),
ChatMessage.FromUser(Console.ReadLine())
},
Model = Models.ChatGpt3_5Turbo,
MaxTokens = 1000//optional
};
await GetResult(openAIService, completionResult, cr);//注意,这里使用异步,我们下文再说
//Task.WaitAll(Task.Delay(1000));
}
//这里定义一个异步方法,因为原库的openAIService.ChatCompletion.CreateCompletion()是一个异步方法,我在原库的GitHub社区看到有人建议在方法名后面加一个async强调异步,看来不少人中招了,把它当同步方法用,哈哈哈。
private static async Task GetResult(OpenAIService openAIService, ChatCompletionCreateResponse completionResult, ChatCompletionCreateRequest cr)
{
try
{
completionResult = await openAIService.ChatCompletion.CreateCompletion(cr);
}
catch (Exception e)
{
Console.WriteLine(e);
}
if (completionResult.Successful)
{
Console.WriteLine(completionResult.Choices.First().Message.Content);
cr.Messages.Add(ChatMessage.FromUser(Console.ReadLine()));
await GetResult(openAIService, completionResult,cr);//维持现有会话不变,继续问答
}
}
public static OpenAIService GetService()
{
var handler = new HttpClientHandler()//这里使用了代理
{
Proxy = new WebProxy("192.168.1.67", 1082),
UseProxy = true
};
var client = new HttpClient(handler);
var openAiService = new OpenAIService(new OpenAiOptions()
{
ApiKey = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxk", /*哦对了,我这里只是简单的设置了一下apikey,建议采用依赖注入,这样更安全*/
}, client);
return openAiService;
}
}