SpringBoot集成ChartGpt
文章目录
- SpringBoot集成ChartGpt
- @[TOC]
- 前言
- 一、ChatGpt集成组件
- 二、OpenAi连接配置
- 三、查询接口调用
- 1、代码实现
- 2、结果展示
- 三、获取文本向量接口
- 1、代码实现
- 2、结果展示
- 四、代理设置
- 总结
文章目录
- SpringBoot集成ChartGpt
- @[TOC]
- 前言
- 一、ChatGpt集成组件
- 二、OpenAi连接配置
- 三、查询接口调用
- 1、代码实现
- 2、结果展示
- 三、获取文本向量接口
- 1、代码实现
- 2、结果展示
- 四、代理设置
- 总结
前言
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";@Beanpublic 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账号,做成连接池的方式去实现
)