首页 > 编程语言 >使用docker部署Python-Flask实现ChatGPT的使用

使用docker部署Python-Flask实现ChatGPT的使用

时间:2023-02-16 14:23:11浏览次数:41  
标签:chatgpt Python transition 1em Flask -- ChatGPT root docker

首先说下背景:

  自从申请ChatGPT到现在也有个把月了,余额一直还很多,想想三月下旬就过期了,还是计划把里面的18美刀用掉,于是结合着之前做的Django简单cv一个"简易网站"。

简单说一下实现原理:

  先写界面,计划半天,由于没有VUE上云的经验,还是用最基础的超文本标记语言吧(主要是简单轻松,哈)HTML+css

  后台用Flask,解释器Python3.9,官网给好的框架可轻松实现一个简易网站的搭建

  部署的时候用docker,写好Dockerfile,直接在容器里面把环境码好了

一、创建环境

 

 

 

 

1、flask插件
2、Python依赖的模块  openAI, Flask, render_template, request, flash, jsonify

 二、代码部分

2.1、功能代码

# -*- coding:utf-8 -*-
# !/usr/bin/python3
#####################################################################
# Author : zhoujt
# Tel : 186xxxxxxxx
# Date : 2023-02-14
# FileName : openaigpt.py
# Description: web requests
#####################################################################
import json
import time
import openai
import requests
from flask import Flask, render_template, request, flash, jsonify
import re

app = Flask(__name__)
app.secret_key = 'security-guard'


def zhoujt_chatgpt(userinfo):
    # 获取当前时间
    now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    result = '[%s]  %s\n' % (now, userinfo)

    headers = {
        'Content-Type': 'application/json'
    }

    # msg_info = result
    msg_info = str(result).replace("\n", "")

    payload = {
        "msgtype": "text",
        "text": {
            "content": msg_info
        }
    }
    requests.post("https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=4478aey3dea-2c8e-4d6e-acc7-1c1n3n39ty47",
                      data=json.dumps(payload), headers=headers)


# Answer the last piece of information
def answer_meg(question):
    openai.api_key = "sk-tPYjaksdhf23e3ccJ4uSaT3BlbkFJ2U40tFsz9EzmhfuqeyY87Z"
    completion = openai.Completion.create(
        engine="text-davinci-003",
        prompt=question,
        max_tokens=1024,
        temperature=1
    )
    an_info = completion.choices[0].text
    return an_info

# 路由
@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        ip_req = request.form.get('requestivr')
        print(ip_req)
        try:
            shell = answer_meg(question=ip_req)
            print(shell)
            shell = list(shell)
            resultsh = "".join(shell)
            flash(u'Q: %s\t' % ip_req)
            flash(u'%s\n' % resultsh)
            zhoujt_chatgpt(userinfo=ip_req)
            zhoujt_chatgpt(userinfo=resultsh)
        except Exception as e:
            flash(u'Q: %s\t\t' % ip_req)
            flash(u'\t抱歉,ChatGPT负载过高,请稍后重试\t%s' % e)
            zhoujt_chatgpt(userinfo=e)

    return render_template('send.html')


if __name__ == '__main__':
    app.run(host='0.0.0.0',port=6666, debug=True)

 2.2、前端页面

<!DOCTYPE html>
<html>
<head>
    <title>ChatGPT</title>
    <link href="https://files.cnblogs.com/files/security-guard/Porsche.ico" rel="shortcut icon">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link href="../static/style.css" rel="stylesheet" type="text/css" media="all"/>
</head>
<body>
<div class="null"></div>
<div class="null"></div>
<!-- main -->
<form method="post">
    <input class="text" type="text" name="requestivr" placeholder="What would you like to ask ChatGPT?" required="">
    <input type="submit" value="submit">
    <div class="wthree-text">
        <div class="clear"></div>
        <div style="text-align: center;">
            <div class="w3copyright-zhoujt">
                {% for message in get_flashed_messages() %}<br>
                    {{ message }}<br>
                {% endfor %}
            </div>
        </div>
    </div>
</form>

<!-- copyright -->
<div class="w3copyright-agile">
    <p>Please input your requests<a href="" title="#"></a></p>
    <p>This link is for entertainment only and not for commercial use<a href="" title="#"></a></p>
</div>
</div>
</body>
</html>

 2.3、css调试代码

可见有两个 @media 其功能是为了区分手机端和PC端

