当我想用ChatGPT-Next-Web来套壳Azure OpenAI Service时

使用Cloudflare worker来代理Azure OpenAI API, 并将其转换为兼容OpenAI的API

一直没能搞定OpenAI的订阅, 就因为没有搞定国外的信用卡, 所以就一直使用GPT-3.5来处理日常的文字生成工作, 例如写文档, 生成一些简单的脚本和程序代码以及帮助review代码。 偶尔会通过Azure 的 AI Studio来调用gpt-4的模型, 总觉得对话内容和3.5差不多, 最近公司有想做职能文档助理或者职能技术支持的功能, 为了能灌入一些知识库的内容, 不得不去Azure上弄一下Customized Model, 由于Azure的Portal有些慢, 所以想到了目前比较流行的ChatGPT Web UI, 也就是本文要说的ChatGPT-Next-Web.

搞定ChatGPT-Next-Web

这个比较简单, 使用Docker的话, 真的就是一行命令, 不过, 问题是, 我发现它对Azure OpenAI API支持等于零, 所以, 在搞定这个之前, 还得想个曲线救国的办法, 于是, 我想到, 要不我自己用Python来做一个API Wrap, 于是, 我开始准备卷。。。

但是, 懒虫如我, 怎么可能就这么轻易得开始自己写代码? 或者, 我还会写代码吗? 自从用了这些AI工具后, 我的大脑就一直处于躺平状态, 于是, 找到了这个

GitHub - hbsgithub/deno-azure-openai-proxy: One-click deploy! Free to use, no server required. A…

One-click deploy! Free to use, no server required. A Deno Deploy script to proxy OpenAI's request to Azure OpenAI…

github.com

和这个

GitHub - haibbo/cf-openai-azure-proxy: A Cloudflare worker script to proxy OpenAI's request to…

A Cloudflare worker script to proxy OpenAI's request to Azure OpenAI Service - haibbo/cf-openai-azure-proxy

github.com

因为我有在使用cloudflare, 所以我决定试一试Cloudflare worker来代理Azure OpenAI API, 并将其转换为兼容OpenAI API格式。

Cloudflare Work 运行 cf-openai-azure-proxy

这个proxy代码真的很简单, 就一个js文件, copy到Cloudflare的worker里就好, 这是具体的步骤

新建一个worker application

登录到Cloudflare dashboard, 在左边的菜单上进入Workers & Pages, 并从右上角点击 Create application, 并且进入Worker界面后, Create Worder。

创建一个新的Worker Application

创建一个worker

部署我们的Worker

接下来我们就可以部署一个新的worker, 为我们的worker取一个名字, 这里我称之为 “my-azure-openai-wrapper-01”

部署一个新的worker

这里, 我们不需要修改代码, 而是直接点 Deploy. 因为部署后, 我们就可以编辑代码了。

编辑Worker代码

编辑代码

到这步就可以选择 Edit code来编辑代码,我们将

https://raw.githubusercontent.com/haibbo/cf-openai-azure-proxy/main/cf-openai-azure-proxy.js

这里的代码Copy到代码框里。

红色框里的是需要修改的代码, 这里的信息, 我们可以在Azure Portal里找到。

修改 Worker 代码

进入到Azure Portal, 并搜索OpenAI, 这时候会跳出产品, 我们直接选择进入到Azure OpenAI

// The name of your Azure OpenAI Resource.
const resourceName="xx-openai-inst-1"

将代码中的 resourceName的值修改为你的Azure OpenAI的实例名称

然后进入到实例, 并部署我们要使用的模型

说实话, Azure Portal里的OpenAI Studio网页加载太慢了, 这也是为什么会有这篇文章的原因, 哈哈。

已经部署好的模型

这里就可以看到我们可以使用的模型了, 这里我们把代码中的mapper部分也改成我们的模型部署名称

// The deployment name you chose when you deployed the model.
const mapper = {
    'gpt-3.5-turbo': "general-gpt35-turbo-deployment-1",
    'gpt-3.5-turbo-0613': "general-gpt35-turbo-deployment-1",
//   'gpt-3.5-turbo-1106': DEPLOY_NAME_GPT35,
  // 'gpt-3.5-turbo-16k': DEPLOY_NAME_GPT35,
    'gpt-4': "general-gpt4-deployment-1",
    'gpt-4-0613': "general-gpt4-deployment-1",
  // 'gpt-4-1106-preview': DEPLOY_NAME_GPT4,
  // 'gpt-4-32k': DEPLOY_NAME_GPT4,
  // 'dall-e-3': typeof DEPLOY_NAME_DALLE3 !== 'undefined' ? DEPLOY_NAME_DALLE3 : "dalle3",
};

