当前位置: 首页 > news >正文

springboot整合chatgpt,并且让其可以记录上下文

整合很简单,不过需要几个小条件

1.必须要有openai官方的key

2.国内需要有代理服务器或者国外的服务器把项目部署出去也没问题

我没有使用spring的springAI,听说很方便,日后有机会去体验体验,我今天用了两种方式整合了gpt

1.Chatgpt-Java :📖 项目简介 | Chatgpt-Java (unfbx.com)

这个巨巨巨方便,整合gpt,可以跟着官网的快速入门走,一下就解决了

先导入maven依赖

        <dependency><groupId>com.unfbx</groupId><artifactId>chatgpt-java</artifactId><version>1.1.5</version></dependency>

然后我直接写接口

@RestController
@RequestMapping("/ai")
@Api(tags = "ai")
public class AiController {@ApiOperation("ai对话")@PostMapping("/test")public ResultResponse test(String msg){OpenAiClient openAiClient = OpenAiClient.builder().apiKey(Arrays.asList("xxxxxxxxxxxxxxxxxxxxxxxxxxxxx")).build();Message message = Message.builder().role(Message.Role.USER).content(msg).build();ChatCompletion chatCompletion = ChatCompletion.builder().messages(Arrays.asList(message)).build();ChatCompletionResponse chatCompletionResponse = openAiClient.chatCompletion(chatCompletion);
//        chatCompletionResponse.getChoices().forEach(e -> {
//            System.out.println(e.getMessage());
//        });return ResultResponse.success(chatCompletionResponse.getChoices());}
}

xxxxxxxxxxxxxxx自己替换成自己的key哈。

结束,到这里就可以直接使用gpt了,自己去postman测试一下就行。

2.直接给官网api发请求

首先3个dto类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ChatBotRequest {private String model;private List<Message> messages;private int n;private double temperature;private int max_tokens;
}
------------------------------------------
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ChatBotResponse {private List<Choice> choices;@Data@AllArgsConstructor@NoArgsConstructorpublic static class Choice {private int index;private Message message;}
}
------------------------------------------
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Message {private String role;private String content;}

其次配置一下config

@Configuration
public class OpenAIChatGtpConfig {private final String openaiApiKey = "xxxxxxxxxxxxxxxxxxxxxxx";@Beanpublic RestTemplate restTemplate() {RestTemplate restTemplate = new RestTemplate();restTemplate.getInterceptors().add((request, body, execution) -> {request.getHeaders().add("Authorization", "Bearer " + openaiApiKey);return execution.execute(request, body);});return restTemplate;}
}

最后依然是直接写接口

@Api(tags = "chat")
@RestController
@RequestMapping("/chats")
public class ChatBotController {@Autowiredprivate RestTemplate restTemplate;@ApiOperation("chat")@PostMapping("/chat")public ChatBotResponse chat(@RequestParam("prompt") String prompt) {ChatBotRequest request = new ChatBotRequest("gpt-3.5-turbo",Arrays.asList(new Message("user", prompt)),1,0,100);ChatBotResponse chatBotResponse = restTemplate.postForObject("https://api.openai.com/v1/chat/completions", request, ChatBotResponse.class);return chatBotResponse;}
}

至此第二种整合方式也结束了,其实就这种阻塞式整合真的很简单,不过体验感其实比不上流式整合,回头什么时候去试试流式整合。

Cannot resolve method ‘of’ in ‘List’ 或 找不到符号of

顺带今天碰见了一点小报错,才知道Arrays.asList其实等同于List.of。不过List.of是jdk9里面新出的,jdk8没有,因此只能用自己的老东西Arrays.asList。( 参考的是【BUG】Cannot resolve method ‘of‘ in ‘List‘ 或 找不到符号of(非jdk8版本问题)_cannot resolve method 'of' in 'list-CSDN博客)

两种整合方式都可以顺利连通,不过此时我发现gpt竟然无法联系上下文。去网上找了很久发现原来暂时没有可以直接自己联系上下文的大模型,因此得自己来做操作。感到疑惑可以看一下这个博客:手把手教会你如何通过ChatGPT API实现上下文对话 - 个人文章 - SegmentFault 思否

原理很简单,每次把之前得mes全部拼接起来,直接开始实现吧:

maven依赖:

            <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
@RestController
@RequestMapping("/ai")
@Api(tags = "ai")
public class AiController {public static final String token = "sk-proj-xElzheeQc3nqZrWm3J6lT3BlbkFJRCQpGjcqfdkj5jsdC1KM";private static final String CHAT_HISTORY_KEY = "chat_history";@Autowiredprivate RedisTemplate<String, String> redisTemplate;@Autowiredprivate AiService aiService;@ApiOperation("ai对话")@PostMapping("/tall")public ResultResponse tall(@RequestParam("msg") String msg,@RequestParam("userId") String userId) {String keyword = CHAT_HISTORY_KEY + "_tall" + userId;ListOperations<String, String> listOps = redisTemplate.opsForList();Message userMessage = Message.builder().role(Message.Role.USER).content(msg).build();List<String> history = listOps.range(keyword , 0, -1);List<Message> messages = new ArrayList<>();for (String historicalMessage : history) {messages.add(Message.builder().role(Message.Role.USER).content(historicalMessage).build());}messages.add(userMessage);OpenAiClient openAiClient = OpenAiClient.builder().apiKey(Arrays.asList(token)).build();ChatCompletion chatCompletion = ChatCompletion.builder().messages(messages).model("gpt-3.5-turbo").build();ChatCompletionResponse chatCompletionResponse = openAiClient.chatCompletion(chatCompletion);String gptResponse = chatCompletionResponse.getChoices().get(0).getMessage().getContent();if(redisTemplate.opsForList().size(keyword ) >= 6){listOps.leftPop(keyword );}listOps.rightPush(keyword, "user:"+msg); //指定role角色更有利于ai理解上下文信息listOps.rightPush(keyword, "assistant:"+gptResponse);return ResultResponse.success(gptResponse);}
}

很简单,就用了redis得list结构当作一个消息队列用,记录最近得6条上下文,每次拼接过去就好。

防止缓存一直占空间,可以自己弄个定时器每天或者每个月清理一次消息队列。

先再自己得application上面加个开关注解:

@EnableScheduling
@SpringBootApplication()
public class ExamsystemApplication extends SpringBootServletInitializer 

然后直接写定时器:

@Component
public class TimerTask {@Autowiredprivate RedisTemplate<String, String> redisTemplate;@Scheduled(cron = "0 0 0 1 * ?") // 每个月1号的凌晨执行public void TaskMethod() {try {Set<String> keys = redisTemplate.keys("chat_history*");redisTemplate.delete(keys);} catch (Exception e) {System.err.println("Failed to reset frequency: " + e.getMessage());}}}

到现在ai也拥有上下文了,爽歪歪。

相关文章:

springboot整合chatgpt,并且让其可以记录上下文

整合很简单&#xff0c;不过需要几个小条件 1.必须要有openai官方的key 2.国内需要有代理服务器或者国外的服务器把项目部署出去也没问题 我没有使用spring的springAI&#xff0c;听说很方便&#xff0c;日后有机会去体验体验&#xff0c;我今天用了两种方式整合了gpt 1.Ch…...

CTP前端:解码数字世界的魔法师

CTP前端&#xff1a;解码数字世界的魔法师 CTP前端&#xff0c;一个充满神秘与魅力的职业&#xff0c;他们在数字世界中挥舞着魔法棒&#xff0c;创造着令人惊叹的奇迹。那么&#xff0c;CTP前端究竟是做什么的呢&#xff1f;让我们从四个方面、五个方面、六个方面和七个方面&…...

rabbitmq的交换机类型以及他们的区别

RabbitMQ中有四种主要的交换机类型&#xff0c;它们是&#xff1a;Direct&#xff0c;Topic&#xff0c;Fanout&#xff0c;Headers。 Direct&#xff08;直连交换机&#xff09;&#xff1a;接收到消息后&#xff0c;会将消息发送到与消息的routing key完全匹配的队列上。Dire…...

理解不同层的表示(layer representations)

在机器学习和深度学习领域&#xff0c;特别是在处理音频和自然语言处理&#xff08;NLP&#xff09;任务时&#xff0c;"层的表示"&#xff08;layer representations&#xff09;通常是指神经网络不同层在处理输入数据时生成的特征或嵌入。这些表示捕获了输入数据的…...

原生js访问http获取数据的方法

在原生JavaScript中&#xff0c;直接通过浏览器端的JavaScript访问HTTP接口获取数据通常涉及XMLHttpRequest对象或现代的fetch API。 1. 使用XMLHttpRequest XMLHttpRequest是一个老旧的API&#xff0c;但在某些情况下仍然很有用。以下是一个简单的例子&#xff1a; javascr…...

Windows 2000 Server:安全配置终极指南

"远古技术&#xff0c;仅供娱乐" &#x1f4ad; 前言&#xff1a;Windows 2000 服务器在当时的市场中占据了很大的比例&#xff0c;主要原因包括操作简单和易于管理&#xff0c;但也经常因为安全性问题受到谴责&#xff0c;Windows 2000 的安全性真的那么差吗&#x…...

基于 FastAI 文本迁移学习的情感分类(93%+Accuracy)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记…...

集成Google Authenticator实现多因素认证(MFA)

目录 参考1、应用背景2、多因素认证3、谷歌google authenticator集成用法3.1、原理3.2、 MFA绑定3.2.1、 用户输入用户名密码登录3.2.2、检查是否已经绑定MFA&#xff08;检查数据库是否保存该用户的google secret&#xff09;3.2.3、谷歌身份证认证器扫描绑定3.2.4、手动测试验…...

网关(Gateway)- 自定义过滤器工厂

自定义过滤工厂类 DemoGatewayFilterFactory package com.learning.springcloud.custom;import org.apache.commons.lang.StringUtils; import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.GatewayFilterChai…...

HTML静态网页成品作业(HTML+CSS)—— 香奈儿香水介绍网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…...

C++11 lambda表达式和包装器

C11 lambda表达式和包装器 一.lambda表达式1.lambda表达式的引入2.基本语法和使用1.基本语法2.使用1.传值捕捉的错误之处2.传引用捕捉 3.lambda表达式的底层原理4.lambda的特殊之处5.lambda配合decltype的新玩法 二.function包装器1.概念2.包装函数1.包装普通函数2.包装成员函数…...

3. MySQL 数据表的基本操作

文章目录 【 1. MySQL 创建数据表 】【 2. MySQL 查看表 】2.1 查看表的属性DESCRIBE/DESC 以表格的形式展示表属性SHOW CREATE TABLE 以SQL语句的形式展示表属性 2.2 查看表的内容 【 3. MySQL 修改数据表结构 】3.1 修改表名3.2 修改表字符集3.3 添加字段在末尾添加字段在开头…...

Linux命令篇(一):文件管理部分

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 1、cat命令常用参…...

IP协议1.0

基本概念&#xff1a; • 主机: 配有IP地址, 但是不进⾏路由控制的设备; • 路由器: 即配有IP地址, ⼜能进⾏路由控制; • 节点: 主机和路由器的统称; IP协议的报头 • 4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4. • 4位头部⻓度(header length): IP头部的⻓…...

源码编译安装LNMP

LNMP包含&#xff1a; linux、Nginx、Mysql、php LNMP的工作原理 &#xff1a; 由客户端发送页面请求给Nginx&#xff0c;Nginx会根据location匹配用户访问请求的URL路径判断是静态还是动态&#xff0c;静态的一般是以 .html .htm .css .shtml结尾&#xff0c;动态的一般是以 .…...

安装Chrome扩展程序来 一键禁用页面上的所有动画和过渡。有那些扩展程序推荐一下

要安装Chrome扩展程序来一键禁用页面上的所有动画和过渡&#xff0c;以下是一些推荐的扩展程序&#xff1a; Toggle CSS Animations and Transitions 功能&#xff1a;此扩展程序允许用户轻松地在网页上切换CSS动画和过渡的开启与关闭状态。使用方法&#xff1a;安装后&#x…...

读人工智能时代与人类未来笔记19_读后总结与感想兼导读

1. 基本信息 人工智能时代与人类未来 (美)亨利基辛格,(美)埃里克施密特,(美)丹尼尔胡滕洛赫尔 著 中信出版社,2023年6月出版 1.1. 读薄率 书籍总字数145千字&#xff0c;笔记总字数39934字。 读薄率39934145000≈27.5% 1.2. 读厚方向 千脑智能 脑机穿越 未来呼啸而来 …...

个人影响力

华人出了个黄仁勋&#xff0c;世界级影响力&#xff0c;还是近代华人历史首次出现具有如此影响力的人。凭借的逻辑是什呢&#xff1f;在人工智能领域有巨大影响力。...

OBS实现多路并发推流

OBS实现多路并发推流 解决方案速览相关依赖下载安装多路推流 解决方案速览 利用OBS进行本地直播画面的构建。 使用Multiple RTMP outputs plugin进行多路并发推流。 相关依赖下载安装 OBS软件 # OBS官网 https://obsproject.com/zh-cnMultiple RTMP outputs plugin # 插件官网…...

JDK环境配置、安装

DK环境配置&#xff08;备注&#xff1a;分32位与64位JDK&#xff0c;32位电脑只能按照32位JDK&#xff0c;64位电脑兼容32、64位JDK&#xff09; 一、检查自己电脑是否安装过JDK 1.在电脑屏幕左下角&#xff0c;输入命令提示符CMD&#xff0c;打开命令提示符应用 2.在打开界…...

Alibaba DASD-4B Thinking 对话工具应用:自动化软件测试用例生成与评审

Alibaba DASD-4B Thinking 对话工具应用&#xff1a;自动化软件测试用例生成与评审 每次新版本上线前&#xff0c;测试团队是不是都忙得焦头烂额&#xff1f;产品需求文档改了又改&#xff0c;测试用例也得跟着一遍遍更新&#xff0c;手动编写不仅耗时&#xff0c;还容易遗漏边…...

GPU友好型部署!Nanbeige 4.1-3B Streamlit WebUI显存优化实测教程

GPU友好型部署&#xff01;Nanbeige 4.1-3B Streamlit WebUI显存优化实测教程 想在自己的电脑上跑一个好看又好用的AI对话应用&#xff0c;是不是总被复杂的部署步骤和巨大的显存占用劝退&#xff1f;今天&#xff0c;我就带你实测一个专为Nanbeige 4.1-3B模型打造的Streamlit…...

宝塔面板计划任务设置教程

宝塔面板的计划任务&#xff0c;就是服务器的定时执行工具&#xff0c;不用手动敲命令&#xff0c;可视化界面就能设置&#xff0c;能实现自动备份、定时重启、清理缓存、执行脚本等多种自动化操作。下面详细讲解完整设置步骤、常用任务配置和避坑技巧。一、进入计划任务页面1.…...

python汽车4s店的汽车租赁服务管理系统vue

目录功能模块分析租赁服务核心功能技术实现要点扩展功能建议项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作功能模块分析 用户管理模块 用户注册与登录&#xff1a;支持手机号、邮箱注册&#xff0c;集成短信验证码功能。权限…...

Windows 11 + VSCode + Conda:保姆级配置Depth-Anything-3环境,一次跑通不报错

Windows 11深度视觉开发环境搭建实战&#xff1a;从零配置Depth-Anything-3全流程指南 当我在深夜第三次面对满屏红色报错信息时&#xff0c;终于意识到AI视觉项目的环境配置从来不是简单的"复制粘贴命令"就能搞定。本文将带你完整走通Windows 11系统下使用VSCode和C…...

LightGBM实战:极速梯度提升框架的多变量时序预测深度解析

LightGBM实战&#xff1a;极速梯度提升框架的多变量时序预测深度解析 【免费下载链接】LightGBM microsoft/LightGBM: LightGBM 是微软开发的一款梯度提升机&#xff08;Gradient Boosting Machine, GBM&#xff09;框架&#xff0c;具有高效、分布式和并行化等特点&#xff0c…...

高效流畅的WindowsB站体验:BiliBili-UWP第三方客户端全方位指南

高效流畅的WindowsB站体验&#xff1a;BiliBili-UWP第三方客户端全方位指南 【免费下载链接】BiliBili-UWP BiliBili的UWP客户端&#xff0c;当然&#xff0c;是第三方的了 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBili-UWP 作为一名Windows平台的B站用户&…...

Whisper-large-v3开源大模型部署教程:无需Docker,纯Python一键启动方案

Whisper-large-v3开源大模型部署教程&#xff1a;无需Docker&#xff0c;纯Python一键启动方案 本文由113小贝基于Whisper-large-v3语音识别模型二次开发构建 1. 项目概述 今天要给大家介绍一个超级实用的语音识别工具——基于OpenAI Whisper Large v3的多语言语音识别Web服务…...

革命性LLM优化代理OptiLLM:零训练实现2-10倍推理性能提升

革命性LLM优化代理OptiLLM&#xff1a;零训练实现2-10倍推理性能提升 【免费下载链接】optillm Optimizing inference proxy for LLMs 项目地址: https://gitcode.com/gh_mirrors/op/optillm OptiLLM是一款强大的LLM优化代理工具&#xff0c;能够在不进行任何模型训练的…...

突破限制,让老旧Mac焕发新体验:OpenCore Legacy Patcher全解析

突破限制&#xff0c;让老旧Mac焕发新体验&#xff1a;OpenCore Legacy Patcher全解析 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一款强大…...