由于众所周知的原因,Chat-GPT在国内无法使用。如果要使用的话,需要一定的科技含量。
账号获取
目前主流两种方式:
1、按照教程,自己注册。
2、直接购买一个账号。
直接注册的话,还需要一个开放国的手机号码,一个邮箱。没有手机号码的话,可以使用虚拟手机号,但这里会遇到运气的问题。比较折腾。
直接购买,则相对简单,但要防骗。简单来说,也是一个运气问题。如果购买账号,则要注意:卖方需要提供两个账号:1)一个可以登录邮箱的邮箱账号密码,可用于OpenAi密码重置。2)OpenAi登录账号密码。
购买到账号之后,首先登录邮箱,更改邮箱密码,接下来登录OpenAi,重置密码(不可修改密码,只可重置)。
注意:登录OpenAi,不可用国内地址,或者被大量共享的地址。
访问环境
由于使用被大量共享的地址容易导致封号的问题。因此,推荐你自己使用一个独享的IP地址来访问,因此,首选“美国”云主机。(注意不要贪便宜选个国内的,用不了)
比如 微软的Azure(实测),阿里云,亚马逊云(实测,Web已封,但Api可用) 等。
主机配置无需太高,1核、1G,Win11英文版即可满足需求。不建议使用Win7,实测远程桌面界面太模糊,而且还要升级浏览器,乱七八糟的事情太多。
使用这个云主机,就可以直接访问Chat.OpenAi.com。
问题
云主机,在美国,访问起来比较卡,你只有耐心等待了。就算升级云主机也没啥用,因为瓶颈在网络,而不是系统。我自己的虚拟机,CPU利用率不到10%,内存大概950M左右。也就是说,Win11,1核,1G就可以满足需求,多了也浪费。
如果每次通过远程桌面的浏览器访问OpenAi的话,卡的厉害。因此,我们可以考虑将这台云主机作为一个Proxy,然后通过Web Api的方式来访问。
开发服务器
目前有很多方案,本人擅长C#。本来打算自己做一个,但发现目前已经有人做好了,那就直接用。
首先以最小化模式创建一个ASP.NET Core Web Api,.NET版本选6.0即可。
接下来,添加nuget包:OpenAI-DotNet-Proxy
修改Program.cs代码
public class Program{private const string UserToken = "sess-";private class AuthenticationFilter : AbstractAuthenticationFilter{public override void ValidateAuthentication(IHeaderDictionary request){if (!request.Authorization.ToString().Contains(UserToken)){throw new AuthenticationException("User is not authorized");}}}public static void Main(string[] args){var auth = OpenAIAuthentication.LoadFromEnv();var settings = new OpenAIClientSettings();var openAIClient = new OpenAIClient(auth, settings);var proxy = OpenAIProxyStartup.CreateDefaultHost<AuthenticationFilter>(args, openAIClient);proxy.Run();}}
接下来编译,发布即可。
将编译好的程序,复制到云主机上。
申请免费证书
如果你的域名在阿里申请,则可向阿里申请一个免费证书。腾讯,同理。
下载那个IIS证书,即可。
添加SSL证书
修改 appsettings.json
{"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": "*","AllowInvalid ": true,"Kestrel": {"Endpoints": {"Https": {"Url": "https://*:443","Certificate": {"Path": "C:\\Users\\Zmrbak\\Desktop\\publish\\www.abc.com.pfx","Password": "123465n"}}},"Certificates": {"Default": {"Path": "C:\\Users\\Zmrbak\\Desktop\\publish\\www.chatgpt.abc.com.pfx","Password": "123465n"}}}
}
环境配置
在云主机上,设置环境配置(中文:此电脑\属性\高级系统设置\环境变量\系统变量),添加如下变量:
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxx
来自于:https://platform.openai.com/account/api-keys
OPENAI_ORGANIZATION_ID=org-xxxxxxxxxxxxxxxxxxxxx
来自于:https://platform.openai.com/account/org-settings
执行如下脚本(请替换正确的OPENAI_API_KEY、OPENAI_ORGANIZATION_ID)
setx OPENAI_API_KEY sk-xxxxxxxxxxxxxxxxxxxxxxxxxx
setx OPENAI_ORGANIZATION_ID org-xxxxxxxxxxxxxxxxxxxxx
在Azure控制面板中,发布443端口,允许访问。
启动Web Api程序。
测试
在你的计算机上执行如下指令
curl -k https://云主机/health
如果能够返回 ok,则表明云主机端Web Api工作正常。
客户端开发
创建一个.NET的控制台程序。
添加nuget程序包:OpenAI-DotNet
编写如下代码:
static async Task Main(string[] args){HttpClientHandler clientHandler = new HttpClientHandler();clientHandler.ServerCertificateCustomValidationCallback += (sender, cert, chain, sslPolicyErrors) => { return true; };clientHandler.SslProtocols = SslProtocols.None;var httpClient = new HttpClient(clientHandler);var auth = new OpenAIAuthentication($"sess-aAbBcCdDeE123456789");var settings = new OpenAIClientSettings(domain: "云主机IP地址");var api = new OpenAIClient(auth, settings, httpClient);var messages = new List<Message>{new Message(Role.System, "特朗普什么时候当选美国总统的?"),};var chatRequest = new ChatRequest(messages);await api.ChatEndpoint.StreamCompletionAsync(chatRequest, result =>{Console.Write(result.FirstChoice);});}
输出:
特朗普当选美国总统是在2016年11月8日的美国总统选举中获胜的。
则表明:客户端<—>代理端<—>openAi端工作正常。
注意:HttpClientHandler相关代码,不可缺少,否则会报SSL相关错误。
OpenAI-DotNet官网资料:
https://github.com/RageAgainstThePixel/OpenAI-DotNet