有些模型没有部署, 自然就不需要填写了, 我们这里先就使用这两个模型,

GPT-3.5和GPT-4,修改好就回到Cloudflare的网页上, 点Save and deploy.

完成Cloudflare Worker的部署

在截图的这两处都可以获取到我们刚刚设置的worker的URL

把这个URL记录下来, 我们接下来要在 ChatGPT-Next-Web里要用。

使用Docker部署和配置ChatGPT-Next-Web

为了简化部署的过程, 我们这里直接使用Docker compose来完成Web UI的部署和配置, 如果你的电脑上已经安装了Docker和Docker compose, 那么恭喜你, 不需要再做其他的工作, 我们直接创建一个文件夹, chatgpt-next-web, 然后新建一个文件名叫 docker-compose.yml

version: "3.9"
services:
  chatgpt-next-web:
    container_name: chatgpt-next-web
    image: yidadaa/chatgpt-next-web
    ports:
      - 18303:3000
    environment:
      - OPENAI_API_KEY=这里有个key哦
      - GOOGLE_API_KEY=$GOOGLE_API_KEY
      - CODE=这里可以存个admin密码哦
      - BASE_URL=https://my-azure-openai-wrapper-01.xxxxxxxx.workers.dev/
      - OPENAI_ORG_ID=这里是Azure OpenAI的订阅ID
      - HIDE_USER_API_KEY=$HIDE_USER_API_KEY
      - DISABLE_GPT4=$DISABLE_GPT4
      - ENABLE_BALANCE_QUERY=$ENABLE_BALANCE_QUERY
      - DISABLE_FAST_LINK=$DISABLE_FAST_LINK
      - OPENAI_SB=$OPENAI_SB

需要你修改的部分:

OPENAI_API_KEY
CODE
BASE_URL
OPENAI_ORG_ID

这些信息哪里找呢?

还记得之前要记录的URL么?

这个就是BASE_URL了。

首先 CODE 可以随便填, 这里是你登录到ChatGPT-Next-Web的密码, 我们就设置为 CHATGPT2024 好了, OPENAI_API_KEY, OPENAI_ORG_ID这两个可以在这里找, 首先 ORG_ID就是下图中的Subscription ID

然后在 Keys and Endpoint 里就可以看到 API_KEY了

一切就绪, 运行ChatGPT-Next-Web

docker compose up -d

然后打开浏览器, 进入 http://docker-host-ip:18303

这里docker-host-ip 就是你刚刚运行docker compose的那个电脑的ip, 通常我们做实验都是在本机做, 那么就使用 http://localhost:18303, 应该就可以看到

输入我们先前设置的CODE, CHATGPT2024 ,然后在OpenAI API Key输入我们之前在Azure 里copy来的API_KEY, 为什么这里还要输入, 我也不是很清楚, 明明我们在环境变量里已经配置了, 还望知道的朋友告诉我。

进去后, 我们可以在输入框上方选择一个模型, 这里我选择GPT-4

大功告成。 希望大家喜欢这个教程, 如果有问题, 也欢迎在下方留言探讨。

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

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

相关文章

python网络相册设计与实现flask-django-nodejs-php

此系统设计主要采用的是python语言来进行开发,采用django框架技术,框架分为三层,分别是控制层Controller,业务处理层Service,持久层dao,能够采用多层次管理开发,对于各个模块设计制作有一定的安…

前端学习笔记 | AJAX

