当前位置:   article > 正文

在 SpringBoot 项目中接入 ChatGPT实例_springboot chatgpt

springboot chatgpt

前言

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>
  • 1
  • 2
  • 3
  • 4
  • 5

二、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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

三、查询接口调用

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;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

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;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

2、结果展示

在这里插入图片描述

五、代理设置

由于chatGpt是国外的服务,通过网络不能直接访问,需要走代理。我们在java启动的时候可以设置代理服务器。
proxyHost为代理服务器,proxyPort为代理端口。
目前代理实现有多中方式,可以通过squid代理整个服务器,可以通过java设置代理整个服务,也可通过http请求设置代理请求。
注意:此处要设置了代理,其他访问可能会存在问题,例如:该服务调用数据库,访问数据库ip同样也会被代理。造成访问连接失败。

java  -jar -Dhttps.proxyPort=7890 -Dhttps.proxyHost=192.100.11.4  xxx.jar 
  • 1

总结

上述是springboot 集成chatGPT的的基本实现。这里只能单线程访问,且频率有限,如果想要做成多线程的可以考虑申请多个OpenAi账号,做成连接池的方式去实现。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/937587
推荐阅读
相关标签
  

闽ICP备14008679号