基于OpenAI的Chatbot开发记录

2023-05-16

Chatbot 开发记录

最近ChatGPT非常火,去体验之后确实有被惊艳到,也对OpenAI上的人工智能模型比较感兴趣,于是想着复刻一个ChatGPT,利用官方提供的包和api,可以非常简单地复刻出一个ChatGPT,下面是复盘开发过程的记录。

项目地址:https://github.com/Fangnan700/Chatbot

配置项目

  • 我所使用的开发环境是Ubuntu22.04 + Python3.10 + Pycharm2022.3;

  • 项目后端采用Flask框架,前端采用Bootstrap框架,前后端使用json进行交互。

项目结构:

image-20221217222120806

编写代码

前端:

前端需要的框架文件:

  • jquery-3.6.2.min.js
  • bootstrap.min.js
  • bootstrap.min.css

文件可以到官网直接下载。

index.html

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0" maximum-scale="1.0" user-scalable="0">
    <title>Chatbot.</title>
    <script src="{{ url_for('static', filename='js/bootstrap.min.js') }}"></script>
    <script src="{{ url_for('static', filename='js/jquery-3.6.2.min.js') }}"></script>
    <link rel="icon" href="{{ url_for('static', filename='img/robot.png') }}">
    <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/bootstrap.min.css') }}">
    <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/index.css') }}">
</head>
<body>

<div class="container-fluid">
    <div class="row-cols-auto">
        <div class="main">
            <img src="{{ url_for('static', filename='img/logo.png') }}" width="320px" height="100px">
        </div>
    </div>

    <div class="row-cols-auto">
        <div class="col" id="content">
            <div class="col" id="response"></div>
        </div>
    </div>

     <div class="row" id="loading_frame">
        <div class="spinner-border text-light" role="status">
            <span class="visually-hidden">Loading...</span>
        </div>
    </div>

    <div class="row-cols-auto">
        <div class="col textarea" id="input" contenteditable="true" onfocus="clear_input()">

        </div>
    </div>

    <div class="row-cols-auto" id="btn_group">
        <button class="btn btn-secondary" id="clear_btn" onclick="clear_history()" onmo>清 空</button>
        <button class="btn btn-secondary" id="send_btn" onclick="send()">发 送</button>
    </div>

    <div class="row-cols-auto" id="footer_frame">
        Copyright © 2022
        <a class="link-light" href="https://github.com/Fangnan700">Fang nan.</a>
        All rights reserved.
    </div>

</div>

</body>
<script src="{{ url_for('static', filename='js/index.js') }}"></script>
</html>

index.css

body {
    width: 100%;
    height: 100%;
    background: #333333;
}

.main {
    width: 100%;
    height: 100%;
    text-align: center;
}

#content {
    width: 100%;
    height: auto;
    min-height: 480px;
    margin-top: 20px;
    padding-top: 20px;
    padding-bottom: 80px;
    padding-left: 50px;
    padding-right: 50px;
    background: rgba(0,0,0, 1);
    backdrop-filter: blur(10px);
    border-radius: 15px;
}

#response {
    width: 100%;
    height: auto;
    min-height: 380px;
    color: #ffffff;
}

#loading_frame {
    width: 30px;
    height: 30px;
    margin-top: 20px;
    margin-left: auto;
    margin-right: auto;
    text-align: center;
    visibility: hidden;
}

#input {
    width: 100%;
    height: auto;
    min-height: 50px;
    line-height: 50px;
    margin-top: 20px;
    padding-left: 30px;
    padding-right: 10px;
    border-radius: 15px;
    background: black;
    color: #ffffff;
}

#btn_group {
    margin-top: 20px;
    margin-bottom: 30px;
    text-align: right;
}

#clear_btn {
    width: 100px;
    margin-left: auto;
    margin-right: auto;
    border-radius: 10px;
}

#send_btn {
    width: 100px;
    margin-left: 10px;
    margin-right: auto;
    border-radius: 10px;
}


#footer_frame {
    width: 230px;
    height: 30px;
    line-height: 30px;
    margin-top: 20px;
    margin-left: auto;
    margin-right: auto;
    text-align: center;
    color: #ffffff;
}

