用winform开发ChatGPT对话应用
最近ChatGPT非常火热,本着有热闹就凑的心理,我也上手玩了一把。不玩不知道,玩了吓一跳,这家伙的火,是自己把自己点燃的。不客气的说,OpenAI给人类重新创造了一个神,上帝的无所不能是在人类的想象中,而ChatGPT的无所不能是在人类的眼前耍大刀;
闲话不扯,进入正题,今天我尝试用C#开发一个对话应用,让我们能跳过网页验证,跳过科学上网,直接与AI对话。本着一贯偷懒的态度,来到CSDN来抄袭一把,查到用C#开发的示例非常少,而且对于我这总代码水平复现他们操作也相对困难。求助于ChatGPT,可他给出的代码一直跑不起来,我把代码放在这里,有哪位大神能看出那里有问题,帮我指出来。
using System;
using System.Net.Http;
using System.Text;
using System.Windows.Forms;
using Newtonsoft.Json;namespace chatGTP对话应用
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private async void btnSubmit_Click(object sender, EventArgs e){string input = txtInput.Text;string response = await GetResponseFromChatGPT(input);txtResponse.Text = response;}private async System.Threading.Tasks.Task<string> GetResponseFromChatGPT(string input){using (var client = new HttpClient()){var request = new HttpRequestMessage{Method = HttpMethod.Post,RequestUri = new Uri("https://api.openai.com/v1/engines/text-davinci-002/jobs"),Content = new StringContent("{\"prompt\": \"" + input + "\", \"max_tokens\":100}", Encoding.UTF8, "application/json")};request.Headers.Add("Authorization", "Bearer <API-KEY>");var response = await client.SendAsync(request);var result = await response.Content.ReadAsStringAsync();dynamic data = JsonConvert.DeserializeObject(result);return data.choices[0].text;}}}
}
这段代码总是报API-KEY错误,JSON格式无法解析,模块接口错误;昨天完胜测试了很久都没有通过,可能AI大神对比较新的需求跟我们一样也需要经过一段时间的消化;
虽然以上代码无法跑起来,但在解决这个问题的过程中参考的很多其他博友的解决思路;重要的思路之一就是调用OPENAI的API。有了这个思路就开干,建立winform项目后,直接在Nuget中搜索,果然找到OPENAI。在这里哦,贴心吧!
把这个API安装到项目中后,接下来就是要看怎么用了?这是一个比较犯愁的地方,因为我没有在CSDN中找到可参考的;就只能找官方文档了,你知道的,凭我的英文水平,天然是对官方文档有有抵触情绪的;不过还好,内容不是很多,并且提供的用法和解释也十分清楚,这里我把官方文档的链接放在这里,方便兄弟们查看:openai说明文档
有了这些鸟语的支持,那进度就快很多了;首先是跑起来了,我用的这段代码:
var result = await api.Completions.GetCompletion("One Two Three One Two");
能跑,也能获取回应,但是内容不全,而且只有几个字,这显然不是AI大神的风格。本着有错就一定是我的错的原则,以及之前代码中关于异步方法的浅薄理解,我果断选择下面这段代码:
await api.Completions.StreamCompletionAsync(new CompletionRequest("My name is Roger and I am a principal software engineer at Salesforce. This is my resume:", Model.DavinciText, 200, 0.5, presencePenalty: 0.1, frequencyPenalty: 0.1),res => ResumeTextbox.Text += res.ToString());
当然这样选择还有一个原因,这段代码的参数比较全,如果运行效果不理想,我可以对这些参数进行调整;经过这样的修改和参数调整后,效果跟在网页中AI大神的表现就差不多了;接下来我把完成的代码贴在这里,楷了大家这么多年的油,今天也算是还一笔这么多年欠下的一份人情了;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Http;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Newtonsoft.Json;
using OpenAI_API;
using OpenAI_API.Completions;
using OpenAI_API.Embedding;
using OpenAI_API.Models;namespace chatGTP对话应用
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){}private async void btnSubmit_Click(object sender, EventArgs e){var api = new OpenAI_API.OpenAIAPI("你的API密钥");await api.Completions.StreamCompletionAsync(new CompletionRequest(txtQuestion.Text, Model.DavinciText, 2000, 1, presencePenalty: 0.1, frequencyPenalty: 0.1),res => txtAnswer.Text += res.ToString());textBox1.Text = Model.DavinciText.ModelID;}private void button1_Click(object sender, EventArgs e){txtQuestion.Text = string.Empty;txtAnswer.Text = string.Empty;textBox1.Text = string.Empty;}}}
好了,展示一下效果:
20230209_213527
下面展示一下问答测试和翻译功能:
chatgtp问答测试和翻译测试