Back
Featured image of post 私有化部署chatgpt-web

私有化部署chatgpt-web

背景

访问OpenAI会经常受限制,为了流畅使用gpt的能力,最佳方案还是私有化部署。私有化部署涉及两个问题,选择哪个Web客户端和用谁家的API。我尝试过多种私有化方式,本文稍作总结。

选择哪个客户端合适?

你或许从一些公众号或文章中可看到一些方案,里面提出可以使用某某开源方案。如果授人以渔的话,我是通过在OSS Insight平台的chat-gpt-apps里找一下。排名前几的有机会成为我们的候选方案,我们拿出来一一点评一下?

候选人一:chatgpt-web

GitHub: https://github.com/Chanzhaoyu/chatgpt-web

Tip

简介: 广泛使用的一个chatgpt-web方案。

  • UI有点类似官方的样子
  • 带提示词商店,可以导入或下载一些预置的设定
  • 可的方便切换是否带上下文历史的交互(节省token)
  • 有一键部署到平台的能力
  • 支持设置访问密码

这个方案我用了半年多,感觉还挺不错。

候选人二:ChatGPT-Next-Web

GitHub: https://github.com/Yidadaa/ChatGPT-Next-Web

Tip

简介:也是很多人使用的一个方案。

  • UI默认是聊天对话框方式
  • 特色的面具能力,可预设Model/Prompt及一些参数
  • 支持云端同步能力(Webdav/Upstash)
  • 支持设置访问密码
以前尝试过,功能没这么强大,当时因不支持设置访问密码,放在公网不安全(懒得前置鉴权),故没怎么用。这次部署后感觉也挺有特色,特别是面具能力的设定。

候选人三:Azure AI Studio聊天操场

URL: https://oai.azure.com/portal/63536aea15934697874a51572fa868ff/chat

Tip

简介:这是我在微软云上部署OpenAI服务时才知道的,可能看过这个的不多,功能也较为简单。

  • UI简洁大方
  • 默认支持云端同步能力
  • 权限主要通过Azure本身来控制
附图: Azure AI Studio

总结

我们对比这三个,各有优劣。从我关注的角度,整理一个表格:

功能/项目chatgpt-webChatGPT-Next-WebAzure AI Studio聊天操场
GitHub/URLchatgpt-webChatGPT-Next-WebAzure AI Studio聊天操场
UI风格类似官方样式对话框方式简洁大方
提示词商店支持导入或下载预置的设定更扩展的提示词预设不支持
上下文历史支持是/否切换(节省token)固定,自动压缩固定(可能未压缩)
一键部署支持支持支持
访问控制简单密码支持简单密码支持更安全的Azure鉴权
云端同步不支持部分支持(Webdav/Upstash)自带
总体评价广泛使用,UI类似官方,有提示词商店等特点功能多样化,包括特色的面具功能和云端同步等功能相对简单,UI简洁大方,但有云端漫游

使用建议的话,如果你需要多个模型切换,建议使用ChatGPT-Next-Web。如果只有一个模型,可以使用chatgpt-web。因为如果你想对话漫游,可考虑Azure的方案,但是因为无法预设提示词等,也不支持多模型切换,功能还是简单了些。

在此还想补充一句:高票的候选人一、二应该均是国人的作品,咱们还是相当不错的嘛:)

如何获得API Key?

主要的正式渠道就两个,一是https://openai.com/官方网站,另一个是作为合作伙伴的微软Azure平台。这里简要描述一下OpenAI API Key的获取方式。

OpenAI

注册一个新账号即送5刀(以前送18刀),有效期三个月。注册稍麻烦,网上有大堆资料,自己手工注册的话,可能要用接码平台,比如我用过这个sms-activate。注册过两个号,我感觉还是麻烦,建议某宝平台购买。

之后在个人资料的User->API Keys中创建secret key即可。需要特别说明的是,调用OpenAI的API可能要特别的网络。

Azure OpenAI

现在我们可以以组织名义在微软Azure平台申请,司内有人分享如下步骤,我验证成功,半天内就获得申请批复。

  1. 创建你自己的Azure云账号。
  2. 创建订阅,绑定国内visa信用卡。(如果是新号,可以将免费账号升级为即用即付,免费200刀额度不会消失)
  3. 填Open AI申请表申请开通Open AI服务; 申请gpt-3.5. 申请时邮箱填自己公司邮箱,公司填公司名字,我这里是Tencent。
  4. 据说要等几个工作日 Open AI服务开通后,实际上我是小半天(5-6h)就获得审批了,通知邮件是发到你留的企业邮箱。
  5. 3.5批了之后,以前要再填表单申请gpt-4,但是现在不用了,直接获得GPT4的权限,不过我这看只在某些Region才可用,略有疑惑。

通过以上方式获得权限后,你便可以在Microsoft Azure中部署对应的模型。只需要几步,如下给一些关键的建议:

  • 创建Azure OpenAI,注意选择区域,有些区域GPT4不可用,可用的区域见这个文档 GPT-4 models。我选择的是Canada East。你可以通过查看你的模型,看到是否支持gpt4等。
  • 部署对应的模型,特别要关注这里的部署名字,后面API调用使用时会用到。 azure openai model deploy

部署好模型后,你就可以在Azure提供的[操场]->[聊天]中试用了。要查看访问相关的Key,它是藏在这里: azure openai key 你也可以继续通过聊天页右上角的部署至,将服务直接在微软云上部署,就可获得上文说的候选人三的使用体验。

还是要再次加粗并提醒一句:GPT4价格挺贵,特别是使用GPT4-32K,请在调用时选择适合自己场景的模型。
当然如果是新号,一个月免费200刀的额度,也够你霍霍一阵啦:)

