Docker系列 基于OpenAI API自建ChatGPT

news2025/1/11 17:59:50

转自我的博客文章https://blognas.hwb0307.com/linux/docker/4201,内容更新仅在个人博客可见。欢迎关注!

前言

我用帐号/密码使用chatGPT已经有一段时间。但是,我有几个私交较密的朋友,他们并不具备使用chatGPT的条件;但又想体验一下这个神奇的工具。因此,最近我专门去了解自建ChatGPT有关的项目。在这里总结一下我自建chatGPT的经验。大家有什么好项目也可以在评论区推荐下!

我的自建chatGPT(基于gpt-3.5-turbo)大致如下:

msedge_yLBWgtDM4J

尽管该方案支持多用户和聊天数据保存(基于MongoDB),但也只是一个比较简陋的Demo,暂时还没有一些比较精细的功能。不过咱们也只是自己用一下,不是什么商业化项目,应该无所谓!后续有更好的开源免费项目,我也会陆续介绍。关于安全性,我只能说我暂时没有发现这个方案有主观恶意行为。API并没有异常扣费。

值得注意的是,只要你的API支持,这个方案也支持GPT-4,它是由OpenAI公司在2023年3月14日发布的一个比gpt-3.5更强大的语言模型。想进一步了解GPT-4的小伙伴可以看“跟李沐学AI”的视频:GPT-4论文精读。

准备工作

你需要使用非中国大陆和香港的IP访问openai.com,具体比较复杂。如果你不知道我在说什么,看到这里你就可以停了

你需要准备一个可用的OpenAI API。具体方案如下:

申请虚拟信用卡

首先,我们要有一张合适的虚拟信用卡。之前很多人介绍depay。但是,目前depay的身份验证通道是维护状态;并且需要使用USDT支付,这对很多人是一个很高的门槛。

