JAVA项目接入百度文心一言文本对话功能

本文介绍了如何在Java项目中利用OkHttp库与百度云服务进行OAuth授权,并处理用户对话请求,包括从Redis中获取或存储token以优化性能。
摘要由CSDN通过智能技术生成

依赖

        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.0.0</version>
        </dependency>

       

1.获取参数

从百度云获取固定参数

        String client_id = "usl...............";
        String client_secret = "T5xrE5k...............";

2.完整代码
 

package com.center.common.utils;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.common.constants.RedisConstant;
import com.common.core.HttpRequestServer;
import com.common.redis.RedisOperation;
import okhttp3.*;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @description: some desc
 * @author: ccxt
 * @paramete: int
 * @date: 2023/12/9 10:48
 */
@Component
public class ChatGptWenUtil {

    static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build();


    private static  ConcurrentHashMap<Long, String> map = new ConcurrentHashMap<>();


    /**
     * @param uid 用户id
     * @param redisOperation redis工具类
     * 用户 获取自己的token标识,因token数量有限,所以存放token时间较长
     */
    public static void getToken(Long uid,RedisOperation redisOperation) throws IOException {
        String client_id = "usl8CQ....................";
        String client_secret = "T5xrE.......................";
        String grant_type = "client_credentials";
        MediaType mediaType = MediaType.parse("application/json");
        RequestBody body = RequestBody.create(mediaType, "");
        Request request = new Request.Builder()
                .url("https://aip.baidubce.com/oauth/2.0/token?client_id=" + client_id + "&client_secret=" + client_secret + "&grant_type=" + grant_type)
                .method("POST", body)
                .addHeader("Content-Type", "application/json")
                .addHeader("Accept", "application/json")
                .build();
        Response response = HTTP_CLIENT.newCall(request).execute();
        if (response.body()==null){
            throw new RuntimeException("accessToken 获取失败");
        }
        String string = response.body().string();
        JSONObject jsonObject = JSON.parseObject(string);
        String accessToken = (String) jsonObject.get("access_token");
        //将token放入redis中 设置27 天过期时间,原token一个月过期时间,token数量有限
        String key = RedisConstant.CACHE_SIGN + RedisConstant.USER_WEN_XIN_YI_YAN_TOKEN;
        redisOperation.hset(key,uid.toString(),accessToken, 27 * 24 * 3600);
    }

    /**
     * @param uid  用户 id
     * @param redisOperation redis工具类
     *从redis中获取用户的token,放入临时缓存中
     */
    private static void getTokenByMap(Long uid,RedisOperation redisOperation) {
        String key = RedisConstant.CACHE_SIGN + RedisConstant.USER_WEN_XIN_YI_YAN_TOKEN;
        Object o = redisOperation.hget(key,uid.toString());
        if (o !=null){
            map.put(uid, o.toString());
        }
    }

    /**
     * @param msg 对话消息
     * @param uid 用户 id
     * @param redisOperation redis工具类
     * @return {@code JSONObject }
     * redis中有改用户信息,从redis中获取该用户token,放入临时缓存中
     */
    public static JSONObject ChatGptDialogueCall(HashMap<String, String> msg, Long uid,RedisOperation redisOperation) throws IOException {
        ArrayList<HashMap> messages = new ArrayList<>();
        messages.add(msg);
        HashMap<String, Object> requestBody = new HashMap<>();
        requestBody.put("messages", messages);
        String outputStr = JSON.toJSONString(requestBody);
        String token = null;
        // 从缓存中获取token
        token = map.get(uid);
        if (StringUtils.isEmpty(token)) {
            // 从redis中获取token放入临时缓存中
            getTokenByMap(uid,redisOperation);
            token = map.get(uid);
            if (StringUtils.isEmpty(token)){
                // 调用百度云接口获取token放入redis中
                getToken(uid,redisOperation);
                getTokenByMap(uid,redisOperation);
                token = map.get(uid);
            }
        }
        JSONObject info = new JSONObject();
        String path = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant?access_token=" + token;
        JSONObject object = HttpRequestServer.wenChatGpt(path, "POST", outputStr, "application/json");
        if (object.containsKey("error_code")) {
            info.put("error_code", object.getString("error_code"));
            info.put("error_msg", object.getString("error_msg"));
            return info;
        }
        String result = object.getString("result");
        info.put("uid", uid);
        info.put("result", result);
        return info;
    }

    /**
     * @param uid 用户 id
     * 用户 退出时 清除存放token临时缓存的方法
     */
    public static void deleteMapToken(Long uid){
        map.remove(uid);
    }

}

3.调用代码
 

        try {
            HashMap<String, String> map = new HashMap<>();
            // 固定参数
            map.put("role", "user");
            map.put("content", "对话内容");
            jsonObject = ChatGptWenUtil.ChatGptDialogueCall(map, uid, redisOperation);
        } catch (Exception e) {
            e.printStackTrace();
        }

  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值