文末送资料|跟着开源学技术-ChatGPT开源项目-chatgpt-java

2024-04-25 20:52

本文主要是介绍文末送资料|跟着开源学技术-ChatGPT开源项目-chatgpt-java,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

目录

功能特性

最简使用

进阶使用

函数调用(Function Call)

流式使用

流式配合Spring SseEmitter使用

多KEY自动轮询

大家好,我是充电君

   今天带着大家来看个Java版本的ChatGPT。这个开源项目就是chatgpt-java。

Github: https://github.com/PlexPt/chatgpt-java

Chatgpt-Java是基于OpenAi官方api开发的Java版OpenAi SDK,帮助Java开发者更加快速、简洁、灵活高效的将OpenAi继承到项目中。ChatGPT Java 版本,OpenAI ChatGPT 的逆向工程 SDK,可扩展用于聊天机器人等。

功能特性

功能特性
GPT 3.5支持
GPT 4.0支持
函数调用支持
流式对话支持
阻塞式对话支持
前端
上下文支持
计算Token用jtokkit
多KEY轮询支持
代理支持
反向代理支持

maven

<dependency><groupId>com.github.plexpt</groupId><artifactId>chatgpt</artifactId><version>4.4.0</version>
</dependency>

gradle

implementation group: 'com.github.plexpt', name: 'chatgpt', version: '4.4.0'

最简使用

//国内需要代理Proxy proxy = Proxys.http("127.0.0.1", 1081);//socks5 代理// Proxy proxy = Proxys.socks5("127.0.0.1", 1080);ChatGPT chatGPT = ChatGPT.builder().apiKey("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").proxy(proxy).apiHost("https://api.openai.com/") //反向代理地址.build().init();String res = chatGPT.chat("写一段七言绝句诗,题目是:火锅!");

System.out.println(res);

进阶使用

   //国内需要代理 国外不需要Proxy proxy = Proxys.http("127.0.0.1", 1080);ChatGPT chatGPT = ChatGPT.builder().apiKey("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").proxy(proxy).timeout(900).apiHost("https://api.openai.com/") //反向代理地址.build().init();Message system = Message.ofSystem("你现在是一个诗人,专门写七言绝句");Message message = Message.of("写一段七言绝句诗,题目是:火锅!");ChatCompletion chatCompletion = ChatCompletion.builder().model(ChatCompletion.Model.GPT_3_5_TURBO.getName()).messages(Arrays.asList(system, message)).maxTokens(3000).temperature(0.9).build();ChatCompletionResponse response = chatGPT.chatCompletion(chatCompletion);Message res = response.getChoices().get(0).getMessage();System.out.println(res);
   

函数调用(Function Call)

//国内需要代理 国外不需要Proxy proxy = Proxys.http("127.0.0.1", 1080);chatGPT = ChatGPT.builder().apiKey("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").timeout(900).proxy(proxy).apiHost("https://api.openai.com/") //代理地址.build().init();List<ChatFunction> functions = new ArrayList<>();ChatFunction function = new ChatFunction();function.setName("getCurrentWeather");function.setDescription("获取给定位置的当前天气");function.setParameters(ChatFunction.ChatParameter.builder().type("object").required(Arrays.asList("location")).properties(JSON.parseObject("{\n" +"          \"location\": {\n" +"            \"type\": \"string\",\n" +"            \"description\": \"The city and state, e.g. San Francisco, " +"CA\"\n" +"          },\n" +"          \"unit\": {\n" +"            \"type\": \"string\",\n" +"            \"enum\": [\"celsius\", \"fahrenheit\"]\n" +"          }\n" +"        }")).build());functions.add(function);Message message = Message.of("上海的天气怎么样?");ChatCompletion chatCompletion = ChatCompletion.builder().model(ChatCompletion.Model.GPT_3_5_TURBO_0613.getName()).messages(Arrays.asList(message)).functions(functions).maxTokens(8000).temperature(0.9).build();ChatCompletionResponse response = chatGPT.chatCompletion(chatCompletion);ChatChoice choice = response.getChoices().get(0);Message res = choice.getMessage();System.out.println(res);if ("function_call".equals(choice.getFinishReason())) {FunctionCallResult functionCall = res.getFunctionCall();String functionCallName = functionCall.getName();if ("getCurrentWeather".equals(functionCallName)) {String arguments = functionCall.getArguments();JSONObject jsonObject = JSON.parseObject(arguments);String location = jsonObject.getString("location");String unit = jsonObject.getString("unit");String weather = getCurrentWeather(location, unit);callWithWeather(weather, res, functions);}}private void callWithWeather(String weather, Message res, List<ChatFunction> functions) {Message message = Message.of("上海的天气怎么样?");Message function1 = Message.ofFunction(weather);function1.setName("getCurrentWeather");ChatCompletion chatCompletion = ChatCompletion.builder().model(ChatCompletion.Model.GPT_3_5_TURBO_0613.getName()).messages(Arrays.asList(message, res, function1)).functions(functions).maxTokens(8000).temperature(0.9).build();ChatCompletionResponse response = chatGPT.chatCompletion(chatCompletion);ChatChoice choice = response.getChoices().get(0);Message res2 = choice.getMessage();//上海目前天气晴朗,气温为 22 摄氏度。System.out.println(res2.getContent());}public String getCurrentWeather(String location, String unit) {return "{ \"temperature\": 22, \"unit\": \"celsius\", \"description\": \"晴朗\" }";}

流式使用

    //国内需要代理 国外不需要Proxy proxy = Proxys.http("127.0.0.1", 1080);ChatGPTStream chatGPTStream = ChatGPTStream.builder().timeout(600).apiKey("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").proxy(proxy).apiHost("https://api.openai.com/").build().init();ConsoleStreamListener listener = new ConsoleStreamListener();Message message = Message.of("写一段七言绝句诗,题目是:火锅!");ChatCompletion chatCompletion = ChatCompletion.builder().messages(Arrays.asList(message)).build();
