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

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服务:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/24900.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】如何实现单表查询?

在我们对数据进行操作时,查询无疑是至关重要的,查询操作灵活多变,我们可以根据开发的需求,设计高效的查询操作,把数据库中存储的数据展示给用户。 文章目录 前言1. 基础查询1.1 基础查询语法1.2 基础查询练习 2. 条件查…

数据库基础——5.运算符

这篇文章我们来讲一下SQL语句中的运算符操作。 说点题外话:SQL本质上也是一种计算机语言,和C,java一样的,只不过SQL是用来操作数据库的。在C,java中也有运算符,这两种语言中的运算符和数学中的运算符差距不…

crontab定时任务介绍

1 crontab概述 crontab是linux操作系统上用来设置定时任务的基础命令,是基于crond服务实现任务调度执行。 当安装完成操作系统后,默认会安装crond服务及其附属命令,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执…

还在用 JS 做节流吗?CSS 也可以防止按钮重复点击

目录 一、CSS 实现思路分析 二、CSS 动画的精准控制 三、CSS 实现的其他思路 四、总结一下 众所周知,函数节流(throttle)是 JS 中一个非常常见的优化手段,可以有效的避免函数过于频繁的执行。 举个例子:一个保存按…

11.PasswordEncoder详解与实战

security/day07 这节课我们开始讲PasswordEncoder,如果大家还有印象的话,我们前面有提到过PasswordEncoder: 为什么密码使用{noop}开头呢?我们也做出了相应的解释,这节课开始带大家真正的了解PasswordEncoder, PassworderEncoder…

哈夫曼树(Huffman)【数据结构】

目录 ​编辑 一、基本概念 二、哈夫曼树的构造算法 三、哈夫曼编码 假如<60分的同学占5%&#xff0c;60到70分的占15%…… 这里的百分数就是权。 此时&#xff0c;效率最高&#xff08;判断次数最少&#xff09;的树就是哈夫曼树。 一、基本概念 权&#xff08;we…

关于宝塔部署jar包和war包

文章目录 前言一、jar包部署二、war包部署1.maven如果打包不了使用命令打包2.安装Tomcat进行访问是否成功2.进入Tomcat目录进行配置war包 一、项目访问方法 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、jar包部署 1.其实jar包没什么讲的&…

使用nvm管理node多版本(安装、卸载nvm,配置环境变量,更换npm淘宝镜像)

目录 前言一、卸载node二、nvm是什么&#xff1f;三、nvm安装1. 官网下载 nvm 包2. 安装 nvm-setup.exe小tips 3. 配置路径和下载镜像4. 检查nvm是否安装完成 四、使用nvm安装node版本五、修改npm默认镜像源为淘宝镜像六、 环境变量配置1. 设置系统变量和用户变量的作用是什么呢…

【从零到Offer】- HashMap与HashSet

​ HashMap与HashSet是我们日常最常使用的两个集合类。在实现上&#xff0c;两者也有很大的相似性。HashSet基本就是对HashMap的一个简单包装。 ​ 为了更好的理解Hash结构的实现原理&#xff0c;从而更好的指导我们的代码使用&#xff0c;本文就主要对HashMap的实现及设计做分…

10 款最常用的Sketch在线插件!

Sketch 是一款高效、小巧的界面设计工具&#xff0c;在设计领域广受设计团队喜爱&#xff0c;帮助设计师创造了许多令人惊叹的作品。在使用 Sketch 时&#xff0c;辅助使用一些插件可以更高效地完成设计任务。Windows 也能用的「协作版 Sketch」即时设计&#xff0c;可作为网页…

《数据库应用系统实践》------ 校友会信息系统

系列文章 《数据库应用系统实践》------ 校友会信息系统 文章目录 系列文章一、需求分析1、系统背景2、 系统功能结构&#xff08;需包含功能结构框图和模块说明&#xff09;3&#xff0e;系统功能简介 二、概念模型设计1&#xff0e;基本要素&#xff08;符号介绍说明&#x…

Linux Kernel RTC驱动使用hwclock调试

hwclock hwclock的源码路径&#xff1a;sys-utils/hwclock.c 源码&#xff1a; if (opt & HWCLOCK_OPT_HCTOSYS)to_sys_clock(&rtcname, utc);else if (opt & HWCLOCK_OPT_SYSTOHC)from_sys_clock(&rtcname, utc);else if (opt & HWCLOCK_OPT_SYSTZ)set_…

Redis 的数据类型和命令帮助

文章结构 Redis 数据类型1. Redis全局命令&#xff08;跟key有关系&#xff0c;而跟value无关&#xff09;2. StringsGetting and setting StringsManaging counters 3. Lists(L)Basic commandsBlocking commands 4. Sets(S)Basic commands 5. Hashes(H)Basic commands 6. Sort…

软考A计划-试题模拟含答案解析-卷九

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

【WPF】数据绑定,资源字典

数据绑定 将数据与视图分开,创建MainViewModel .cs 作为数据源的处理 MainViewModel using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading…

机器学习基础知识之多模型性能对比评价方法

文章目录 1、交叉验证t检验2、Friedman检验与Nemenyi后续检验 在进行预测或分类对比实验时&#xff0c;通常需要比较两个或两个以上的模型性能&#xff0c;因此&#xff0c;下面将介绍两个常用的多模型性能对比评价方法&#xff0c;一种是交叉验证t检验&#xff0c;该方法主要用…

如何用二极管实现不同电压的输出?

利用二极管的单向导电性可以设计出好玩、实用的电路。本文分析限幅电路和钳位电路&#xff0c;是如何用二极管来实现的。 限幅电路 如下图所示&#xff0c;当在正半周期&#xff0c;并且VIN大于等于0.7V&#xff0c;二极管正向导通。此时&#xff0c;VOUT会被钳位在0.7V上。 …

Linux网络服务:PXE高效批量网络装机

目录 一、理论 1.PXE批量网络装机概述 2.搭建 PXE 远程安装服务器 3.实现Kickstart无人值守安装 二、实验 1.搭建PXE远程安装服务器 2.安装Kickstart无人值守安装 3.安装图形化界面 三、问题 1.please complete all spokes before continuing 提示 一、理论 1.PXE批…

供应链|供应商库存服务水平对零售商需求的影响

作者&#xff1a;Nathan Craig, Nicole DeHoratius, Ananth Raman 引用&#xff1a;Craig N, DeHoratius N, Raman A. The impact of supplier inventory service level on retailer demand[J]. Manufacturing & Service Operations Management, 2016, 18(4): 461-474. 文…

【JavaSE】Java基础语法(八)

文章目录 &#x1f353;1. 类和对象&#x1f379;&#x1f379;1.1 类和对象的关系&#x1f379;&#x1f379;1.2 类的定义 &#x1f353;2. 对象内存图&#x1f379;&#x1f379;2.1 单个对象内存图&#x1f379;&#x1f379;2.2 多个对象内存图2.3 多个对象指向相同内存图…