跳转至

基于 ChatGPT 的在线问答机器人

本文介绍了如何基于 OpenAI ChatGPT 接口和 feffery components 构建在线问答机器人,并基于 render 实现自动化持续部署。

它支持:

  1. 开启多轮对话模式,它将记住你之前的问题。
  2. 导出当前对话记录为 Markdown 文件,你可以将其保存到本地。
  3. 一键清空当前对话记录。

使用它!

image-20230305114453764

ChatGPT 接口和 Dash 应用介绍

OpenAI 在 3 月 2 日发布了 gpt-3.5-turbo,这是 GPT-3(Generative Pre-trained Transformer 3)模型的最新版本,它拥有更快的处理速度和更低的成本(100 万词的对话大约只需要 10 多元人民币)。

公众号玩转 Dash的费老师分享了 基于 ChatGPT 官方接口快速开发对话机器人支持多轮对话、记录导出,纯 Python 开发 ChatGPT 对话机器人应用,我根据这些教程搭建了基于 ChatGPT 的在线问答机器人,并在 render 上实现了自动化持续部署。

本地构建

核心步骤

参考 基于 ChatGPT 官方接口快速开发对话机器人支持多轮对话、记录导出,纯 Python 开发 ChatGPT 对话机器人应用,按照如下几步即可在本地构建 Dash 应用:

  1. 将代码下载到本地,进入代码所在目录,创建虚拟环境并激活。
Bash
conda create -n chatgpt-bot python=3.8 -y
conda activate chatgpt-bot
  1. 通过pip install -r requirements.txt安装依赖

  2. config.py中填入自己的 openai_api_key

  3. 通过python app.py在本地构建 Dash 应用。

image-20230305114453764

进阶配置

到此我们应该能够在 http://127.0.0.1:8050 看到已经成功构建的 Dash 应用了,但可能会遇到一些问题:

网络问题

设定命令行运行的参数,如果带有参数local,则开启PROXY,其中10809PROXY网络的端口号,我们需要找到自己的PROXY网络的端口号填进去。

Python
import sys

if len(sys.argv) > 1 and sys.argv[1] == "local":
    import os

    os.environ["HTTP_PROXY"] = "http://127.0.0.1:10809"
    os.environ["HTTPS_PROXY"] = "http://127.0.0.1:10809"

在本地构建时,用python app.py local即可。

若只在本地运行,可以默认使用 PROXY

如果你只在本地运行,也可以不用加入命令行参数,也就是把 if len(sys.argv) > 1 and sys.argv[1] == "local": 删去,默认使用 PROXY。

我这里加入了命令行参数,是因为我最终需要部署到 render 上,render 是不用开启 PROXY 就能使用 OpenAI 的。

当我在本地运行时,就用命令行参数指定网络端口。而在 render 上持续部署时,默认是不会开启指定的网络端口的。

openai_api_key存放为环境变量

openai_api_key是私人的密钥,不应该暴露在公共环境中。如果需要将代码上传到 GitHub 等平台,可以设置环境变量,这样可以将openai_api_key隐藏,但不影响应用的运行。

注意命令行是否以管理员身份打开:

  1. 若不是管理员身份,则应该将openai_api_key添加到用户变量。
  2. 若是管理员身份,则应该将openai_api_key添加到系统变量。

image-20230305105214984

config.py读入环境变量:

Python
import os


class Config:
    # 请填入你的 openai API key
    openai_api_key = os.getenv("OPENAI_API_KEY")

基于 render 实现自动化持续部署

将代码上传到 GitHub 后,在 render 上配置:

image-20230305123028465

  1. 服务器区域,建议选新加坡,离中国最近,访问速度可能比较好。

  2. Build Command

"Build Command" pip install -r requirements.txt

注意:requirements.txt 中需要包含 gunicorn,否则无法运行gunicorn

  1. Start Command

"Start Command" gunicorn chat_app:server

注意我们需要把 app.py 先重命名为 chat_app.py(你也可以命名为其他名字,只要不是app.py即可),否则 gunicorn app:server 会出现命名冲突导致部署失败。参考:https://community.render.com/t/what-is-the-correct-start-command-for-a-python-dash-app/5740

  1. 如果OPENAI_API_KEY是环境变量的形式存放,则还需要设置 Environment。

image-20230305110506749

这样就能够实现自动化持续部署了,当 GitHub 代码仓库有更新时,Dash 应用也会自动部署更新。

其他部署方法:在自建服务器使用 Nginx 实现端口转发

我在自建服务器上尝试部署 Dash 应用,但遇到了许多麻烦的事,例如:

端口转发:已实现

参考:Windows 10 nginx 安裝及问题解决 设置 80 端口代理

配置 host 后默认请求到 80 端口,而 80 端口一般被各种系统服务占用。Dash 的默认服务端口为 8050,需要通过 Nginx 做端口转发,方法如下。

删除 nginx.conf 中 server 部分配置,替换成下面配置:

Text Only
server {
    listen 80;
    location / {
        proxy_pass http://127.0.0.1:8050; # 应用服务器 HTTP 地址
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

配置 SSL 证书实现 HTTPS 加密访问,未实现

从域名服务商下载 SSL 证书后需要在 Nginx 进行配置,我最终没能达到加密访问的效果,遂放弃。

参考:腾讯云:Nginx 服务器 SSL 证书安装部署

心得

毕竟不是科班出身,我没有系统地学习过计算机网络等知识,每次遇到问题都是自己搜集答案解决。这些问题或许对一个有经验的人来说非常简单,但没有经验的话需要踩很多坑。

非常遗憾我目前时间有限,并且有其他更重要的事情要做,不太希望花太多时间折腾这些技术。希望今后有自由的时间了,再系统、广泛地学习各种技术吧。✊

自建服务器还有很多缺点,例如:

  1. 不易维护。证书、网络、性能都是需要自己管理并维护的,不是很让人省心。
  2. 有一定的成本。每年需要花几百元购买服务器。
  3. 需要很多进阶的配置。要想实现 HTTPS、自动化持续部署等实用功能,需要学习更多的技术。如果我们不是专业的运维人员,需要在这些方面花费大量时间。

所以我还是推荐使用专业的部署平台(如 rendervercelheroku 等),免费版本的功能和额度已经足够用了,它们实在是让人省心不少。或者使用 GitHub Actions 实现持续集成、持续部署,不过访问速度可能稍慢。

真心感恩这些为所有人提供优质服务的开发者们。

评论