私有化部署

经过前面两步,已经万事俱备了,私有化部署简单说就是选个Web客户端填上对应的Key。不简单的说,还有一些注意事项,这后面会提及,我们先说说你已经迫不及待要了解的怎么操作:P

基于docker-compose的部署

我们的两个候选人自己的简介(Github README)已经很详细的描述了。基于OpenAI的API访问特殊性,他们都很贴心的带了SOCKS_PROXYHTTPS_PROXY的选项,你只要填上合适的代理地址即可顺畅使用。我这里就不做搬运工了啦~

基于k8s的部署

同样简单,我们可以参考docker-compose进行一些翻译工作即可。给个示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
apiVersion: apps/v1
kind: Deployment
metadata:
  name: chatgpt-web
spec:
  selector:
    matchLabels:
      app: chatgpt-web
  replicas: 1
  template:
    metadata:
      labels:
        app: chatgpt-web
    spec:
      containers:
        - name: chatgpt-web
          image: chenzhaoyu94/chatgpt-web
          env:
            - name: OPENAI_API_KEY
              value: "<你申请的Key,如果用OpenAI方式,直接填API Key, 形如sk-xxx。使用azure api填上面的一个密钥>"
            - name: AUTH_SECRET_KEY
            # 如果网页要访问密码(公网暴露的话建议必填),不需要可留空
              value: ""
            - name: OPENAI_API_BASE_URL
            # 这里使用个proxy将azure openai api适配为openai api
              value: "http://azure-openai-proxy:5678"
            - name: MAX_REQUEST_PER_HOUR
              value: "1000"
            - name: "TIMEOUT_MS"
              value: "60000"
          ports:
            - containerPort: 3002
---
apiVersion: v1
kind: Service
metadata:
  name: chatgpt-web
spec:
  selector:
    app: chatgpt-web
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3002
  type: ClusterIP

上面尝试使用我们自己部署的Azure OpenAI模型,我们两个候选人本身并不支持Azure OpenAI API,我们可以借助这个开源项目stulzq/azure-openai-proxy达成适配。

在k8s中可以这么配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
apiVersion: apps/v1
kind: Deployment
metadata:
  name: azure-openai-proxy
spec:
  selector:
    matchLabels:
      app: azure-openai-proxy
  replicas: 1
  template:
    metadata:
      labels:
        app: azure-openai-proxy
    spec:
      containers:
        - name: azure-openai-proxy
          image:
            stulzq/azure-openai-proxy
          env:
            - name: AZURE_OPENAI_ENDPOINT
              value: "https://gpt4-for-kevin.openai.azure.com/"
            - name: AZURE_OPENAI_MODEL_MAPPER
            # 关注下面这行,进行模型的映射。如果你很有钱的话,所有都映射成gpt4-32k吧,哈哈
              value: "gpt-3.5-turbo=gpt35,gpt-3.5-turbo-16k=gpt35-16k,gpt-4=gpt-4,gpt-4-32k=gpt4-32k"
            - name: AZURE_OPENAI_API_VER
              value: "2023-07-01-preview"
          ports:
            - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: azure-openai-proxy
spec:
  selector:
    app: azure-openai-proxy
  ports:
    - protocol: TCP
      port: 5678
      targetPort: 8080
  type: ClusterIP

这两个资源我们可以简单写个kustomization文件,方便一键部署:

1
2
3
4
resources:
  - azure-openai-proxy.yaml
  - chatgpt-web.yaml
namespace: ai

关于服务怎么对外暴露,相信你会我就不多讲啦。至此我们就用上了微软家的OpenAI。

补充注意事项

  • 像chatgpt-web提供了网页accessToken模式,但能用API的就不用Token,因为网页版本数据可能会被拿来后续训练,更加不安全。
  • 使用Azure OpenAI对国内网络更友好,不需要代理即可。
  • 使用proxy时,AZURE_OPENAI_MODEL_MAPPER字段的设置(一个模型名称的映射关系),要严格和在Azure OpenAI中的部署名称一致。
  • 注意如果部署在公网,设置上密码校验(环境变量:AUTH_SECRET_KEY或CODE),不然账单起飞可别怪我没提醒。
  • 如果需要漫游你的历史记录,ChatGPT Next Web是有一定支持的,配合免费申请的upstash免费版本,感觉也够用。
  • Azure OpenAI返回有内容筛选,如果你看似合理的问题被阻止回复(比如报content_filter),那么可以去申请修改内容筛选的设定(要额外申请)。

尾声

我个人上述三个版本都部署了,后续会交替再用上一段时间,有其它感受会再刷新此文。目前老实说三者都不完美,我想要的是:

  • 多模型切换方便(关于口袋银子),这个仅ChatGPT Next支持。
  • 必然要支持预设Prompt,以及快速调用/。这个非azure web都支持。
  • 可选是否带上下文发送,且可快速切换,这个chatgpt-web还不错。
  • 历史记录云端漫游,并且无缝使用,手动同步啥的还是太弱。这点azure web天然获胜。
  • 历史记录的标题Summary化。这个azure web还不错。
  • 支持插件模式(我也没想好什么形态),但Function call等不利用也是亏了。

也尝试开些脑洞,历史聊天记录的标题可自动标签化和自动整理,我甚至想象了一下炫酷的交互方式。同一个相关主题自动形成树状,整体大量曾经的问答变成一个网状结构,就像Obsidian的关系图谱,在问答之中,就建立起个人的知识框架。我不排斥将问答过程中的信息存储,如何整理和挖掘,对我而言有不错的吸引力:D

EOF