index.js


// 获取页面元素并创建全局变量
let loading_frame = document.getElementById("loading_frame");
let _input = document.getElementById("input");
let response = document.getElementById("response");
let clear_btn = document.getElementById("clear_btn");
let send_btn = document.getElementById("send_btn");
let history;

// 设置提示语
response.innerText = "hi~我是Chatbot,你可以把你的问题写在下方,然后发送给我,我会尽力为你解答😆"
_input.innerText = "请把你的问题写在这里"

// 发送请求
function send() {
    send_btn.blur();
    loading_frame.style.visibility = "visible";
    let value = _input.innerText;
    history = document.getElementById("response").innerText;
    response.innerText = history + "\n\nQ:\n\n" + value;
    let data = {"content": value};
    $.ajax({
        url: "/send",
        type: "post",
        contentType: 'application/json',
        data: JSON.stringify(data),
        success: function (result) {
            history = document.getElementById("response").innerText;
            response.innerText = history + "\n\nA:" + result;
            loading_frame.style.visibility = "hidden";
        },
        error: function () {
            loading_frame.style.visibility = "hidden";
            response.innerText = "好像出了点问题哦,稍后再试试吧~";
        }
    })
}

// 清除历史内容
function clear_input() {
    _input.innerText = "";
}

function clear_history() {
    clear_btn.blur();
    _input.innerText = "";
    response.innerText = "";
}

后端:

后端使用Python+Flask实现,同时需要引入几个包:

  • openai(OpenAI官方提供的包,可以非常方便地发送请求)
  • dotenv(用于读取环境变量,OpenAI的api-key将在环境变量文件中设置)

以上两个包可以直接用pip进行安装。

在项目根目录创建.flaskenv文件并写入配置:

FLASK_APP=app
FLASK_ENV=development
OPENAI_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

其中OPENAI_API_KEY填写的是从OpenAI官网申请到的api-key,申请网址:

https://beta.openai.com/api

app.py

from flask import *
import os
import openai

app = Flask(__name__)
openai.api_key = os.environ.get('OPENAI_API_KEY')


@app.route('/', methods=('GET', 'POST'))
def index():
    return render_template('index.html')


@app.route('/send', methods=('GET', 'POST'))
def send():
    # 解析前端发送的数据
    recv = request.json
    data = recv['content']
    
    # 核心代码,用于向OpenAI的服务器发送请求数据
    response = openai.Completion.create(
        model="text-davinci-003",	# 选择要使用的模型
        prompt=data + '.',			# 请求的数据,即向模型输入的语句,需要以"."结尾
        temperature=0.8,			# 参数,范围0~1,数值越大输出的数据更独特,数值越小输出更准确
        n=1,						# 为每个提示生成多少结果,默认为1
        max_tokens=2048				# 单次输出的最大令牌数,大多数模型支持的最大值为2048
    )
    return response.choices[0].text # 从服务器返回的数据中取出想要的结果


if __name__ == '__main__':
    app.run()

部署项目

这里推荐使用境外的服务器,国内可以通过http请求访问到,将输入的内容发送到服务器,再由服务器转发到OpenAI的服务器上,由此可以在不使用科学上网的情况下,实现与AI机器人的交互。

为了便于在服务器上启动项目,我使用shell脚本来完成项目的启动:

run.sh

#! /bin/bash
./venv/bin/python -m flask run --host 0.0.0.0 --port 80

编写好的脚本放在项目根目录下。

将项目连同虚拟环境一起打包,上传到服务器:

scp Chatbot.zip username@host:/path

上传完成后解压:

unzip Chatbot.zip

进入项目文件下并给脚本赋予权限:

cd Chatbot
chmod +x run.sh

开放80端口:

ufw allow 80

在后台不中断地启动项目:

setsid ./run.sh &

这么启动在ssh连接断开后项目不会停止。

1

至此,通过服务器的公网IP就可以访问到项目了,如果访问不到,就要到服务器的管理面板查看端口是否开放。

2

在不使用vpn的情况下也能正常使用:

3

手机端也能正常使用:

1EE60F238611E931B3ABCE4FCA1A182F

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于OpenAI的Chatbot开发记录 的相关文章

  • MicroStrategy 简介 【Business Intelligent】

    下载地址 xff1a https www microstrategy com us resources microstrategy for students students Capabilities that power the Inte
  • DiffusionDet:Diffusion Model for Object Detection

    Diffusion Model for Object Detection 一种用于目标检测的扩散模型 Motivation 1 如何使用一种更简单的方法代替可查询的object queries 2 Bounding box的生成方式过去是三
  • ChatGPT:通用人工智能设计范式方法

    通用人工智能设计范式未来发展方向 https openai com https riscv org 一 ChatGPT xff08 AIGC xff09 开启通用人工智能AGI新纪元时代 二 通用人工智能设计范式现状和方法 目前随着Chat
  • 格拉布斯法—异常值判断(异常值)

    数值数据类型 xff1a 方法一 xff1a Z Score 方法二 xff1a DBSCAN 方法三 xff1a Lsolation Forest 方法四 xff1a Mahalanobis距离 xff08 主要解决多元离散群点问题 xf
  • 神经网络的过去、现状、未来!

    从BP CNN RNN DCN GAN GNN图网络 GCN CAP三维卷积胶囊模型及融合 人工神经网络是计算智能和机器学习研究的最活跃的分支之一 xff0c 它是从人脑的生理结构出发探讨人类智能活动的机理 从 1943年 McCulloc
  • 目标检测发展方向(1)

    从目标检测发展到目标追踪 目标检测 xff08 监督学习 xff09 FasterRCNN CascadeRCNN YOLOX Complex YOLO SSD RetinaNet xff0c FOCS ATSS CornerNet Cen
  • 车道线检测与分割

    https github com amusi awesome lane detection VPGNet论文 xff1a https arxiv org abs 1710 06288 caffe 版code xff1a https gith
  • Android实战开发--底部导航(Fragment)篇

    安卓实战开发之底部导航 提示 xff1a 本篇文中对基本的操作不做细节讲解 xff0c 后续会通过链接方式跳转到对应的知识点 文章目录 安卓实战开发之底部导航前言一 准备1 矢量图标准备2 文件准备 二 使用步骤1 在fragment中动态
  • android N进程启动流程(一)(捕获输入事件、准备创建activity、焦点切换)

    android N进程启动流程 一 捕获输入事件 准备创建activity 焦点切换 1 背景 本文主要针对event log中各处节点进行进程启动流程分析 span class token comment 此处使用的是adb指令input
  • 目标检测类前言知识

    1 PASCAL数据集 有关目标检测 xff0c 目标分类 xff0c 目标分割 xff0c 动作识别 1 xff09 下载的数据集文件介绍 标注信息 xff1a xml文件实例 xff1a lt segmented gt 1 被分割 0
  • 最新网狐荣耀版整理、编译和搭建教程

    一 安装visual studio 2015 xff0c 在百度就能搜索到下载地址 xff0c 在教程最后 xff0c 会给大家包括所有工具在内的集成包 因为visual studio 2015体积比较大 xff0c 而且安装过程很漫长 x
  • windows efi分区修复

    在windows下一阵瞎搞 xff0c 把efi分区的efi标识搞没了 xff0c 导致deepin无法识别efi分区 xff0c update grub2命令失败 其实windows也找不到efi标识了 xff0c 但没有影响启动 因为W
  • XML 根级别上的数据无效。 行 1,位置 1

    上午 xff1a 将XML数据保持到数据中 xff0c 从数据库提取XML 顺利通过 下午 xff1a 一键还原电脑 xff0c 重新打开VS2010运行程序 xff0c 从数据库提取XML报错 根级别上的数据无效 行 1 xff0c 位置
  • 接触客户、接触业务、来谈我的感触

    很久没有做工作总结 xff0c 今天记录下我今年接触客户的一些感触 以前是一个刚入门的开发新人 xff0c 刚进公司感觉公司的开发能力不行 xff0c 没有一套成熟的框架 xff0c 没有美工 xff0c 已经开发出的软件界面很丑 自己开发
  • 编写一个函数,判断用户传入的对象(字符串,列表,元组)长度是否大于10

    span class token keyword def span span class token function my object span span class token punctuation span n span clas
  • 双盘(一个固态硬盘+机械硬盘(efi格式)+2080TI) 安装: ubuntu16.04+显卡驱动+cuda10.2+pytorch

    详细步骤 xff1a 从零开始配一个深度学习服务器 xff1a 固态 43 机械双硬盘ubuntu系统的安装 分区 配置超详细教程 it610 com 一 系统安装 Ubuntu6 04安装 UEFI 43 GPT双硬盘安装Win10 43
  • Idea java.lang.ClassNotFoundException: org.slf4j.LoggerFactory 报错

    系统想用slf4j记录日志 xff0c 可是程序编译的时候报错 xff1a java lang ClassNotFoundException org slf4j LoggerFactory 检查了POM依赖和Jar包 xff0c 都没有问题
  • 小米2020校招软件开发工程师笔试题一

    1 下列关于设计模式说法错误的是 xff08 B xff09 A 装饰器模式在实现过程中一般不会更改被封装对象的接口定义 B 适配器模式以不改变被适配对象的接口定义为目的对其进行改造 C 用饿汉方式实现的单例模式是不能够被继承的 D 简单工
  • vscode1.70.2 添加终端 powershell7

    前提已经安装号powershell7 xff0c 并且已经添加到系统环境中 如何测试是否配置成功呢 xff0c 在运行中输入pwsh xff0c 点击确定后能打开powershell7就说明成功了 打开vscode的设置 xff0c 搜索
  • twm配置文件.twmrc

    系统的twmrc文件位于 usr X11 twm目录下 xff0c 为system twmrc xff0c 但是修改这个文件是不生效的 xff0c 必须将这个文件拷到 HOME下 xff0c 重命名为 twmrc才生效 twm有一个特别奇怪