@media only screen and (max-width: 767px) {
    input[type="text"] {
        outline: none;
        padding: 1em;
        width: 88%;
        margin: 2em 1em auto;
        text-align: center;
        border-radius: 10px;
    }


    input[type="submit"] {
        font-size: 1em;
        color: #fff;
        background: #007bff;
        outline: none;
        border: none;
        cursor: pointer;
        padding: 1em;
        -webkit-appearance: none;
        width: 88%;
        margin: 2em 1em auto;
        border-radius: 10px;
    }

    input[type="submit"]:hover {
        background: #0000FF;
        -webkit-transform: translateY(8px);
        -ms-transform: translateY(8px);
        -o-transform: translateY(8px);
        transform: translateY(8px);
        -webkit-box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.58);
        -moz-box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.58);
        box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.58);
        -webkit-transition: .5s all;
        -moz-transition: .5s all;
        -o-transition: .5s all;
        transition: .5s all;
    }

    .clear {
        clear: both;
    }

    .w3copyright-agile {
        margin: 2em 0 1em;
        text-align: center;
    }

    /*两个最下面提示黑白*/
    .w3copyright-agile p {
        font-size: 1em;
        color: #0f6a18;
        line-height: 1.8em;
        /*background: #007bff;*/
    }

    .w3copyright-agile p a {
        color: #9e3a18;
    }

    .w3copyright-agile p a:hover {
        color: #343a40;
        transition: 0.5s all;
        -webkit-transition: 0.5s all;
        -moz-transition: 0.5s all;
        -o-transition: 0.5s all;
        -ms-transition: 0.5s all;
    }

    .w3copyright-zhoujt {
        outline: none;
        padding: 1em;
        width: 85%;
        margin: 2em 1em auto;
        text-align: center;
        border-radius: 10px;
    }
}

@media only screen and (min-width: 768px) {
    input[type="text"] {
        font-size: 1em;
        margin: 1em 35%;
        padding: 1em;
        width: 28%;
        border-radius: 10px;
    }

    input[type="submit"] {
        font-size: 1em;
        color: #fff;
        background: #007bff;
        outline: none;
        border: none;
        cursor: pointer;
        padding: 1em;
        -webkit-appearance: none;
        width: 30%;
        margin: 2em 35%;
        border-radius: 10px;
    }

    input[type="submit"]:hover {
        background: #0000FF;
        -webkit-transform: translateY(8px);
        -ms-transform: translateY(8px);
        -o-transform: translateY(8px);
        transform: translateY(8px);
        -webkit-box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.58);
        -moz-box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.58);
        box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.58);
        -webkit-transition: .5s all;
        -moz-transition: .5s all;
        -o-transition: .5s all;
        transition: .5s all;
    }

    .clear {
        clear: both;
    }

    .w3copyright-agile {
        margin: 2em 0 1em;
        text-align: center;
    }

    /*两个最下面提示黑白*/
    .w3copyright-agile p {
        font-size: 1em;
        color: #343a40;
        line-height: 1.8em;
    }

    .w3copyright-agile p a {
        color: #343a40;
    }

    .w3copyright-agile p a:hover {
        color: #343a40;
        transition: 0.5s all;
        -webkit-transition: 0.5s all;
        -moz-transition: 0.5s all;
        -o-transition: 0.5s all;
        -ms-transition: 0.5s all;
    }
}

 2.4、打包代码

目录结构
[root@Huawei ~/chatgpt/chatGPT]# tree ./ ./ |-- app.py |-- Dockerfile |-- __pycache__ | `-- prod.cpython-39.pyc |-- requirements.txt |-- static | `-- style.css `-- templates `-- send.html 3 directories, 7 files

 三、部署项目

3.1、传统方式部署

安装虚拟环境  pip3  install virtualenv
创建虚拟环境  virtualenv win_adduser
进入虚拟环境  source /data/csweb/bin/activate
退出虚拟环境  deactivate
[root@windowsop-tx-9208 bin]# source /data/csweb/bin/activate
(csgpt) [root@windowsop-tx-9208 bin]# 
将Python3和pip3安装到此虚拟环境
(csgpt) [root@Huawei ~/chatgpt]# which python3
/data/wds/bin/python3
(csgpt) [root@Huawei ~/chatgpt]# which pip3
/data/wds/bin/pip3
(csgpt) [root@Huawei ~/chatgpt]# 
虚拟环境安装所需的包
pip3 install -r requirement.txt
创建虚拟环境启动的服务
[root@Huawei ~/chatgpt]# cat /etc/systemd/system/csgpt_test.service
[Unit]
Description=csgpt test environment
After=syslog.target network.target

[Service]
User=root
Group=root
Type=simple
Restart=always
WorkingDirectory=/data/csgpt   # 工作目录
ExecStart=/data/csgpt/bin/python3 app.py runserver 0.0.0.0:6666  # 启动命令
ExecStop=/bin/kill -15 $MAINPID  # 安全模式杀进程
StandardOutput=syslog
StandardError=syslog
#SyslogIdentifier=csgpt.com
SyslogFacility=local0
SyslogLevel=info