chatGPTStream.streamChatCompletion(chatCompletion, listener);、

流式配合Spring SseEmitter使用

参考 SseStreamListener

你可能在找这个,参考Demo https://github.com/PlexPt/chatgpt-online-springboot

@GetMapping("/chat/sse")@CrossOriginpublic SseEmitter sseEmitter(String prompt) {//国内需要代理 国外不需要Proxy proxy = Proxys.http("127.0.0.1", 1080);ChatGPTStream chatGPTStream = ChatGPTStream.builder().timeout(600).apiKey("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").proxy(proxy).apiHost("https://api.openai.com/").build().init();SseEmitter sseEmitter = new SseEmitter(-1L);SseStreamListener listener = new SseStreamListener(sseEmitter);Message message = Message.of(prompt);listener.setOnComplate(msg -> {//回答完成,可以做一些事情});chatGPTStream.streamChatCompletion(Arrays.asList(message), listener);return sseEmitter;}

多KEY自动轮询

只需替换chatGPT构造部分

chatGPT = ChatGPT.builder().apiKeyList(// 从数据库或其他地方取出多个KEYArrays.asList("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","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","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","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",)).timeout(900).proxy(proxy).apiHost("https://api.openai.com/") //代理地址.build()

.init();

图片

福利:想要的资料全都有 ,全免费,没有魔法和套路

关注公众号:资源充电吧


点击小卡片关注下,回复:学习

这篇关于文末送资料|跟着开源学技术-ChatGPT开源项目-chatgpt-java的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/935767

相关文章

韵搜坊(全栈开发)-- 项目介绍

文章目录 项目介绍技术栈前端后端 业务流程 后端地址: https://github.com/IMZHEYA/zhesou-backend 前端地址: https://github.com/IMZHEYA/zhesou-frontend 图标设计(AI生成): 项目介绍 一个聚合搜素平台,可以让用户在同一个页面集中搜索出不同来源,不同类型的内容。 用户:提升用

spring 声明 hibernate 的 事物的几种用法

以下两个bean的配置是下面要用到的。<pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/

java 泛型的使用

<pre name="code" class="plain">写法一般都会在基类中看到,而且是使用了JAVA泛型的,比如我们J2EE中的BaseDAO什么的,请看代码,其实简写了,分开写就明了了。基类: import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;public abstract class S

基于 Spring Boot 博客系统开发(八)

基于 Spring Boot 博客系统开发(八) 本系统是简易的个人博客系统开发,为了更加熟练地掌握 SprIng Boot 框架及相关技术的使用。🌿🌿🌿 基于 Spring Boot 博客系统开发(七)👈👈 仪表盘实现效果 显示文章总数、评论总数、最新文章和最新留言。实现步骤,首先后端获取文章评论相关数据,然后前端使用thymeleaf获取后端model中的数据进行渲染。 后

java jersey restful 详解

前言 在短信平台一期工作中,为便于移动平台的开发,使用了Java Jersey框架开发RESTFul风格的Web Service接口。在使用的过程中发现了一些问题并积累了一些经验。因此,做下总结备忘,同时也希望对有需要的同仁有好的借鉴和帮助。 简介 Jersey是JAX-RS(JSR311)开源参考实现用于构建RESTful Web service,它包含三个部分: 核心服务器(Co

Java Jersey使用总结

前言 在短信平台一期工作中,为便于移动平台的开发,使用了Java Jersey框架开发RESTFul风格的Web Service接口。在使用的过程中发现了一些问题并积累了一些经验。因此,做下总结备忘,同时也希望对有需要的同仁有好的借鉴和帮助。 简介 Jersey是JAX-RS(JSR311)开源参考实现用于构建RESTful Web service,它包含三个部分: 核心服务器(Co

java中生成30万的excel(采用多个excel,每个上面放6万数据,最后打包zip保存)

首先要说明的是excel03  每个sheet最多放65535行所以,每行不能超过这个数,如果想放的多,可以考虑生成excel2007, 好像excel2007可以放100W多行数据   大数据量生成excel我只想到三种方法,当然基本也是网上看到的 1  生成多个excel打包   2  利用xml方式生成   3  用最新的包  现在讲的是第一种  第二种也可以以后会做下

Struts2、Spring、Hibernate 高效开发的最佳实践

框架总体介绍 文章之所以说框架是通用的,因为它的思想适应任何的业务需求。按照文章介绍,按照介绍的框架搭建完代码架构后,可以屏蔽许多技术细节,让开发人员专注于业务逻辑的实现,这些繁琐的技术细节包括技术配置、权限控制、页面跳转、错误处理等等。框架大致的风格如图 1 所示,总体来说,该框架遵守了“规约优于配置”的原则。 图 1. 框架大致风格(查看大图 ) 上图中,系统只有一个 act

【退役之重学Java】ThreadLocal

一、ThreadLocal 与 Synchronized 区别 ThreadLocal: 采用“以空间换时间”的方式,为每一个线程都提供了一份变量的副本,从而实现同时访问而互不干扰多线程中让每个线程之间的数据相互隔离 Synchronized 同步机制采用“以时间换空间”的方式,值提供一份变量,荣不同的线程排队访问对个线程之间访问资源的同步 二、ThreadLocal 方案的好处 传递

java调用.net的webservice

一.参考文献 1. http://www.cnblogs.com/xuqifa100/archive/2007/12/13/993926.html 使用.net如何发布web service 2.WebService跨语言的问题 3.Java调用DotNet WebService为什么那么难? 4. java调用.net服务例子 5.使用axis调用.net服务端 二.