(缺失内容请访问原文: https://blognas.hwb0307.com/linux/docker/4201)

获得OpenAI API

你可以通过“Account API Keys - OpenAI API”新建一个API。这个过程太简单了,没啥好说的,直接点Create new secret key即可:

msedge_slHCHbf1sm

这个API Key只展示一次,你应该记录一下。如果忘记了,新建一个再删除旧的即可,然后记住新的key即可。

你可以在“Account - OpenAI API”中查看消费情况:

msedge_RdK2eaGpTq

建议限制一下高额消费提醒:

msedge_FiUb2uepcm

你可以在“Pricing”中查看服务单价(每1000 token)。token大致就是单词片段,这个概念主要来自transformer模型,大家简单了解一下就好。总之,gpt-3.5的API价格还是挺亲民的,个人用户目前用它即可;gpt-4的价格就比较高了,适合企业级用户:

msedge_FPMIkQbjmU

测试环境

我的自建chatGPT布署在博客的VPS上:

uname -a # Linux racknerd-XXXXX 5.4.0-28-generic #32-Ubuntu SMP Wed Apr 22 17:40:10 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

docker --version # Docker version 23.0.3, build 3e7cbfd

docker-compose --version # Docker Compose version v2.4.1

自建ChatGPT

不了解docker的小伙伴请先看:《Docker系列 配置Docker全局环境》;《Docker系列 了解Docker Compose的配置文件》。

完成准备工作后,我们通过docker自建ChatGPT。我目前使用的项目是: Kerwin1202/chatgpt-web,它提供了使用MongoDB托管后台数据的接口。该项目衍生于Chanzhaoyu/chatgpt-web: 用 Express 和 Vue3 搭建的 ChatGPT 演示网页——仅提供了一个ChatGPT前端的Demo,比较原始。

文件夹和端口

首先,我们新建工作目录:

work=/docker/kerwin_chatgpt
mkdir -p $work; cd $work

如果你也使用了ufw,应该开放一下端口:

sudo ufw allow 1004/tcp comment 'kerwin_chatgpt' && sudo ufw reload
sudo ufw allow 1005/tcp comment 'kerwin_chatgpt GUI' && sudo ufw reload

如果你的VPS后台还有防火墙,也要相应开放。

yml文件

这里有很多帐户和密码,大家多关注:

  • OPENAI_API_KEY:OpenAI后台的API key。
  • SMTP系列:这是给注册用户发送邮件时用的。
  • AUTH_SECRET_KEY:源项目这个是登陆密钥。这里暂时不知道有什么用;注册用户似乎不需要这个。
  • MongoDB:数据库名chatgpt,用户名user01,密码password01
  • Mongo-Express:用户名user02,密码password02。这是登陆MongoDB GUI时用的。如果不设置,任何知道数据库网址的人都可以访问数据库!

新建docker-compose.yml文件:

vi $work/docker-compose.yml

填入下面的内容。如果你用过mongomongo-express,可以改为自己正在使用的tag,这样比较节省镜像空间。有按需修改提示的也要按自己的实际情况修改:

version: '3'

services:
  app:
    # 在https://hub.docker.com/r/kerwin1202/chatgpt-web/tags 里获得tag。或者写latest
    image: kerwin1202/chatgpt-web:latest
    restart: unless-stopped
    ports:
      - 1004:3002
    depends_on:
      - database
    environment:
      TZ: Asia/Shanghai
      # 从OpenAI后台里获得
      OPENAI_API_KEY: sk-XXX # 按需修改
      # 访问jwt加密参数,可选 不为空则允许登录 同时需要设置 MONGODB_URL
      AUTH_SECRET_KEY: 12345678abcdefg # 按需修改
      # 超时,单位毫秒,可选
      TIMEOUT_MS: 60000
      # 网站名
      SITE_TITLE: BenszChat # 按需修改。写个自己喜欢的名字就行
      # mongodb 的连接字符串
      MONGODB_URL: 'mongodb://user01:password01@database:27017' # 按需修改
      # 网站是否开启注册
      REGISTER_ENABLED: true # 完成注册后,这一项要改为false
      # 开启注册之后 网站注册允许的邮箱后缀 如果空 则允许任意后缀
      REGISTER_MAILS: '@qq.com,@gmail.com,@163.com' # 按需修改
      # 加密盐。算法: echo -n 'passwordsalt' | md5sum | cut -c 1-32
      PASSWORD_MD5_SALT: tNJ%M&D # 按需修改
      # 开启注册之后 超级管理员的邮箱
      ROOT_USER: hwb2012@qq.com # 按需修改
      # 开启注册之后网站域名 不含 / 。注册的时候发送验证邮箱使用
      SITE_DOMAIN: https://chatgpt.hwb0307.com # 按需修改
      # 开启注册之后 发送验证邮箱配置
      SMTP_HOST: smtp.qq.com
      SMTP_PORT: 465
      SMTP_TSL: true
      SMTP_USERNAME: hwb2012@qq.com # 按需修改
      SMTP_PASSWORD: xxxxxxxx # 按需修改
    links:
      - database

  database:
    image: mongo:3.6
    restart: unless-stopped
    expose:
      - '27017'
    volumes:
      - ./mongodb:/data/db
    environment:
      MONGO_INITDB_ROOT_USERNAME: user01
      MONGO_INITDB_ROOT_PASSWORD: password01
      MONGO_INITDB_DATABASE: chatgpt

  gui:
    image: mongo-express:1.0.0-alpha
    restart: unless-stopped
    ports:
      - "1005:8081"
    environment:
      # 选择主题。详见: http://codemirror.net/demo/theme.html
      ME_CONFIG_OPTIONS_EDITORTHEME: ambiance
      # 数据库信息
      ME_CONFIG_BASICAUTH_USERNAME: user02
      ME_CONFIG_BASICAUTH_PASSWORD: password02
      ME_CONFIG_MONGODB_URL: 'mongodb://user01:password01@database:27017'
      ME_CONFIG_MONGODB_ENABLE_ADMIN: true # 可能不是必要的
      ME_CONFIG_MONGODB_ADMINUSERNAME: user01 # 可能不是必要的
      ME_CONFIG_MONGODB_ADMINPASSWORD: password01 # 可能不是必要的

这个docker-compose.yml要自定义的东西还挺多的。如果大家使用时有什么疑问,可以在评论区留言!

最后直接上线即可:

cd $work && docker-compose up -d

其它docker相关操作和一般的docker应用是类似,这里就不细说了。

NPM设置

不了解Nginx Proxy Manager(NPM)用法的小伙伴,请看《Docker系列 两大神器NPM和ddns-go的安装》。

准备两个域名并在域名托管商(比如Cloudflare),比如chatgpt.hwb0307.comchatgptgui.hwb0307.com

  • chatgpt.hwb0307.com给chatGPT的前端使用,反代地址http://172.17.0.1:1004
  • chatgptgui.hwb0307.com给chatGPT的后端使用,反代地址http://172.17.0.1:1005

反代过程并不需要设置特别的参数。

前端基本界面如下:

msedge_yLBWgtDM4J

后端数据库界面如下:

msedge_GifyaaFR8d

基本介绍

第一个用户默认是管理员用户,请使用docker-compose.yml文件里约定的管理员邮箱注册,并在邮箱里点击验证链接即可。其它用户也是类似的。目前,如果你的目标用户已经注册完毕,你可以在docker-compose中设置REGISTER_ENABLED: false,重启docker stack生效。当然,可能在网站配置里设置更合理。总之,这些配置和docker-compose.yml文件里定义的参数是相一致的。

所有的设置都可从左下角的设置按钮进入查看:

msedge_EegIbiJemj

总览

总览界面基本上和数据库内容是一一对应的:

msedge_IcCkoq7r6U

总览里还可以导入/导出聊天记录(以.json格式),也是挺不错的!

我这里简单展示其它选项的内容:

高级

设定角色。一般是默认的。

msedge_ykePHnElZX

基本配置

这里展示了API的余额,不是用量。

msedge_TYrZA4gn1d

网站配置

这里的注册登录功能最好不要点暗,否则容易出bug,导致所有用户无法登陆。数据库里直接修改似乎无法生效,感觉这是bug,或者是缓存问题:

msedge_vXFuaJFrSP

这个方案应该是有效的。大家试试看!

点亮新用户表明你开放注册;点亮新用户审核表明该用户需要你审核才可以使用。如果你开放注册,一般建议这两者都要点亮。如果你不想开放注册,将新用户点暗即可。

msedge_VqFsyqLiU1

邮箱配置

密码是SMTP专用密码,不是QQ邮箱密码。

msedge_1I3vrTj3TO

提示词商店

它内置了一些提示词链接:

msedge_9HDeSbzt9I

有个英文版的Prompts项目也挺不错: f/awesome-chatgpt-prompts: This repo includes ChatGPT prompt curation to use ChatGPT better.,大家可关注下。基本上涵盖了日常生活中比较常用的功能。但这个Prompts似乎是仅在浏览器里缓存的,更新后就没了,要重新搞。感觉不太合适。

不过,一般我都是比较喜欢自己写Prompts。这也是可玩性的一部分吧!以后有机会,我也总结一下大佬们一般是怎么写Prompts的。讲究还挺多 (ฅ´ω`ฅ)

非注册用户

由于我们使用了数据库托管,所以可以轻易地操作数据库以生成新用户。这里我简单展示如何新增一个用户。

首先,我们登陆MongoDB,进入chatGPT数据库的user collection:

msedge_HydN9CrFiJ

这里我创建了一个测试用户test@qq.com。我们双击该记录查看具体信息,如下:

{
    _id: ObjectId('6434ececdf45624abb1d190a'),
    name: 'test@qq.com',
    email: 'test@qq.com',
    password: '36d78f8755a4d79de6b21034f7bbb207',
    status: 0,
    createTime: '4/11/2023, 1:23:24 PM',
    verifyTime: '4/11/2023, 1:24:23 PM'
}

其中_id就是代表用户ID,类似于身份证号,只要与现存帐号不一样即可。name是用户名,email是用户邮箱。status暂时不知道是什么。createTimeverifyTime代表创建和验证时间,差不多是间隔1分钟左右;没研究过这个时间间隔有没有要求,大家可以试试看。

这里的password其实是一段基于md5的哈希值。假设密码是a,盐值(即docker-compose文件里的PASSWORD_MD5_SALT参数的值)是tNJ%M&D,则password的取值为:

# Linux Shell命令。 密码+盐值组成新字符,空间不留任何空隙
echo -n 'atNJ%M&D' | md5sum | cut -c 1-32

输出结果为a3fedefc90692555644896f3c41c26eb,与我的记录是不同的。这是因为每个人的密码和盐值都是不同的,按需生成即可。

只要我们确定好这些参数,再左击New Document新增一条记录并保存,这样就可以在不开放注册的情况下添加用户

msedge_ZWndX6exJT

大家也可以尝试一下如何批量生成新用户喔!

小结

关于自建chatGPT的介绍暂时到这里。我没有介绍太多MongoDB的设置,因为我暂时也不太熟悉;而且,我怀疑由于前端项目的限制,数据库的能力并没有被充分发挥,现在应该也不是介绍后端的最好时机。该项目还有以下缺陷:

  • 不支持流量/付费控制
  • 不支持具体某个聊天记录的markdown输出
  • 重启docker stack后,尽管聊天内容还在,但无法依据前面的聊天内容继续聊天
  • 刷新网页后,要点一下某个聊天记录可以显示历史聊天内容(不知是不是和nginx设置有关)、
  • Prompts并不保存在数据库内

还有一个类似的衍生项目: gouguoyin/chatgpt-web,它的文档“展示”了许多功能,包括登录注册、管理后台、设置首次登录赠送免费提问次数、key轮询池、卡券套餐管理、对话管理、敏感词管理、自定义回复管理、提示词prompt管理、卡密套餐管理、卡密生成和核销等。但它似乎是一个付费和闭源的应用。只能说,感兴趣的小伙伴可以了解喽 (ฅ´ω`ฅ)

如果你可以利用OpenAI的帐户和密码免费使用chatGPT,推荐该项目:lencx/ChatGPT: 🔮 ChatGPT Desktop Application (Mac, Windows and Linux)。它的功能比较官方网站要完善一些,也支持Prompts导入、markdown/pdf/图片输出等:

ChatGPT_UBXT84r8Gx

以后有更多使用心得再来更新!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/430664.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kafka集群topic重新分配leader

1.案例 当kafka集群的broker节点宕机重启后,此broker节点的partition分区的leader节点会被选举为其它broker节点,此broker节点恢复后就会导致配分不均衡 可以看到所有partition的leader节点都在broker id为1的节点上,原来是平均分配到3个broker节点上,replicas项的首位…

【动手学深度学习】(task123)注意力机制剖析

note 将注意力汇聚的输出计算可以作为值的加权平均,选择不同的注意力评分函数会带来不同的注意力汇聚操作。当查询和键是不同长度的矢量时,可以使用可加性注意力评分函数。当它们的长度相同时,使用缩放的“点-积”注意力评分函数…

文章改写工具-文章改写工具的原理

文章改写工具的原理 文章改写工具是一种利用自然语言处理技术和相关算法,对原始文章进行改写、调整或替换等操作,生成与原始文章类似但又不完全相同的新文章的工具。 实现文章改写的工具通常需要包括以下几个步骤: 文本预处理:对原…

【数据库数据恢复】MongoDB数据库启动失败的数据恢复案例

数据库数据恢复环境: Windows Server操作系统服务器,部署MongoDB数据库。 数据库故障&分析: 在MongoDB数据库服务未关闭的情况下,管理员将MongoDB数据库文件从原分区拷贝到其他分区,然后将MongoDB数据库所在原分区…

网页解析--接上篇--bs4/xpath

网页解析完成的是从下载回来的html文件中提取所需数据的方法,一般会用到的方法有: 正则表达式:将整个网页文档当成一个字符串用模糊匹配的方式来提取出有价值的数据 Beautidul Soup:一个强大的第三方插件 lxml:解析html网页或者xm…

一文详解 PoseiSwap,Nautilus Chain 上的首个 DEX

前不久,首个 Layer3 概念的新链 Nautilus Chain 推出了测试网“Triton” 引发瞩目,据了解过,经过一个月的Triton I测试历程,Nautilus Chain社区成员突破200,000,同时测试网激励活动注册地址数突破180,000,链…

Kotlin中lateinit 和 Lazy 的区别

Kotlin中Lateinit 和 Lazy 的区别 latinit 我们可能不想在定义它们时初始化我们的值,相反我们可能想在以后的任何时间初始化并在我们的应用程序中使用它们。但是在使用我们的值之前,一定要记住,我们的值必须先初始化,然后才能使用…

高斯混合模型 GMM 的详细解释

高斯混合模型(后面本文中将使用他的缩写 GMM)听起来很复杂,其实他的工作原理和 KMeans 非常相似,你甚至可以认为它是 KMeans 的概率版本。 这种概率特征使 GMM 可以应用于 KMeans 无法解决的许多复杂问题。 因为KMeans的限制很多…

【factoryio】虚拟仓储实现(入仓出仓)

实现虚拟工厂场景之一的智能仓储实验 注:本文仅供参考 目录 引 入仓部分 1.上料部分 1.效果 2.实现 2.入仓部分 1.效果 2.实现 3.入仓扩展 1.行列控制和优先级 2.入仓优化和完善 出仓部分 1.出仓 2.后传送带 3.出仓效果 1.效果 2.优先级 3.完…

Linux时间服务器(ntp)

1.配置ntp时间服务器,确保客户端主机能和服务主机同步时间 2.配置ssh免密登陆,能够通过客户端主机通过redhat用户和服务端主机基于公钥验证方式进行远程连接 一.配置ntp时间服务器,确保客户端主机能和服务主机同步时间 1、软件安装 [rootl…

高速前行的低代码,其能力边界到底在哪?

最近半年,有好些来自不同岗位、不同立场的人开始问同一个问题:低代码平台的边界是什么?低代码无所不能吗? “全民开发”、“人人都是开发者”这样的口号愈演愈烈,“低代码能力有没有边界”、“边界在哪”,这…

数据要素化全面提速,数据复制将迎来春天?

数据复制市场将迎来真正的春天? 目前看的确如此。近日,国家发改委密集发文,从产权、分配、流通、安全等多个角度解读“数据二十条”( 《中共中央国务院关于构建数据基础制度更好发挥数据要素作用的意见》,简称“数据二…

算法的时间复杂度和空间复杂度(1)

1.算法效率 2.时间复杂度 3.空间复杂度 1.算法效率 如何衡量一个算法的好坏&#xff1f; 比如对于以下斐波那契数列&#xff1a; long long Fib(int N) { if(N < 3) return 1; return Fib(N-1) Fib(N-2)&#xff1b; } 斐波那契数列的递归实现方式非常简洁&#xff0c;但…

SOFA Weekly|SOFA 开源五周年来自社区家人的祝福、社区本周贡献 issue 精选

SOFA WEEKLY | 每周精选 筛选每周精华问答&#xff0c;同步开源进展欢迎留言互动&#xff5e;SOFAStack&#xff08;Scalable Open Financial Architecture Stack&#xff09;是蚂蚁集团自主研发的金融级云原生架构&#xff0c;包含了构建金融级云原生架构所需的各个组件&#…

《程序员面试金典(第6版)》面试题 10.05. 稀疏数组搜索(二分法,分治算法入门题目,C++)

题目描述 稀疏数组搜索。有个排好序的字符串数组&#xff0c;其中散布着一些空字符串&#xff0c;编写一种方法&#xff0c;找出给定字符串的位置。 示例1: 输入: words [“at”, “”, “”, “”, “ball”, “”, “”, “car”, “”, “”,“dad”, “”, “”], s “t…

2023有哪些便宜好用的蓝牙耳机?性价比最高的无线耳机排行

不管入手什么东西&#xff0c;性价比永远能成为人们入手的最重要的参考要素之一。那么&#xff0c;在蓝牙耳机市场中&#xff0c;有哪些便宜好用的蓝牙耳机&#xff1f;针对这个问题&#xff0c;我来给大家推荐几款性价比最高的无线耳机&#xff0c;一起来看看吧。 一、南卡小音…

采购系统是如何管理供应商的?

随着数字化的推进&#xff0c;企业面临着越来越多的供应商管理问题。企业采购数字化转型已经成为大势所趋&#xff0c;对于采购数字化转型而言&#xff0c;供应商管理是重要一环。 供应商准入管理 在供应商准入阶段&#xff0c;企业需要从供应商资质、财务能力、信誉能力、管理…

vite 安装腾讯im组件TUIKit问题记录

按照vue3ts要求安装依赖包 即时通信 IM Web & H5-含 UI 集成方案&#xff08;荐&#xff09;-文档中心-腾讯云 (tencent.com) 这个版本的文档采用全局安装sass&#xff1a; npm install -g sass sass-loader10.1.1 实际安装后遇到无法解析sass的错误提示&#xff0c;使用…

JumpServer堡垒机部署+基本使用

文章目录JumpServer 堡垒机一、理论知识&#xff1a;1、堡垒机与跳板机的区别2、JumpServer4A认证二、实践实验:1、初始化环境准备2、MySQL数据库部署3、Python3.6 程序部署4、Redis数据库部署5、Core组件部署6、Koko组件部署7、Guacamole组件部署1、安装FFmpeg2、安装Guacamol…

socket 及 字节序转换(嵌入式学习)

socket 及 字节序转换socket简介Socket为什么需要Socket&#xff1f;socket类型Socket通信模型字节序主机字节序到网络字节序网络字节序到主机字节序IP地址转换socket简介 1、1982 - Berkeley Software Distributions 操作系统引入了socket作为本地进程之间通信的接口 2、1986…