赞
踩
ChatGPT(Chatbot Generative Pre-trained Transformer)是一种新型的聊天机器人技术,它可以帮助用户与虚拟助手进行自然语言对话,从而节省时间和解决繁重的任务。ChatGPT使用自然语言处理技术,可以让机器认识自然语言,并分析人类的意图,并根据人类的意图提供相应的回复。ChatGPT可以让机器模仿真实的人类对话,并能智能地回答问题,从而帮助客户解决问题。
目前java集成chatGPT的组件有很多种,基本实现方法都一样,选择哪种都可以,只要最新的组件都包含chatGPT的相关接口就行,本文选用的为:
<dependency>
<groupId>com.unfbx</groupId>
<artifactId>chatgpt-java</artifactId>
<version>1.0.4</version>
</dependency>
按生成OpenAi的连接客户端,主要配置apiKey(申请秘钥,官网购买),连接超时时间,读取超时时间,写入超时时间等。代码如下:
@Configuration
public class OpenAiConfig {
private final static String token = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxx";
@Bean
public OpenAiClient createClient() {
return OpenAiClient.builder().apiKey(token)
.connectTimeout(1000*60*3) //3分钟还没连接上就失败
.readTimeout(1000*60*3)
.writeTimeout(1000*60*3)
.build();
}
}
实现代码如下:
@ApiOperation(value = "问题接口(接口调用)", notes = "问题接口(接口调用)") @PostMapping(value = "/query/v2") public List<Message> questionV2(@RequestBody ContentParamVo paramVo) { Message message = Message.builder() .role(Message.Role.USER) // 设置体温者角色,不需要填写默认值 .content(paramVo.getContent()) // 问题内容 .build(); ChatCompletion chatCompletion = ChatCompletion.builder() .model("gpt-3.5-turbo") // 模型选择(chatGPT 默认为这个) .messages(Arrays.asList(message)) // 问题。一次课问答多条数据 .stream(false) // 是否是流式问答,我选择的不是,需要等gpt回答完才能拿到完整数据 .build(); ChatCompletionResponse chatCompletionResponse = null; for (int i = 0; i < 3; i++) { // 失败的话会调用三次 try { chatCompletionResponse = openAiClient.chatCompletion(chatCompletion); break; } catch (Exception e) { log.info("异常:{}", e.getMessage()); } } List<Message> list = new ArrayList<>(); chatCompletionResponse.getChoices().forEach(e -> { list.add(e.getMessage()); }); return list; }
实现代码如下:
@ApiOperation(value = "获取向量", notes = "获取向量") @PostMapping(value = "/embedding/get") public VectorResponse createEmbeddings(@RequestBody ContentParamVo paramVo) { //paramVo.getContent() 文本内容 EmbeddingResponse embeddings = openAiClient.embeddings(paramVo.getContent()); List<Item> data = embeddings.getData(); VectorResponse vectorResponse = new VectorResponse(); List<VectorContent> list = Lists.newArrayList(); //自己定义的数据结构 for (Item item : data) { VectorContent vectorContent = VectorContent.builder() .index(item.getIndex()) .embedding(bigDecimerToFloat(item.getEmbedding())) .object(item.getObject()) .build(); list.add(vectorContent); } vectorResponse.setData(list); return vectorResponse; } // 将double转为float向量,可能存在精度丢失问题 private static List<Float> bigDecimerToFloat(List<BigDecimal> embedding) { List<Float> list = new ArrayList(); for (BigDecimal decimal : embedding) { list.add(decimal.setScale(11, BigDecimal.ROUND_HALF_UP).floatValue()); } return list; }
由于chatGpt是国外的服务,通过网络不能直接访问,需要走代理。我们在java启动的时候可以设置代理服务器。
proxyHost为代理服务器,proxyPort为代理端口。
目前代理实现有多中方式,可以通过squid代理整个服务器,可以通过java设置代理整个服务,也可通过http请求设置代理请求。
注意:此处要设置了代理,其他访问可能会存在问题,例如:该服务调用数据库,访问数据库ip同样也会被代理。造成访问连接失败。
java -jar -Dhttps.proxyPort=7890 -Dhttps.proxyHost=192.100.11.4 xxx.jar
上述是springboot 集成chatGPT的的基本实现。这里只能单线程访问,且频率有限,如果想要做成多线程的可以考虑申请多个OpenAi账号,做成连接池的方式去实现。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。