如何设计开放平台接口与集成chatgpt

如何设计开放平台接口与集成chatgpt

文章目录

  • 如何设计开放平台接口与集成chatgpt
  • 前言
  • 一、Token机制
    • 生成方式有哪些
    • session存在的问题
    • JWT如何解决session存在的问题
  • 二、AppId、AppSecret
    • AppId机制
    • 签名机制
  • 三 码上实现
    • 客户端
    • 注意
  • 源码地址
    • 配置

前言

前一段时间,突发奇想,趁着工作之余。从0开始搭建一套vue+springcloud的个人半成品作品。而其中集成chatgpt以及谷歌翻译对外提供服务访问访问使用到了开放接口方式访问,以此来记录
chatgpt

谷歌翻译
在正式设计开放平台前,先简单介绍下传统的Token机制做法。。

一、Token机制

Token机制,本质上就是一种身份验证机制。客户端登录成功后,服务器会生成一个令牌(也就是Token)颁发给客户端,之后客户端每次访问服务器都会携带这个令牌来表明自己的身份,从而进行用户身份验证

生成方式有哪些

  1. 基于对称加密算法
    通过对称加密算法加密用户信息,生成Token。这种方式的优点是加密解密速度快,缺点是安全性较低,容易被攻击者破解

  2. 基于非对称加密算法
    通过非对称加密算法生成公钥和私钥,使生成的Token更加安全可靠。私钥用于生成Token,公钥用于验证Token。这种方式的优点是安全性高,缺点是加密解密速度慢

  3. 基于JWT(JSON Web Token)
    JWT是一种基于JSON的标准,用于在网络上安全地传输认证和声明信息。它包含了成为了一个数字签名,以验证信息的完整性和来源。这种方式的优点是方便、安全、灵活。缺点是Token的体积较大、需要在每次请求中携带。

而笔者作品中sso使用的就是JWT(后期详细介绍)

session存在的问题

我们知道传统项目中一般用session进行验证,而session是存在服务端的,并且保存用户登录之后的信息,同时向客户端返回一个session_id保存在Cookie中,客户端每次访问都会携带Cookie中的session_id并与服务端匹配session,从而获得相应数据。
PS:笔者之前做过代理人审批功能。代理人登录后就保存在session中一个代理人key,如果审批中优先判断是否有代理人,有则代理人优先作为节点审批人,反之则正常审批

session这种方式最大的问题就是需要服务端保存数据,如果是跨域、集群访问,需要每台机器都同步session信息,而其中的代价和成本非常大

JWT如何解决session存在的问题

他只将数据记录在客户端,它会生成一种约定好的格式数据,然后服务端把这份数据发送给客户端,客户端之后每次请求带上这份数据,通过解析JWT对其进行验证

PS:关于JWT的详细分析与实战在后面的集成sso中进行详细说明

二、AppId、AppSecret

AppId机制

实际上appId可以看作登录的用户名,AppSecret看作密码,而其本质也是一种token机制。而一般做法就是根据AppId和AppSecret并按照一定的规则来生成一套签名,当请求方带着签名值去请求提供方时,提供方就会验证这个签名,只有验证通过才会继续处理

PS: AppId要全局唯一,AppSecret配对唯一

签名机制

它的作用主要有两个

  • 数据防篡改
    也就是数据在网络传输中防止被修改了,一般使用摘要算法(如MD5加密)对原数据与接口提供方加密后的数据进行比较,看是否一致

  • 身份防冒充
    一般使用非对称加密算法+密钥对方式。即先对数据进行非对称算法计算,在使用私钥加密。 而另一方先使用公钥解密,在使用非对称算法计算,最后进行比较

三 码上实现

有了前面的理论基础,不妨来实操一把。
需求: 服务端套壳chatgpt,直接调用openAI提供的接口。
客户端调用服务端提供的开放接口

客户端

不妨先从客户端开始

