ChatGPT小程序实战后台部分
- 目的
- 开发准备
- 封装模型调用方法
- 获取已缓存对话上下文方法(可忽略)
- 最新的上下文缓存进去(可忽略)
- 请求模型实体
- 响应实体
- messages实体
- choices实体
- 效果
- 帮我写博客大纲
- 玩游戏
- 总结
- 注意:
目的
最近网上关于ChatGPT的内容特别多,但是浏览大多数文章,能够完整拿来即用的代码却少之又少,索性自己写了一份以** gpt-3.5-turbo ** 模型为基础的demo,技术有限,仅供参考,不喜勿喷!
开发准备
想要进行利用chatGPT进行开发,前提是要申请OpenAI账号,拿到自己的秘钥。这一步劝退了大部分人,但是对于一个技术人来讲,如果连这最基础的准备都无法达到,那也不必继续研究了,网上白嫖其他人的就可以。这里我就不做赘述了!接下来直接进入主题!
封装模型调用方法
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 sk-XXXXXXXXXXXXXXXXX";//这里使用你自己的认证信息public static CompletionChatResponse chatCompletion(String prompt){//prompt即要将要发送至gtp的内容//这里是我根据模型请求封装的模型实体CompletionChatRequest completionChatRequest = new CompletionChatRequest();//封装http请求HttpRequest post = HttpUtil.createPost(chatCompletionUrl).timeout(300000);Map<String, String> 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", prompt);//这里我把用户发送和机器人返回的20条内容内容存在了redis中,用于关联对话上下文场景,如果不需要,注释掉即可,直接new一个ArrayListList<Object> messages = getUserCacheMessages();int size = messages.size();if (size>19){messages.remove(0);}messages.add(message);setUserCacheMessages(messages);//把新的放到rediscompletionChatRequest.setMessages(messages);post.body(JSON.toJSONString(completionChatRequest));String body = post.execute().body();CompletionChatResponse completionChatResponse = JSON.parseObject(body, CompletionChatResponse.class);return completionChatResponse;}
获取已缓存对话上下文方法(可忽略)
public static List<Object> getUserCacheMessages(){RedisCache redisCache = SpringUtils.getBean(RedisCache.class);List<Object> cacheMessages = redisCache.getCacheObject(JwtTokenUtil.getUserId + ":messages");if (StringUtils.isEmpty(cacheMessages)){cacheMessages= new ArrayList<>();}return cacheMessages;}
最新的上下文缓存进去(可忽略)
public static void setUserCacheMessages(List<Object> messages){while(messages.size()>20){messages.remove(0);}RedisCache redisCache = SpringUtils.getBean(RedisCache.class);redisCache.setCacheObject(JwtTokenUtil.getUserId + ":messages", messages, 30, TimeUnit.MINUTES);}
请求模型实体
参数的具体意义,可以自行查阅OpenAI官网进行调整
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;
import java.util.Map;@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class CompletionChatRequest {String model;List<Object> messages;Integer maxTokens;Double temperature;Double topP;Integer n;Boolean stream;Integer logprobs;Boolean echo;List<String> stop;Double presencePenalty;Double frequencyPenalty;Integer bestOf;Map<String, Integer> logitBias;String user;
}
响应实体
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 {String id;String object;long created;String model;List<CompletionChatChoice> choices;Usage usage;
}
messages实体
这里role我只用到了两种,一种是用户,另外就是机器人,其实还可以设置一个系统场景角色
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class ChoiceMessage {String role;String content;
}
choices实体
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class ChoiceMessage {String role;String content;
}
到这里为止,就可以跑main方法进行测试了!
效果
下面是我自己接入的小程序效果示例,,工作效率瞬间提高有没有?
有需要体验的可以找我交流
帮我写博客大纲
玩游戏
总结
当然,请求的内容越详细,机器人的回复也就越精准!快去试试吧!
注意:
国内ip被墙,可能需要科学上网,自行研究!