一、axios 是什么:AJAX是异步的JavaScript和XML。它可以在不重新刷新页面的情况下与服务器通信,交换数据,或更新页面。 概念:AJAX是浏览器与服务器进行数据通信的技术。 1、使用axios库与服务器进行数据通信 (1&#x…

skywalking监听apisix

一、原理 Skywalking结合OpenTelemetry Collector Apisix的promethus插件实现对apisix metrics数据的收集。 二、数据流图 1. Apisix Promethus插件从Apisix收集指标数据。 2. OpenTelemetry Collector通过promethus receiver获取来自Apisix Promethus插件的指标数据&#…

Codeforces Round 498 (Div. 3)

目录 A. Adjacent Replacements B. Polycarps Practice C. Three Parts of the Array D. Two Strings Swaps E. Military Problem F. Xor-Paths A. Adjacent Replacements 简单思维题 每一个数都变成第一个小于等于自己的的奇数 void solve(){cin>>n;while(n--){…

现在阿里云云服务器租用多少钱?一张表,报价单

2024年阿里云服务器优惠价格表,一张表整理阿里云服务器最新报价,阿里云服务器网整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单,大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新的云服务器优惠券…

c++核心学习5

4.6继承 有些类与类之间存在特殊的关系,例如下图中: 我们发现,定义这些类时,下级别的成员除了拥有上一级的共性,还有自己的特性。这个时候我们就可以考虑利用继承的技术,减少重复代码 4.6.1继承的基本语法…

Nature:“量子龙卷风”首次模拟黑洞

科学家们在超流体氦气中首次创造出了一个巨大的“量子漩涡”(quantum vortex),用以模拟黑洞。这一成就不仅使他们能够更加细致地观察模拟黑洞的行为,还能探究其与周围环境的交互作用。 诺丁汉大学的研究团队与伦敦国王学院和纽卡斯…

酷开会员 |酷开科技通过酷开系统让内容和用户完成适配

互联网大屏电视的趋势早有,从智能电视发行时就已见苗头,不过随着各大厂商在技术上的不断革新、模式上的不断突进,OTT模式给电视机行业带来了新一轮的风口。不论是什么企业或者行业,想要提升整体的效益,从效益层面来讲&…

后端程序员入门react笔记(九)- react 插件使用

setState setState引起的react的状态是异步的。操作完毕setState之后如果直接取值,可能取不到最新的值,我们举个例子console.log(this.state.num)打印的值,总是上一次的值而不是最新的。 import React, {Component} from react; class Ap…

[linux][调度] 内核抢占入门 —— 线程调度次数与 CONFIG_PREEMPTION

在工作中,如果你正在做开发的工作,正在在写代码,这个时候测试同事在测试过程中测出了问题,需要你来定位解决,那么你就应该先暂停写代码的工作,转而来定位解决测试的问题;如果你正在定位测试的问…

瑞_23种设计模式_状态模式

文章目录 1 状态模式(State Pattern)1.1 介绍1.2 概述1.3 状态模式的结构1.4 状态模式的优缺点1.5 状态模式的使用场景 2 案例一2.1 需求2.2 代码实现(未使用状态模式)2.3 代码实现(状态模式) 3 案例二3.1 …

数据中台:如何构建企业核心竞争力_光点科技

在当今信息化快速发展的商业环境下,“数据中台”已经成为构建企业核心竞争力的关键步骤。数据中台不仅是数据集成与管理的平台,更是企业智能化转型的加速器。本文将深入探讨数据中台的定义、特点、构建方法及其在企业中的作用。 数据中台的定义 数据中台…

基于python+vue的stone音乐播放器的设计与实现flask-django-php-nodejs

随着我国经济的高速发展与人们生活水平的日益提高,人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下,人们更趋向于足不出户解决生活上的问题,stone音乐播放器展现了其蓬勃生命力和广阔的前景。与此同时,为解决用…

2024年通信工程专业-毕业论文

2024年毕业设计-通信专业VoLTE掉话分析资源-CSDN文库 毕业设计 ----移动通信中VoLTE信令流程分析 学生姓名 专业班级 学 号 指导教师 完成时间 …

人像抠图HumanSeg——基于大规模电话会议视频数据集的连接感知人像分割

前言 人像抠图将图像中的人物与背景进行像素级别的区分的技术。通过人像分割,可以实现诸如背景虚化、弹幕穿人等各种有趣的功能,为视频通话和影音观看提供更加优质和丰富的体验。由于广泛部署到Web、手机和边缘设备,肖像分割在兼顾分割精度的…

Meta 推出SceneScript,一种全新的3D场景重建方式

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

微服务day05(上) - Elasticsearch

1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 例如: 在GitHub搜索代码 在电商网站搜索商品 在百度搜索答案 在打车软件搜索附近的…

单机模拟分布式MINIO(阿里云)

拉取的最新MINIO: minio version RELEASE.2024-03-15T01-07-19Z Runtime: go1.21.8 linux/amd64 分布式 MinIO 至少需要4个节点,也就意味着至少4个硬盘,对于囊中羞涩仅用来开发测试的人来说,这笔花销还是比较高昂。有没有更好的…

Mybatis中显示插入数据成功,但在数据库中却没有显示插入的数据

1、在mybatis-config.xml中查看是否添加了JDBC,并引入了映射文件 2、在测试文件中,结尾是否添加提交事务:sqlSession.commit() 添加了这一步就能够将数据提交到数据库中,最后再关闭事务:sqlSession.close() * 如果运…

css的active事件在手机端不生效的解决方法

需求:需求就是实现点击图中的 “抽奖” 按钮,实现一个按钮Q弹的放大缩小动画 上面是实现的效果,pc端,点击触发 :active 问题:但是这种方式在模拟器上可以,真机H5一调试就没生效了,下面是简单…