@RestController
@RequestMapping(value = "/api/client")
public class ClientController {@Value("${client.open.appId}")private String appId;@Value("${client.open.appSecret}")private String appSecret;@Value("${client.open.path}")private String path;@GetMapping(value = "/test/gpt")public Result<String> testGpt(String text) {JSONObject jsonObject = new JSONObject();jsonObject.put("model", "text-davinci-003");jsonObject.put("prompt", text);ResponseDTO responseDTO = null;try {responseDTO = OpenHttpUtil.post(appId, appSecret, path, jsonObject, new ArrayList<>(), null);if (responseDTO.getCode().equals(String.valueOf(SystemCodeEnum.K_000000))) {List<String> result = (List<String>) responseDTO.getData();return Result.success(result.toString());}return Result.fail(999,responseDTO.getMsg(),responseDTO.getData());} catch (IOException e) {e.printStackTrace();}return Result.success("success");}

其中appid、appSecret为每个客户端单独拥有,path为访问服务端开放平台接口,而核心就是
OpenHttpUtil.post(appId, appSecret, path, jsonObject, new ArrayList<>(), null);

public static ResponseDTO post(String appId, String appSecret, String url, Object param, String contentType, List<Header> headers, Map<String, Object> pathMap, Map<String, File> fileMap) throws IOException {RequestDTO requestDTO = initRequest(param);List<Header> headerList = initHeader(appId, appSecret, contentType, headers);return sendPost(url, requestDTO, contentType, headerList, pathMap, fileMap);}

这里我们只需要关注initHeader方法即可

    private static List<Header> initHeader(String appId, String appSecret, String contentType, List<Header> headers) {List<Header> headerList = new ArrayList();long curr = System.currentTimeMillis();String signStr = appSecret + appId + curr + appSecret;String sign = DigestUtils.md5Hex(signStr.getBytes());int nonce = new Random ().nextInt(100);headerList.add(new BasicHeader("appId", appId));headerList.add(new BasicHeader("sign", sign));headerList.add(new BasicHeader("timeStamp", String.valueOf(curr)));headerList.add(new BasicHeader("nonce", String.valueOf(nonce)));if (Objects.isNull(contentType)) {headerList.add(new BasicHeader("Content-Type", "application/json;charset=UTF-8"));} else if (StringUtils.isNotEmpty(contentType) && !contentType.contains("multipart/form-data")) {headerList.add(new BasicHeader("Content-Type", contentType));}if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(headers)) {headerList.addAll(headers);}return headerList;}

timestamp
该参数主要可以用来防止同一个请求参数被无限期的使用。
同时服务端也会根据该参数进行有效实践校验

  String timeStamp = request.getHeader("timeStamp");// 请求时间有效期校验long now = LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();if ((now - Long.parseLong(timeStamp)) / 1000 / 60 >= 5) {responseDTO.setCode(String.valueOf(SystemCodeEnum.K_400005));responseDTO.setMsg("请求过期!");return true;}

nonce
该参数主要避免避免接口重放攻击,即客户端随机生成一个数,同样的请求只能使用一次。服务端进行控制

       String nonce = request.getHeader("nonce");String str = (String) redisUtil.get(appId + "_" + nonce);if (StringUtils.isNotEmpty(str)) {responseDTO.setCode(String.valueOf(SystemCodeEnum.K_400005));responseDTO.setMsg("请求失效!");return true;}redisUtil.set(appId + "_" + nonce, "1", 180L);

sign
这里为了方便,直接先用组合再用摘要算法进行加密,服务端进行比较判断
客户端

        long curr = System.currentTimeMillis();String signStr = appSecret + appId + curr + appSecret;String sign = DigestUtils.md5Hex(signStr.getBytes());

服务端

String sign = request.getHeader("sign");String signStr = appSecret + appId + timeStamp + appSecret;String signServer = org.apache.commons.codec.digest.DigestUtils.md5Hex(signStr.getBytes());if (!signServer.equals(sign)) {responseDTO.setCode(String.valueOf(SystemCodeEnum.K_400001));responseDTO.setMsg("验签错误!");return true;}

如果以上开放接口都验证通过,我们在调特定的服务,如chatgot

 String chat = OpenAiUtil.sendChat(prompt, "user");

注意

  1. 为了方便直接放在map中判断appSecret是否存在
    实际中我们可以单独新建一张开放平台表,将数据预热到redis中,如
