前言

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、结果展示

image.png

四、获取文本向量接口

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、结果展示

image.png

五、代理设置

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

总结

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


JEECG低代码平台
664 声望84 粉丝