Ex-ChatGPT本地部署+Azure OpenAI接口配置+docker部署服务

2023/12/4 22:11:00

Ex-ChatGPT项目分为 Ex-ChatGPT 和 WebChatGPTEnhance 两部分,Ex-ChatGPT启动后是个web服务,通过访问ip+端口体验; WebChatGPTEnhance可编译生成一个浏览器插件,Chrome或者Microsoft edge浏览器可以安装该插件,点击该插件可以直接跳转到chatGPT的聊天页面,相比于官方chatGPT页面,底部多了个web access,即实现网络资料搜索,不仅限于ChatGPT的回答,类似于新必应。
截止2023年5月29日, Ex-ChatGPT实现的第三方api请求比WebChatGPTEnhance 更多,功能更强,侧重研究Ex-ChatGPT即可。

本地试验环境:
windows 10
服务器环境:
Ubuntu
Ex-ChatGPT项目源代码
https://github.com/circlestarzero/EX-chatGPT

一、本地部署

首先将代码clone到本地设备:

git clone https://github.com/circlestarzero/EX-chatGPT.git

以下步骤参考了博客:
https://www.luoxiao123.cn/enhanced-ex-chat-gpt-local-build-tutorial.html
有不明白的可以试着看以上博客查找答案。

1.1 Ex-chatGPT 安装

本人使用python3.11.3, 安装该项目的python模块依赖:

pip install -r requirements.txt -i -i https://pypi.tuna.tsinghua.edu.cn/simple

1.1.1 ID和KEY申请

谷歌api key申请

要翻墙
Google api key and search engine id 申请
得到如下SEARCH_ENGINE_ID:
在这里插入图片描述
以及GOOGLE_API_KEY:
在这里插入图片描述
在这里插入图片描述

wolframAlpha key申请

wolframAlpha app id key 申请

openAI key 申请

