diff --git a/pom.xml b/pom.xml index 72ac854106e10848f7f641e146940abc103c67b9..d8fa1a615f81cb6cfbaf27e6510e49c898268c85 100644 --- a/pom.xml +++ b/pom.xml @@ -88,5 +88,22 @@ guava 31.1-jre + + org.projectlombok + lombok + 1.18.26 + + + + com.theokanning.openai-gpt3-java + service + 0.11.0 + + + + com.theokanning.openai-gpt3-java + client + 0.11.1 + \ No newline at end of file diff --git a/src/main/java/com/kwan/spring5/pojo/ChoiceMessage.java b/src/main/java/com/kwan/spring5/pojo/ChoiceMessage.java new file mode 100644 index 0000000000000000000000000000000000000000..0717291bc54172b1a19584e478fa9b390ed29809 --- /dev/null +++ b/src/main/java/com/kwan/spring5/pojo/ChoiceMessage.java @@ -0,0 +1,22 @@ +package com.kwan.spring5.pojo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Data +public class ChoiceMessage { + /** + * 角色 + */ + String role; + /** + * 具体内容 + */ + String content; +} + diff --git a/src/main/java/com/kwan/spring5/pojo/Choices.java b/src/main/java/com/kwan/spring5/pojo/Choices.java new file mode 100644 index 0000000000000000000000000000000000000000..b157fb62d16bc841009092717380b2cabbd3d610 --- /dev/null +++ b/src/main/java/com/kwan/spring5/pojo/Choices.java @@ -0,0 +1,25 @@ +package com.kwan.spring5.pojo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Data +public class Choices { + /** + * 内容对象 + */ + private ChoiceMessage message; + /** + * 结束原因 + */ + private String finish_reason; + /** + * 索引位置 + */ + private Integer index; +} diff --git a/src/main/java/com/kwan/spring5/pojo/CompletionChatRequest.java b/src/main/java/com/kwan/spring5/pojo/CompletionChatRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..f56ccb7a739ac9b23aa696d2c7a3a7f434dbfda1 --- /dev/null +++ b/src/main/java/com/kwan/spring5/pojo/CompletionChatRequest.java @@ -0,0 +1,41 @@ +package com.kwan.spring5.pojo; + + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; +import java.util.Map; + + +/** + * 请求参数 + * + * @author : qinyingjie + * @version : 2.2.0 + * @date : 2023/3/22 21:00 + */ +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Data +public class CompletionChatRequest { + String model; + List messages; + Integer maxTokens; + Double temperature; + Double topP; + Integer n; + Boolean stream; + Integer logprobs; + Boolean echo; + List stop; + Double presencePenalty; + Double frequencyPenalty; + Integer bestOf; + Map logitBias; + String user; +} + diff --git a/src/main/java/com/kwan/spring5/pojo/CompletionChatResponse.java b/src/main/java/com/kwan/spring5/pojo/CompletionChatResponse.java new file mode 100644 index 0000000000000000000000000000000000000000..06b281cfcec5fbefe8c7e2cbde625a63ede84ac6 --- /dev/null +++ b/src/main/java/com/kwan/spring5/pojo/CompletionChatResponse.java @@ -0,0 +1,41 @@ +package com.kwan.spring5.pojo; + +import com.theokanning.openai.Usage; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Data +public class CompletionChatResponse { + /** + * id + */ + String id; + /** + * chat.completion + */ + String object; + /** + * 创建时间 + */ + long created; + /** + * 模型 + */ + String model; + /** + * 结果集 + */ + List choices; + /** + * 使用情况 + */ + Usage usage; +} + diff --git a/src/main/java/com/kwan/spring5/utils/OpenAIChatGpt.java b/src/main/java/com/kwan/spring5/utils/OpenAIChatGpt.java new file mode 100644 index 0000000000000000000000000000000000000000..4f1a144a7f269e5020611bea276d19abfc72c53d --- /dev/null +++ b/src/main/java/com/kwan/spring5/utils/OpenAIChatGpt.java @@ -0,0 +1,99 @@ +package com.kwan.spring5.utils; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson2.JSON; +import com.kwan.spring5.pojo.ChoiceMessage; +import com.kwan.spring5.pojo.Choices; +import com.kwan.spring5.pojo.CompletionChatRequest; +import com.kwan.spring5.pojo.CompletionChatResponse; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * chatgpt-api + * + * @author : qinyingjie + * @version : 2.2.0 + * @date : 2023/3/22 20:40 + */ +public class OpenAIChatGpt { + /** + * 请求地址 + */ + final static private String chatCompletionUrl = "https://api.openai.com/v1/chat/completions"; + /** + * 模型 + */ + final static private String model = "gpt-3.5-turbo"; + /** + * 这里使用你自己的认证信息 + */ + final static private String Authorization = "Bearer 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"; + + + public static void main(String[] args) { + String question = "默写静夜思"; + //这里是我根据模型请求封装的模型实体 + CompletionChatRequest completionChatRequest = new CompletionChatRequest(); + //封装http请求 + HttpRequest post = HttpUtil.createPost(chatCompletionUrl).timeout(300000); + Map headers = new HashMap<>(); + headers.put("Authorization", Authorization); + post.addHeaders(headers); + post.contentType("application/json;charset=UTF-8"); + completionChatRequest.setModel(model); + ChoiceMessage message = new ChoiceMessage("user", question); + List messages = new ArrayList<>(); + messages.add(message); + completionChatRequest.setMessages(messages); + post.body(JSON.toJSONString(completionChatRequest)); + String body = post.execute().body(); + CompletionChatResponse completionChatResponse = JSON.parseObject(body, CompletionChatResponse.class); + final List choices = completionChatResponse.getChoices(); + for (Choices choice : choices) { + final ChoiceMessage message1 = choice.getMessage(); + final String content = message1.getContent(); + System.out.println(content); + } + System.out.println("成功"); + } + +// public static CompletionChatResponse chatCompletion(String prompt) {//prompt即要将要发送至gtp的内容 +// //这里我把用户发送和机器人返回的20条内容内容存在了redis中,用于关联对话上下文场景,如果不需要,注释掉即可,直接new一个ArrayList +// List messages = getUserCacheMessages(); +// int size = messages.size(); +// +// if (size > 19) { +// messages.remove(0); +// } +// +// messages.add(message); +// setUserCacheMessages(messages);//把新的放到redis +// completionChatRequest.setMessages(messages); +// post.body(JSON.toJSONString(completionChatRequest)); +// String body = post.execute().body(); +// CompletionChatResponse completionChatResponse = JSON.parseObject(body, CompletionChatResponse.class); +// return completionChatResponse; +// } +// +// public static List getUserCacheMessages(){ +// RedisCache redisCache = SpringUtils.getBean(RedisCache.class); +// List cacheMessages = redisCache.getCacheObject(JwtTokenUtil.getUserId + ":messages"); +// if (StringUtils.isEmpty(cacheMessages)){ +// cacheMessages= new ArrayList<>(); +// } +// return cacheMessages; +// } +// +// public static void setUserCacheMessages(List messages){ +// while(messages.size()>20){ +// messages.remove(0); +// } +// RedisCache redisCache = SpringUtils.getBean(RedisCache.class); +// redisCache.setCacheObject(JwtTokenUtil.getUserId + ":messages", messages, 30, TimeUnit.MINUTES); +// } +} diff --git a/target/classes/spring1.xml b/target/classes/spring1.xml index 2967571471e9e483f835a39a5d3b0e98f1d5fec4..581483561ef825202cf1e4d68cd7373cb3515e04 100644 --- a/target/classes/spring1.xml +++ b/target/classes/spring1.xml @@ -9,7 +9,6 @@ - - - \ No newline at end of file diff --git a/target/classes/spring23.xml b/target/classes/spring23.xml deleted file mode 100644 index f4b9c04548f93e2346b3afb58d4acae73aca0323..0000000000000000000000000000000000000000 --- a/target/classes/spring23.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - \ No newline at end of file