随机推荐

  • Redis缓存型数据库实现秒杀库存加减

    多线程并发下商品库存递减或者抢购商品数量累加 xff0c 可以使用increment 方法 通常使用异步的方式 xff0c 前端 61 gt 用户抢购处理 61 gt 缓存 61 gt 队列 61 gt 持久化 xff0c 可以使用入队列的
  • Java项目:医院住院管理系统(java+SSM+JSP+bootstrap+mysql)

    源码获取 xff1a 俺的博客首页 34 资源 34 里下载 xff01 项目介绍 本项目有多种角色 xff0c 包含管理员 用户 护士 服务前台等角色 由于篇幅限制 xff0c 只截图了管理员角色的功能 管理员角色主要功能包括 xff1a
  • 直接使用X11输出图像的方法

    直接使用X11输出图像有两种方法 xff0c 一种是使用XImage xff0c 另一种是使用Pixmap XImage是本地对象 xff0c 而Pixmap是XServer端对象 特别要注意的是X11中Bitmap是黑白位图的意思 xff
  • python文件读写的缓冲行为

    文件的io操作的缓冲行为分为 全缓冲 xff1a 同系统及磁盘块大小有关 xff0c n个字节后执行一次写入操作 行缓冲 xff1a 遇到换行符执行一次写操作 无缓冲 xff1a 立刻执行写操作 open 函数 help open Help
  • 在Linux中使用systemctl如何管理Systemd服务和单元

    Systemctl是一个systemd工具 xff0c 它负责控制systemd系统和服务管理程序 Systemd是一个系统管理守护进程 xff0c 工具和库的集合 xff0c 它用作替换System V init守护进程 Systemd功
  • iOS中的viewpager,开源库WMPageController在storyboard中的使用

    http blog csdn net yubo 725 article details 51159633 关于WMPageController的使用以上链接写的很清楚 xff0c 在此感激博主 android 中有viewpager xff
  • 约瑟夫环问题研究(一)

    最近在看C方面的东西 xff0c 看到了李明老师讲解的约瑟夫环问题 xff0c 感觉很有意思 xff0c 于是在看了他的讲解之后 xff0c 自己又重新按照他的思路进行了编写 xff0c 整理如下 xff1a 问题描述 xff1a 约瑟夫环
  • HDOJ 题目2050 折线分割平面(递推)

    折线分割平面 Time Limit 2000 1000 MS Java Others Memory Limit 65536 32768 K Java Others Total Submission s 16441 Accepted Subm
  • HPUOJ 题目1079 假币问题(三分)

    1079 假币问题 时间限制 1 Sec 内存限制 128 MB 提交 7 解决 1 提交 状态 讨论版 题目描述 居然有假币 xff01 xff01 xff01 事情是这样的 xff0c 现在猪肉涨了 xff0c 但是农民的工资却不见涨啊
  • HPUoj 题目1019 【C语言训练】尼科彻斯定理(水题,数学)

    1019 C语言训练 尼科彻斯定理 时间限制 1 Sec 内存限制 128 MB 提交 9 解决 5 提交 状态 讨论版 题目描述 验证尼科彻斯定理 xff0c 即 xff1a 任何一个正整数的立方都可以写成一串连续奇数的和 输入 任一正整
  • POJ 题目1105 S-Trees(二叉树模拟)

    S Trees Time Limit 1000MS Memory Limit 10000KTotal Submissions 1499 Accepted 807 Description A Strange Tree S tree over
  • FOJ 题目 2075 Substring (后缀数组求出现k次的最小字典序子串)

    Problem 2075 Substring Accept 70 Submit 236 Time Limit 1000 mSec Memory Limit 65536 KB Problem Description Given a strin
  • 认识onNewIntent

    前几天面试被问到onNewIntent 我竟哑口无言 完全没听过这个东西 xff0c 所以总结经验教训 xff0c 多学习吧 一个简单的例子说明 xff1a activityA 启动activityB 并通过intent传递了一些数据 xf
  • 操作系统——作业

    写在前头 xff1a 这是小鱼上的网课整理来的笔记 xff0c 希望可以帮助大家更好的理解操作系统这门课 xff01 一 作业 这一讲 xff0c 我们来介绍作业的概念 我们需要从两个方面去理解作业 1 用户 我们可以先看看下面的图示的编译
  • 手把手教学在Springboot中搭建使用Guava cache,包教包会,不会我输一包辣条给你

    guava cache使用简介 概述 缓存是日常开发中经常应用到的一种技术手段 xff0c 合理的利用缓存可以极大的改善应用程序的性能 Guava官方对Cache的描述连接 缓存在各种各样的用例中非常有用 例如 xff0c 当计算或检索值很
  • Ubuntu使用Glmark2进行跑分

    Ubuntu使用Glmark2进行跑分 Glmark2 是一个基于 OpenGL 2 0 和 OpenGL ES 2 0 开发的benchmark程序 xff0c 主要用于对GPU的基准测试 安装和运行 Glmark2 安装依赖的开发工具
  • Ubuntu 22.04 安装Fcitx5中文输入法

    Ubuntu 22 04 安装Fcitx5中文输入法 一 检查系统中文环境 在 Ubuntu 设置中打开 区域与语言 管理已安装的语言 xff0c 然后会自动检查已安装语言是否完整 若不完整 xff0c 根据提示安装即可 二 安装Fcitx
  • AHU 2022 CTF新生赛web_writeup

    第一次当出题人 xff0c 给新生做的 xff0c 简简单单啦 按不了的F12 启动靶机 xff1a 根据题目名称可知 xff0c 这题与f12按键有关 xff0c 即查看网页源代码 按下f12发现f12按键被禁用 xff1a 尝试另一种方
  • 基于OpenAI实现的个人助理

    基于OpenAI实现的个人助理 最近OpenAI所开发的ChatGPT非常火 xff0c 于是我也去体验了一下 在玩过之余 xff0c 就想着能不能把它移植到系统环境 xff0c 成为一个日常的个人助理 xff0c 帮助我解决学习 开发或者
  • 基于OpenAI的Chatbot开发记录

    Chatbot 开发记录 最近ChatGPT非常火 xff0c 去体验之后确实有被惊艳到 xff0c 也对OpenAI上的人工智能模型比较感兴趣 xff0c 于是想着复刻一个ChatGPT xff0c 利用官方提供的包和api xff0c