前言
ChatGPT(Chatbot Generative Pre-trained Transformer)是一种新型的聊天机器人技术,它可以帮助用户与虚拟助手进行自然语言对话,从而节省时间和解决繁重的任务。ChatGPT使用自然语言处理技术,可以让机器认识自然语言,并分析人类的意图,并根据人类的意图提供相应的回复。ChatGPT可以让机器模仿真实的人类对话,并能智能地回答问题,从而帮助客户解决问题。
一、ChatGpt集成组件
目前java集成chatGPT的组件有很多种,基本实现方法都一样,选择哪种都可以,只要最新的组件都包含chatGPT的相关接口就行,本文选用的为:
<dependency>
<groupId>com.unfbx</groupId>
<artifactId>chatgpt-java</artifactId>
<version>1.0.4</version>
</dependency>
二、OpenAi连接配置
按生成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();
}
}
三、查询接口调用
1、代码实现
实现代码如下:
@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;
}
2、结果展示
四、获取文本向量接口
1、代码实现
实现代码如下:
@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;
}
2、结果展示
五、代理设置
由于chatGpt是国外的服务,通过网络不能直接访问,需要走代理。我们在java启动的时候可以设置代理服务器。
proxyHost为代理服务器,proxyPort为代理端口。
目前代理实现有多中方式,可以通过squid代理整个服务器,可以通过java设置代理整个服务,也可通过http请求设置代理请求。
注意:此处要设置了代理,其他访问可能会存在问题,例如:该服务调用数据库,访问数据库ip同样也会被代理。造成访问连接失败。
java -jar -Dhttps.proxyPort=7890 -Dhttps.proxyHost=192.100.11.4 xxx.jar
总结
上述是springboot 集成chatGPT的的基本实现。这里只能单线程访问,且频率有限,如果想要做成多线程的可以考虑申请多个OpenAi账号,做成连接池的方式去实现。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。