找回密码
 立即注册
查看: 1044|回复: 2

Docker系列 基于OpenAI API自建ChatGPT

[复制链接]

1

主题

0

回帖

11

积分

版主

积分
11
发表于 2023-4-20 10:46:00 | 显示全部楼层 |阅读模式
转自我的博客文章https://blognas.hwb0307.com/linux/docker/4201,内容更新仅在个人博客可见。欢送关注!
前言

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


只管该打算支持多用户跟聊天数据保存(基于MongoDB),但也只是一个比较简陋的Demo,暂时还没有一些比较精细的功能。不过咱们也只是自己用一下,不是什么商业化项目,应该无所谓!后续有更好的开源免费项目,我也会陆续先容。对于保险性,我只能说我暂时没有发明这个打算有主观歹意行为。API并没有异常扣费。
值得注意的是,只要你的API支持,这个打算也支持GPT-4,它是由OpenAI公司在2023年3月14日宣布的一个比gpt-3.5更强大的语言模型。想进一步了解GPT-4的小搭档可以看“跟李沐学AI”的视频:GPT-4论文精读。
准备工作
你需要使用非中国大陆跟香港的IP拜访http://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即可:


这个API Key只展示一次,你应该记录一下。如果忘记了,新建一个再删除旧的即可,然后记住新的key即可。
你可以在“Account - OpenAI API”中查看消费情况:


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


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


测试环境

我的自建chatGPT布署在博客的VPS上:
  1. 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
  2. docker --version # Docker version 23.0.3, build 3e7cbfd
  3. 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,比较原始。
文件夹跟端口

首先,我们新建工作目录:
  1. work=/docker/kerwin_chatgpt
  2. mkdir -p $work; cd $work
复制代码
如果你也使用了ufw,应该开放一下端口:
  1. sudo ufw allow 1004/tcp comment 'kerwin_chatgpt' && sudo ufw reload
  2. 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文件:
  1. vi $work/docker-compose.yml
复制代码
填入下面的内容。如果你用过mongo或mongo-express,可以改为自己正在使用的tag,这样比较节俭镜像空间。有按需修改提示的也要按自己的实际情况修改:
  1. version: '3'
  2. services:
  3.   app:
  4.     # 在https://hub.docker.com/r/kerwin1202/chatgpt-web/tags 里取得tag。或者写latest
  5.     image: kerwin1202/chatgpt-web:latest
  6.     restart: unless-stopped
  7.     ports:
  8.       - 1004:3002
  9.     depends_on:
  10.       - database
  11.     environment:
  12.       TZ: Asia/Shanghai
  13.       # 从OpenAI后盾里取得
  14.       OPENAI_API_KEY: sk-XXX # 按需修改
  15.       # 拜访jwt加密参数,可选 不为空则允许登录 同时需要设置 MONGODB_URL
  16.       AUTH_SECRET_KEY: 12345678abcdefg # 按需修改
  17.       # 超时,单位毫秒,可选
  18.       TIMEOUT_MS: 60000
  19.       # 网站名
  20.       SITE_TITLE: BenszChat # 按需修改。写个自己喜欢的名字就行
  21.       # mongodb 的连接字符串
  22.       MONGODB_URL: 'mongodb://user01:password01@database:27017' # 按需修改
  23.       # 网站是否开启注册
  24.       REGISTER_ENABLED: true # 完成注册后,这一项要改为false
  25.       # 开启注册之后 网站注册允许的邮箱后缀 如果空 则允许任意后缀
  26.       REGISTER_MAILS: '@qq.com,@gmail.com,@163.com' # 按需修改
  27.       # 加密盐。算法: echo -n 'passwordsalt' | md5sum | cut -c 1-32
  28.       PASSWORD_MD5_SALT: tNJ%M&D # 按需修改
  29.       # 开启注册之后 超级治理员的邮箱
  30.       ROOT_USER: hwb2012@qq.com # 按需修改
  31.       # 开启注册之后网站域名 不含 / 。注册的时候发送验证邮箱使用
  32.       SITE_DOMAIN: https://chatgpt.hwb0307.com # 按需修改
  33.       # 开启注册之后 发送验证邮箱配置
  34.       SMTP_HOST: smtp.qq.com
  35.       SMTP_PORT: 465
  36.       SMTP_TSL: true
  37.       SMTP_USERNAME: hwb2012@qq.com # 按需修改
  38.       SMTP_PASSWORD: xxxxxxxx # 按需修改
  39.     links:
  40.       - database
  41.   database:
  42.     image: mongo:3.6
  43.     restart: unless-stopped
  44.     expose:
  45.       - '27017'
  46.     volumes:
  47.       - ./mongodb:/data/db
  48.     environment:
  49.       MONGO_INITDB_ROOT_USERNAME: user01
  50.       MONGO_INITDB_ROOT_PASSWORD: password01
  51.       MONGO_INITDB_DATABASE: chatgpt
  52.   gui:
  53.     image: mongo-express:1.0.0-alpha
  54.     restart: unless-stopped
  55.     ports:
  56.       - "1005:8081"
  57.     environment:
  58.       # 选择主题。详见: http://codemirror.net/demo/theme.html
  59.       ME_CONFIG_OPTIONS_EDITORTHEME: ambiance
  60.       # 数据库信息
  61.       ME_CONFIG_BASICAUTH_USERNAME: user02
  62.       ME_CONFIG_BASICAUTH_PASSWORD: password02
  63.       ME_CONFIG_MONGODB_URL: 'mongodb://user01:password01@database:27017'
  64.       ME_CONFIG_MONGODB_ENABLE_ADMIN: true # 可能不是必要的
  65.       ME_CONFIG_MONGODB_ADMINUSERNAME: user01 # 可能不是必要的
  66.       ME_CONFIG_MONGODB_ADMINPASSWORD: password01 # 可能不是必要的