[Install]
WantedBy=multi-user.target
[root@Huawei ~/chatgpt]# 

 3.2、docker部署

docker部署方便的很,下载docker就成,力荐docker

3.2.1、写好Dockerfile,用于构建编译

[root@Huawei ~/chatgpt/chatGPT]# cat Dockerfile 
FROM python:3.9
WORKDIR /root/chatgpt/chatGPT
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.douban.com/simple/
COPY . .
CMD [ "python", "./prod.py" ]
[root@Huawei ~/chatgpt/chatGPT]#

 3.2.2、打包上传运行

# docker构建镜像
docker build -t chatgpt:1.3 .
# 查看镜像
[root@Huawei ~/chatgpt/chatGPT]# docker images 
REPOSITORY                                TAG                 IMAGE ID            CREATED             SIZE
chatgpt                                   1.3                 933455e34545        26 hours ago        932 MB
# 测试环境
docker run -it --rm -p 8888:6666 chatgpt:0.1
# 生产环境
docker run -d -p 8888:6666 --name chatgpt2.3 chatgpt:1.3
    #   -d :使容器在后台运行
    #   -p :端口映射,即访问本机的前者(8888)相当于访问docker容器中的后者(6666)
# 查看容器
[root@Huawei ~/chatgpt/chatGPT]# docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                    NAMES
aef043d82ddd        chatgpt:1.3         "python ./prod.py"   26 hours ago        Up 26 hours         0.0.0.0:6201->8888/tcp   chatgpt2.3
# docker查看镜像日志
docker logs -f --since 30m aef043d82ddd
# 删除测试后无用的容器
docker ps -a | grep chatgpt1. | awk -F ' ' '{print $13}' | xargs docker rm
# 停止类似Java的其他服务
docker ps | grep java | awk -F ' ' '{print $NF}' | xargs docker stop
# 进入docker镜像环境
docker run -it chatgpt2.3 /bin/bash
docker exec -it e621d1e639b1 bash # 运行中的容器
# docker查看镜像日志
docker logs -f --since 30m aef043d82ddd

 四、查看效果

 

 

 

 

 除了机器人,整个这个还算是不错的

完活手工~

 

标签:chatgpt,Python,transition,1em,Flask,--,ChatGPT,root,docker
From: https://www.cnblogs.com/security-guard/p/flask-chatgpt.html

相关文章

  • 【Python】字母表的循环迭代
     字母循环迭代器defforward(letter,jump):"""字母表上的循环迭代器"""ifletter.islower():start_character=ord('a')......
  • python读取json 生成Excel表格
    importjsonimportxlwtbiaotou='[{"name_cn":"企业名称","name_en":"QYMC"},{"name_cn":"类别","name_en":"LB"},{"name_cn":"地市","name_en":"DS&q......
  • 【Python】递归获取嵌套json 的所有key及value值
     代码classrecurPostDict:"""递归获取多维嵌套字典所有层级的key和value"""def__init__(self,datas):self.datas=datasdefrecur_dat......
  • Python导出项目依赖包
    只导出当前项目依赖包1、安装pipreqs:pipinstallpipreqs2、进入当前项目目录下,导包:pipreqs./(导包完成会生成一个requirements.txt文件)3、安装依赖的时候使用:pip......
  • Python实现随机森林RF并对比自变量的重要性
      本文介绍在Python环境中,实现随机森林(RandomForest,RF)回归与各自变量重要性分析与排序的过程。  其中,关于基于MATLAB实现同样过程的代码与实战,大家可以点击查看MATLA......
  • 对服务器进行心跳检测 python django
    (由于春节期间连不上服务器,但又不知道是不是服务器关机了,因此写一个心跳检测功能遇到问题时可以排查部分原因)具体来说分为客户端和服务端,客户端为校园服务器,服务端为我们自......
  • Python装饰器实例讲解(三)
    Python装饰器实例讲解(三)本文多参考《流畅的python》,在此基础上增加了一些实例便于理解姊妹篇Python装饰器实例讲解(一),让你简单的会用Python装饰器实例讲解(二),主要......
  • python3常用模块和方法
    1、使用索引反转字符串str="hello"print(str[::-1])2、zip函数获取可迭代对象,将它们聚合到一个元组中,然后返回结果。语法是zip(*iterables)numbers=[1,2,3]strin......
  • Flask Mysql 连接提交出错
    RuntimeError:Thesessionisunavailablebecausenosecretkeywasset. Setthesecret_keyontheapplicationtosomethinguniqueandsecret.出错如上所示原......
  • apriori算法 python实现
    fromtypingimport*fromtypingimportList,TuplefromitertoolsimportcombinationsdefloadDataSet():return[{1,2,4,5},{2,3,5},{1,2,3,5},......