要翻墙
openAI api key( 新功能 ) 或 chatGPT access_token ( 旧版本 ) [申请](https://platform.openai.com/)

1.1.2 API key配置

将.\EX-chatGPT\chatGPTEx\apikey.ini.example复制一份,重命名成apikey.ini,修改其中的配置:
在这里插入图片描述

1.1.3 运行访问

首先谷歌和openAI的接口都需要翻墙才能访问,所以要确保你的梯子在本地开了全局模式,保证执行下面的代码时能通过代理访问到外网。

执行 .\EX-chatGPT\chatGPTEx\main.py :

python main.py

在本地浏览器打开 http://127.0.0.1:1234/,即打开Ex-ChatGPT的窗口,:
在这里插入图片描述
上图下方文字输入框左侧有个模式选择上拉框,鼠标移到选项中文字就会显示出来(显示有bug),这里讲一下其中主要的两个模式:
web模式:
当你输入一个问题,比如数学问题:请计算1+5等于多少?,该工具首先会调用chatGPT进行问题理解,然后生成谷歌接口、wolframAlpha接口、wiki接口、chatGPT分别进行查询,4个接口得到的结果会返回到窗口进行一一展示。
chat模式:
和上面同样的问题,只会查询chatGPT接口,返回结果的速度较快,但是由于chatGPT的信息较为落后,比如基于gpt3.5的chatGPT,其信息是2021年9月之前的,结果不如web模式全面和时效。

1.2 WebChatGPTEnhance安装

注意:
https://github.com/circlestarzero/EX-chatGPT.git下.\EX-chatGPT\chatGPTChromeEnhance的代码是fork别人的代码,而且不完整(少了build目录),无法使用,本人找到了其fork的源代码库:

git clone https://github.com/qunash/chatgpt-advanced.git

1.2.1 VC++编译环境配置

在进行下一步之前,首先得安装VC++,否则会报错,visualstudio下载链接,选择
https://visualstudio.microsoft.com/zh-hans/downloads/
在这里插入图片描述
选择如上版本即可,在安装界面,选择.NET桌面开发、Node.js开发、C++桌面开发即可,其他勾都取消掉:
在这里插入图片描述
安装重启后应该就可以用npm和node命令了,如果不行,则可能没有自动添加命令路径到系统环境变量,那么你得找到node.exe所在路径,添加到系统环境变量,npm同理。

1.2.2 插件生成和使用

接下来编译生成插件包:

cd .\chatgpt-advanced\
npm install
npm run build-prod 

之后在目录\chatgpt-advanced\bulid内会有个插件包,将包安装到chrome或edge浏览器即可:
在这里插入图片描述

二、Azure OpenAI服务配置

本公司购买了微软的Azure OpenAI接口服务,可以不用翻墙,通过Azure OpenAI接口访问到chatGPT;Ex-chatGPT默认是使用原生的openAI接口调用。下面从用openai模块访问chatgpt的方式来说明一下原openAI接口和Azure OpenAI接口的不同,如下图所示:
在这里插入图片描述
在Ex-chatGPT中并没有用到openai模块访问chatgpt,而是用requests模块访问chatgpt,当访问chatGPT的请求到了后,会执行到.\EX-chatGPT\chatGPTEx\optimizeOpenAI.py代码中的ask_stream函数,发起chatgpt接口请求,其中请求部分的代码为:

...
        response = self.session.post(
            "https://api.openai.com/v1/chat/completions",
            headers={
                "Authorization": f"Bearer {kwargs.get('api_key', apiKey)}"
            },
            json={
                "model": self.engine,
                "messages": self.conversation[convo_id],
                "stream": True,
                # kwargs
                "temperature": kwargs.get("temperature", self.temperature),
                "top_p": kwargs.get("top_p", self.top_p),
                "n": kwargs.get("n", self.reply_count),
                "user": role,
            },
            stream=True
        )
...

由以上代码可见,默认用了"https://api.openai.com/v1/chat/completions"这个原生的openai接口,这里本人修改这部分代码,使其默认访问Azure openai的接口去请求chatgpt,修改代码如下:
在这里插入图片描述
修改后的代码中url和api-key都是写死的,没有用到apikey.ini文件内有关opneAI的key,这样所有chatgpt的请求都会走Azure openai的接口了,不再需要翻墙。上图修改后代码的url规则参考官网进行更改:
https://learn.microsoft.com/zh-cn/azure/cognitive-services/openai/reference
在这里插入图片描述

三、Docker部署服务

任务是部署一个公司内网的员工都可以访问的Ex-chatGPT,由于很多员工都没有翻墙梯子,所以要如第二节一样,配置Ex-chatGPT通过Azure Openai的服务接口访问chatgpt。

3.1 启动一个原生的容器

登录目标服务器进行如下操作:
创建配置文件目录并拉取配置文件

cd /data/ml/crl/
mkdir config && wget https://raw.githubusercontent.com/circlestarzero/EX-chatGPT/main/chatGPTEx/apikey.ini.example -O ./config/apikey.ini

编辑配置文件或者把编辑好的配置文件传到config文件夹下。

vim ./config/apikey.ini

拉取docker镜像

docker pull 0nlylty/exchatgpt:latest

创建容器

docker run -dit \
  -v /data/ml/crl/config:/config \
  -p 5100:5000 \
  --name exchatgpt \
  --restart unless-stopped \
 0nlylty/exchatgpt:latest

注意以上5100接口是宿主机服务器的接口,要自行找个未被占用的接口。容器启动后,找到这个容器的id, 然后进入容器中:

docker exec -it 57de2cbe08bb /bin/bash

切换到目录中/app/chatGPTEx,删除代码文件optimizeOpenAI.py:

root@57de2cbe08bb:/app/chatGPTEx# pwd
/app/chatGPTEx
root@57de2cbe08bb:/app/chatGPTEx# rm optimizeOpenAI.py

3.2 本地修改optimizeOpenAI.py

在本地电脑,按照第二节方法修改optimizeOpenAI.py,然后将本地修改后的optimizeOpenAI.py传到服务器上面,如传到服务器目录:/data/ml/crl/chatGPTEx/optimizeOpenAI.py。
最后在服务器上,将已修改的/data/ml/crl/chatGPTEx/optimizeOpenAI.py传到上小节已启动的容器中:

docker cp /data/ml/crl/chatGPTEx/optimizeOpenAI.py 57de2cbe08bb:/app/chatGPTEx

3.3 用修改后的容器生成新版镜像

经过上小节,容器中/app/chatGPTEx/optimizeOpenAI.py已经是修改过后的,访问chatGPT时,走的是Azure OpenAI接口,不再需要翻墙。将此修改后的容器生成一版新的镜像:

docker commit  57de2cbe08bb 0nlylty/exchatgpt:v1.0.0

之后就不再需要57de2cbe08bb这个容器了,将其杀死和删除:

docker kill 57de2cbe08bb
docker rm 57de2cbe08bb

3.4 用新镜像启动新容器

用上小节生成的新版镜像0nlylty/exchatgpt:v1.0.0,启动服务:

docker run -dit  -v /data/ml/crl/config:/config  -p 5100:5000  --name exchatgpt  --restart unless-stopped  0nlylty/exchatgpt:v1.0.0

启动服务后,就可在本地访问Ex-ChatGPT了,能够访问服务器的其他员工也可以访问到该Ex-ChatGPT服务:
在这里插入图片描述


http://www.jnnr.cn/a/488067.html

相关文章

API接口对接的流程和注意的事项

API接口对接是将两个应用程序或系统连接并进行数据交换的过程。在进行API接口对接时,需要确保两个系统具有相同的协议和格式,并且数据传输过程中不会出现错误或数据丢失。下面是API接口对接的流程和注意事项: 流程: 1.确认数据格…

oracle--常用维护语句

1、sqlpus 连接 [rootdb-server ~]$su - oracle ##切换oracle用户 [oracledb-server ~]$ sqlplus /nolog ##启动客户端进程 SQL>conn zyl/zyl2022 ##普通用户登录 SQL>conn / as sysdba ##管理员登录 Connected. SQL> 2、启动或关闭数据库 SQL>startup…

共享电单车RFID停车技术分析

近段时间,某地主城区运营商信号基站受严重干扰,造成300多个基站,超过5万的用户受到影响。据无线电监测站的调查确认干扰源来自共享电单车,是共享电单车加装的RFID停车标签惹的祸,而该地区RFID终端选用的是超高频&#…

chatgpt赋能python:Python中如何对文本进行修改

Python中如何对文本进行修改 在Python编程中,涉及到文本操作的场合并不少见。我们可能需要读取文件、解析HTML网页、处理字符串等等。而在对文本进行操作的过程中,修改文本是非常常见的需求。本文将介绍Python中对文本进行修改的几种基本方法。 1. 字符…

基于C++的网盘系统项目开发教程

项目资源下载 基于C的网盘系统项目源码CSDN下载地址基于C的网盘系统项目源码GitHub下载地址 项目简介 本项目基于C开发,整个项目采用C/S架构,使用Sqlite3数据库存储用户信息,本地磁盘存储用户文件,使用Socket进行客户端和服务器之…

下载YouTube视频的一种方法

文章目录 工具名称下载方法使用方法1.只下载音频2.下载音频转换成mp3(加上-x –audio-format参数)3.下载视频(带音频)ID:22 | EXT:mp4 | 1280*720 下载的数据集:YouCook2 工具名称 yt-dlp 下载…

1.MySQL安装与配置

1.MySQL安装与配置 📤1 数据库介绍📤🚪1.1关于MySQL主要要学啥🚪 ✉️2 MySQL服务器安装✉️📄2.1 Windows绿色安装📄📑2.2 Windows中重装MySQL📑 📨3 Mac中常见的安装问…

python的统计函数库scipy.stats是一个很棒的统计包

描述:在Scipy的模块中,有一个统计的木块——States,其中函数有描述统计(describe)、峰度(kurtosis)、偏度(skew)、众数(mode)、n阶矩。 分布:还有一些分布函数,正泰分布(norm)、对数正态分布(lognorm)、…… 计算:针…

格式化输出Printf总结说明

一,简介 在C语言运行调试过程中,需要使用printf进行打印log信息,本文主要介绍常用的printf打印格式信息,方便提高调试的效率。 二,Printf转换说明 printf函数的转换说明由字符%和跟随其后的最多5个不同的选项构成&a…

STM32基本外设超详细44000字教程

GPIO GPIO(General Purpose Input Output)通用输入输出口可配置为8种输入输出模式引脚电平:0V~3.3V,部分引脚可容忍5V输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等输入模式下可…

优化版本 穿越火线(CF) FPS AI 自瞄 代码 权重 数据集(下面有链接)

更新初衷 本人在制作过程中,有一些爱钻研的朋友来问以及提出增加一些新的功能点回会更好,本着学习研究态度,在第一个版本上进行优化,增加一些内容 不喜欢看过程的小伙伴直接看最下面 界面 解决问题: 1、进入慢 2、无…

代码随想录算法训练营第四十六天 | 力扣 139.单词拆分

139.单词拆分 题目 139. 单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 解析 1.确定dp数组以及下标的含义 …

Web 应用程序防火墙 (WAF) 相关知识介绍

Web应用程序防火墙 (WAF) 如何工作? Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称:WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执…

小兔鲜--项目总结 2

目录 登录-表单校验实现 表单如何进行校验 表单校验步骤 自定义校验规则 整个表单的内容验证 登录-基础登录业务实现 登录业务流程 Pinia管理用户数据 如何使用Pinia管理数据 关键代码总结 登录-Pinia用户数据持久化 持久化用户数据说明 ​编辑关键步骤总结和插件运行机…

并发编程 原子性 可见性 有序性

并发编程的三个重要特性 原子性所谓原子性是指在一次的操作或者多次操作中,要么所有的操作全部都得到了执行并且不会受到任何因素的干扰而中断,要么所有的操作都不执行。可见性可见性是指,当一个线程对共享变量进行了修改,那么另…

chatgpt赋能python:Python中的//2

Python中的//2 Python是一种广泛使用的动态编程语言,因为它功能强大,易于学习和使用。Python在每个程序员的工具包中占据重要位置,这是因为Python可以用于构建各种应用程序。 本文将讨论Python中的//2运算符,解释其作用和用法&a…

【LeetCode】《LeetCode 101》第九章:巧解数学问题

文章目录 9.1 公倍数与公因数9.2 质数204.计数质数(中等) 9.3 数字处理504. 七进制数(简单)172. 阶乘后的零(中等)415. 字符串相加(简单)326. 3 的幂(简单) 9…

快六一啦,学习CSS3实现一个冰淇淋动画特效

快六一啦,小时候顶多吃个小冰棍,或者是那种小冰袋,现在的小朋友真是好,动不动就能吃到冰淇淋,今天用CSS3实现一个冰淇淋的动画特效吧 目录 实现思路 桶身的实现 冰淇淋身体的实现 五彩颗粒的实现 HTML源码 CSS3源…

node.js+vue房屋租赁管理系统z0g8w

本系统主要包括以下功能模块:租户、出租人、房源信息、预约看房、合同信息等模块。 其中设计的主要功能如下: (1)用户的注册和登录本系统,登录到系统的首页。 (2)用户可以发布自己的房源信息…

React Native开发速记

文章目录 引子React Native适用场景React基础JSX 组件的定义基础APIFlex弹性布局例子: Flex布局实现多行多列 常用UI组件几个核心钩子函数useState用法useEffect典型用法 和原生模块交互调用原生模块方法 调试其它工具UI框架参考资源 引子 软件开发,移动优先&#…
最新文章