有的时候,大雨来了忘记带伞,于是之后每天都带着伞出门,直到下次大雨的前一天。

加州淘金错过了,比特币错过了,大语言模型仿佛又要错过。不过也无妨,错过的只是这个平行宇宙。

# 反向代理ChatGPT,晚哉?

不晚呼——心里默念,总有人会用得上罢。

# 使用Caddy代理ChatGPT

网页端由于Cloudflare管的比较严,估摸着反向代理有封号风险,于是转而反向代理OpenAI API。

代理起来相当容易,首先安装Caddy 2

编写/etc/Caddyfile

<host>:<port> {
  reverse_proxy https://api.openai.com {
    header_up Host api.openai.com
  }
}

其中,<host>应当替换为代理服务器的IP或者域名,<port>应当替换为监听的端口。

值得注意的是,OpenAI API的Cloudflare防御机制会检测请求中的Host值,以判断请求是否确实发向OpenAI。如果不为api.openai.com,将返回403 Forbidden错误。

因此必须设置header_up Host api.openai.com,将请求头中的Host修改为对应值。

运行sudo systemctl start caddy开启Caddy服务器,可以使用curl测试代理服务器是否工作正常:

$ curl curl https://<host>:<port>/v1/models
{
  "error": {
    "message": "You didn't provide an API key. You need to provide your API key in an Authorization header using Bearer auth (i.e. Authorization: Bearer YOUR_KEY), or as the password field (with blank username) if you're accesing the API from your browser and are prompted for a username and password. You can obtain an API key from https://platform.openai.com/account/api-keys.",
    "type": "invalid_request_error",
    "param": null,
    "code": null
  }
}

返回值提示需要提供API Key,表示已经配置成功。

如果说反向代理WOD的难度是13,反向代理ChatGPT的难度只能勉强打4分!

# 多嘴

如果喜欢使用JSON配置Caddy,也可以参考以下配置:

{
  "admin": {
    "disabled": true
  },
  "logging": {
    "logs": {
      "log0": {
        "writer": {
          "output": "stdout"
        },
        "encoder": {
          "format": "console"
        },
        "level": "WARN"
      }
    }
  },
  "apps": {
    "http": {
      "servers": {
        "srv0": {
          "listen": [":<port>"],
          "routes": [
            {
              "match": [{ "host": ["<host>"] }],
              "handle": [
                {
                  "handler": "subroute",
                  "routes": [
                    {
                      "handle": [
                        {
                          "handler": "reverse_proxy",
                          "headers": {
                            "request": {
                              "set": {
                                "Host": ["api.openai.com"]
                              }
                            }
                          },
                          "transport": {
                            "protocol": "http",
                            "tls": {}
                          },
                          "upstreams": [{ "dial": "api.openai.com:443" }]
                        }
                      ]
                    }
                  ]
                }
              ],
              "terminal": true
            }
          ]
        }
      }
    }
  }
}

# 再多嘴几句

回到开头的问题,究竟为什么(请原谅,我总是一个喜欢问为什么的人)会错过?

似乎有两个主要的方面,一个是开始的动力,一个是持续的毅力。就好比前段时间大火的核聚变试验,点火成功,能量转化大于能量输入,这注定是一次不可磨灭的成功——一个好的开始是成功的一半。但同时,聚变最为困难的就是持续控制等离子体,保持高温高压环境,确保聚变稳定发生(请原谅,我是一个不太会举例子的人)。

人做一件事也没有太大的差别,要做好一件事,首先需要一个自己确信的由头,再加上一些破釜成舟的劲头,这已经是极难的了。例如要用上ChatGPT,要买上手机号,与俄罗斯电话号商斗智斗勇,又要准备代理链接,和国内网络代理商斗志斗勇,又要逃避OpenAI的监管,和对岸资本主义斗智斗勇,最后到头来打开了界面,还要头疼得问些什么、怎么问。仿佛是回到新石器时代,重新学怎么使用石锤、石锄,怎样炼铁……

说复杂,倒也不复杂,费劲心思用上了ChatGPT,总能做些什么吧?那倒也说不准。打开问答界面:没有提问的欲望。打开工作文档:找不到提问点。打开VSCode:不知道API能做什么。

空,空空的。

虽说开始做一件事不容易,但它也就是那么一瞬的事。而坚持,是一个周、一个月,是十年的冷板凳。况且,坚持不是一句口号,坚持的途中是不间断的复杂思维与发明创造——没有惊喜的日子谁都过不下去,再要是真的没有惊喜,那就只能自己动手创造。

翻来覆去说了那么多,也就无非那么两句话:万事开头难,修行靠自身。不少成功者恐怕都是这样走来的。