CREATE TABLE `sys_common_open_api` (`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',`gmt_create` datetime DEFAULT NULL COMMENT '创建时间',`creator_id` varchar(36) DEFAULT NULL COMMENT '创建人id',`creator_name` varchar(36) DEFAULT NULL COMMENT '创建人名称',`is_del` tinyint DEFAULT '0' COMMENT '是否删除 0:未删除 1:已删除',`app_id` varchar(1000) DEFAULT NULL COMMENT 'appId',`app_secret` varchar(1000) DEFAULT NULL COMMENT 'appSecret',`url` varchar(1000) DEFAULT NULL COMMENT 'url',`app_type` tinyint DEFAULT '0' COMMENT '注册的类型 0-翻译接口 1-chatgpt',PRIMARY KEY (`id`) USING BTREE,KEY `app_id` (`app_id`)
) COMMENT='通用自定义开放平台注册表';

服务端

        Map<Object, Object> appIdSecretMap = redisUtil.hmget("open_app");String appSecret = (String) appIdSecretMap.getOrDefault(appId, "");if (StringUtils.isEmpty(appSecret)) {responseDTO.setCode(String.valueOf(SystemCodeEnum.K_400002));responseDTO.setMsg("无接口访问权限!");return true;}
  1. 其它安全性校验
    我们也可以通过增加白名单、黑名单机制、限流、熔断、降级等进行安全性控制

源码地址

github

配置

  1. application.yml配上redis地址
  2. OpenAiUtil配上apiKey(chatgpt申请的key),
    需要注意国内不能直接连,需要用魔法代理或者直接部署在国外服务器上访问

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT研究(二)——ChatGPT助力跨模态AI生成应用

✏️写作&#xff1a;个人博客&#xff0c;InfoQ&#xff0c;掘金&#xff0c;知乎&#xff0c;CSDN &#x1f4e7;公众号&#xff1a;进击的Matrix &#x1f6ab;特别声明&#xff1a;创作不易&#xff0c;未经授权不得转载或抄袭&#xff0c;如需转载可联系小编授权。 前言 …

《花雕学AI》12:从ChatGPT的出现看人类与人工智能的互补关系与未来发展

马云说道&#xff0c;ChatGPT这一类技术已经对教育带来挑战&#xff0c;但是ChatGPT这一类技术只是AI时代的开始。 谷歌CEO桑德尔皮猜曾说&#xff1a;“人工智能是我们人类正在从事的最为深刻的研究方向之一&#xff0c;甚至要比火与电还更加深刻。” 360周鸿祎认为&#xf…

论文谷歌翻译:SinGAN(代码开源)

论文地址&#xff1a;https://arxiv.org/abs/1905.01164 代码地址&#xff1a;http://webee.technion.ac.il/people/tomermic/SinGAN/SinGAN.htm 摘要 提出了 SinGAN&#xff0c;这是一个可以从单张自然图像学习的非条件性生成式模型。模型可以捕捉给定图像中各个小块内的内在…

最好最常用的国外邮箱推荐!注册非常简单!

大家都知道&#xff0c;接送和发送电子邮件是我们日常不可避免的&#xff0c;不管是个人也好&#xff0c;企业也好&#xff0c;都需要邮箱来处理一些东西。 当然现在的通讯比较发达&#xff0c;打电话、短信、QQ或者微信都可以进行交流沟通&#xff0c;也可以发送些简单的文件…

编译器技术的演进与变革

在过去的数十年里&#xff0c;摩尔定律一直支配着半导体行业的发展路线&#xff0c;随着晶体管尺寸的不断变小单个芯片上集成的晶体管数量越来越多。 最新的 NVIDIA A100 GPU 单个芯片集成了 540 亿个晶体管&#xff0c;而嵌入式系统级芯片&#xff08;System on Chip&#xff…

2023年美赛A题赛后总结

文章目录 心路历程1. 选题2. 初次建模3. 数据收集4. 二次建模5. 算法实现以及优化6.全英论文撰写 总结 心路历程 2023年美赛是在2月17号早上6点到2月21号早上8点这期间举行的&#xff0c;美赛开赛前一天我们三个人还在考期末考&#xff0c;甚至美赛刚开始前两天有位队友每天还…

概率统计极简入门:通俗理解微积分/期望方差/正态分布前世今生(23修订版)

原标题&#xff1a;数据挖掘中所需的概率论与数理统计知识(12年首次发布&#xff0c;23年重编公式且反复改进) 修订背景 本文初稿发布于12年年底&#xff0c;十年后的22年底/23年初ChatGPT大火&#xff0c;在写ChatGPT通俗笔记的过程中&#xff0c;发现ChatGPT背后技术涉及到了…

ChatGPT 插件(八个插件,个个优秀)

webpilot——联网搜索图片、视频、文档、人脉等 1. 有哪些免费的高清无版权的图片网站&#xff0c;请从这些网站里找一些图片给我&#xff0c;图片搜索关键词为:Shanghai aerial&#xff0c;把图片的url链接发我&#xff1b; 2. 有哪些免费的GIF图片网站&#xff0c;请从这些网…

从ChatGPT看AI未来趋势和挑战 | 万字长文

ChatGPT 持续成为大家关注的焦点&#xff0c;开启通用人工智能(AGI)之门。北京交通大学桑基韬教授和于剑教授撰写的《从ChatGPT看AI未来趋势和挑战》&#xff0c;详述了ChatGPT 的“能”与“不能”&#xff0c;AI中什么是“真”以及AI的未来趋势&#xff0c;非常值得关注&#…

高等数学(第七版)同济大学 习题1-1 个人解答

高等数学&#xff08;第七版&#xff09;同济大学 习题1-1 函数作图软件&#xff1a;Mathematica 部分图片采用ChatGPT生成 1. 求下列函数的自然定义域 \begin{aligned}&1. 求下列函数的自然定义域&&&&&&&&&&&&&&am…

大佬太快了 !这本ChatGPT、AI绘画的书籍免费赠送给大家 !

a15a 著&#xff0c;贾雪丽&#xff0c;0xAres&#xff0c;张炯 编 电子工业出版社-博文视点 2023-04-01 ISBN: 9787121353932 定价: 79.00 元 新书推荐 &#x1f31f;今日福利 &#xff5c;关于本书&#xff5c; 《一本书读懂AIGC&#xff1a;ChatGPT、AI绘画、智能文明与生产…

ChatGPT生成 SD 和 Midjourney 的提示(prompt)

探索Midjourney之旅&#xff0c;学习绘画与AI&#xff0c;一同成长。加入「阿杰与AI」公众号&#xff0c;参与内容社群建设。 1.Midjourney 新手快速起步指南2.Prompts-提示指令3.Explore Prompting-提示指令的探索4.Blend-叠加5.Midjourney Discord的使用手册6.Versions-版本…

人工智能前沿——6款AI绘画生成工具

>>>深度学习Tricks&#xff0c;第一时间送达<<< 目录 一、【前言】 二、【6款AI绘画生成工具】 1.DeepAI 2.NightCafe 3.Deep Dream Generator 4.StarryAI 5.Fotor 6.Pixso 一、【前言】 AI不仅影响商业和医疗保健等行业&#xff0c;还在创意产业中…

AI绘画工具+ChatGPT,新时代的倚天剑屠龙刀

当下&#xff0c;人工智能正对各个领域产生深远影响。其中&#xff0c;AI绘画工具和ChatGPT影响更为广泛。 AI绘画工具可以根据文本描述自动生成图像&#xff0c;属于计算机视觉和生成模型的结合。譬如&#xff0c;输入“一只白色的鸟&#xff0c;站在枯枝上&#xff0c;背景是…

使用ChatGPT为Stable Diffusion生成画面的关键词

在使用SD进行绘图的时候常常苦于某个换面想不到关键词,可以通过ChatGPT模板批量生成关键词。 先来看下演示效果。 案例结果 这个例子是根据古诗《陋室铭》编写的关键词描述。 仿照例子,并不局限于我给你的单词,给出一套详细描述“山不在高,有仙则名。”的prompt,注意…

如何让ChatGPT生成Midjourney提示词

​关注文章下方公众号&#xff0c;即可免费获取AIGC最新学习资料 导读&#xff1a;最近AI绘画非常的火&#xff0c;今天我们看ChatGPT如何生成Midjourney提示词&#xff0c;让AI教AI做事。 本文字数&#xff1a;900&#xff0c;阅读时长大约&#xff1a;3分钟 正如 Midjourney…

ChatGPT 为 Midjourney 或 DALL-E 等 AI 艺术生成提示

人工智能为创意产业开辟了一个充满可能性的全新世界。人工智能最令人兴奋的应用之一是生成独特的原创艺术作品。Midjourney 和 DALL-E 是人工智能生成艺术的两个突出例子&#xff0c;它们已经引起了艺术家和艺术爱好者的关注。在本文中&#xff0c;将探索如何使用 ChatGPT 为 A…

【文献阅读】“ChatGPT: Jack of all trades, master of none”

【文献阅读】“ChatGPT: Jack of all trades, master of none” 摘要背景问题任务介绍研究方法ChatGPT对话示例衡量指标 量化分析ChatGPT “博而不精”任务难易程度与ChatGPT 的表现随机上下文小样本个性化对话上下文对生成结果的影响是否用测试数据集来微调对性能表现的影响 质…

QQ邮箱验证码登录(移动端邮箱验证登录)

获取邮箱授权码 登录邮箱------->点击设置------->点击账户&#xff0c;下拉------->找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务------->按照步骤开启POP3/SMTP服务 ------->获取授权码 2.在pom.xml中添加依赖&#xff1a; <!--mail--><depend…

关于学校edu邮箱登录第三方邮件客户端(例如Outlook、Foxmail、QQ邮箱、邮件App等)的注意事项

求实习&#xff0c;找工作的时候用了学校的邮箱&#xff0c;但发现收件不方便查看&#xff0c;很容易错过重要信息&#xff0c;所以需要添加到第三方手机客户端中。以iphone12自带的邮件app为例&#xff1a; 第一步 iphone打开设置——邮件——账户——添加账户——其他——添…