复制代码
这个docker-compose.yml要自定义的货色还挺多的。如果大家使用时有什么疑问,可以在评论区留言!
最后直接上线即可:
  1. cd $work && docker-compose up -d
复制代码
其它docker相关操作跟一般的docker应用是类似,这里就不细说了。
NPM设置
不了解Nginx Proxy Manager(NPM)用法的小搭档,请看《Docker系列 两大神器NPM跟ddns-go的装置》。
准备两个域名并在域名托管商(比方Cloudflare),比方chatgpt.hwb0307.com跟chatgptgui.hwb0307.com:

  • chatgpt.hwb0307.com给chatGPT的前端使用,反代地址http://172.17.0.1:1004
  • chatgptgui.hwb0307.com给chatGPT的后端使用,反代地址http://172.17.0.1:1005
反代进程并不需要设置特别的参数。
前端基本界面如下:


后端数据库界面如下:


基本先容

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


总览

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


总览里还可以导入/导出聊天记录(以.json格局),也是挺不错的!
我这里简单展示其它选项的内容:
高等

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


基本配置

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


网站配置

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


这个打算应该是有效的。大家试试看!
点亮新用户表明你开放注册;点亮新用户审核表明该用户需要你审核才可以使用。如果你开放注册,一般倡议这两者都要点亮。如果你不想开放注册,将新用户点暗即可。


邮箱配置

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


提示词商店

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


有个英文版的Prompts项目也挺不错: f/awesome-chatgpt-prompts: This repo includes ChatGPT prompt curation to use ChatGPT better.,大家可关注下。基本上涵盖了日常生活中比较常用的功能。但这个Prompts似乎是仅在浏览器里缓存的,更新后就没了,要重新搞。感到不太适合。
不过,一般我都是比较喜欢自己写Prompts。这也是可玩性的一局部吧!以后有机会,我也总结一下大佬们一般是怎么写Prompts的。讲究还挺多 (ฅ´ω`ฅ)
非注册用户

由于我们使用了数据库托管,所以可以轻易地操作数据库以生成新用户。这里我简单展示如何新增一个用户。
首先,我们登陆MongoDB,进入chatGPT数据库的user collection:


这里我创建了一个测试用户test@qq.com。我们双击该记录查看具体信息,如下:
  1. {
  2.     _id: ObjectId('6434ececdf45624abb1d190a'),
  3.     name: 'test@qq.com',
  4.     email: 'test@qq.com',
  5.     password: '36d78f8755a4d79de6b21034f7bbb207',
  6.     status: 0,
  7.     createTime: '4/11/2023, 1:23:24 PM',
  8.     verifyTime: '4/11/2023, 1:24:23 PM'
  9. }
复制代码
其中_id就是代表用户ID,类似于身份证号,只要与现存帐号不一样即可。name是用户名,email是用户邮箱。status暂时不知道是什么。createTime跟verifyTime代表创建跟验证时间,差未多少是距离1分钟左右;没研究过这个时间距离有没有要求,大家可以试试看。
这里的password其实是一段基于md5的哈希值。假设密码是a,盐值(即docker-compose文件里的PASSWORD_MD5_SALT参数的值)是tNJ%M&D,则password的取值为:
  1. # Linux Shell命令。 密码+盐值组成新字符,空间不留任何空隙
  2. echo -n 'atNJ%M&D' | md5sum | cut -c 1-32
复制代码
输出成果为a3fedefc90692555644896f3c41c26eb,与我的记录是不同的。这是因为每个人的密码跟盐值都是不同的,按需生成即可。
只要我们确定好这些参数,再左击New Document新增一条记录并保存,这样就可以在不开放注册的情况下添加用户


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

对于自建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/图片输出等:


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

0

主题

1

回帖

5

积分

新手上路

积分
5
发表于 2023-4-20 10:46:44 | 显示全部楼层
很好的项目,原来以为只是介绍你fork的原项目,没想到你的修改如此之大且全面,非常感谢🙏
回复

使用道具 举报

0

主题

1

回帖

10

积分

新手上路

积分
10
发表于 2023-4-20 10:47:40 | 显示全部楼层
加油哦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|T9AI - 深度人工智能平台 ( 沪ICP备2023010006号 )

GMT+8, 2024-12-4 01:23 , Processed in 0.055663 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表