浅用一下免费的GPT模型:Yi-34B-Chat

涉及的HTTP工具类,见https://blog.csdn.net/qq_37686944/article/details/136424921

package com.station.gpt;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.station.utils.HttpUtil;
import lombok.Data;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.utils.Lists;

import java.util.HashMap;
import java.util.List;
import java.util.Optional;
import java.util.Scanner;

/**
 * Yi-34B-Chat调用demo
 *
 * 百度智能云千帆大模型平台:Yi-34B-Chat。目前在线服务免费使用,其它模型根据token按量计费
 *
 * 1、模型使用说明:
 * https://console.bce.baidu.com/qianfan/ais/console/onlineService
 *
 * 2、AKSK,即生成签名token时的CLIENT_ID和CLIENT_SECRET:
 * 创建应用后,API Key和Secret Key分别对应CLIENT_ID和CLIENT_SECRET
 * https://console.bce.baidu.com/qianfan/ais/console/applicationConsole/application
 *
 */
@Slf4j
public class WenXinChat {

    private static final ThreadLocal<ChatContext> CHAT_CONTEXT_THREAD_LOCAL = new ThreadLocal<>();

    private static final String CLIENT_ID = "见上方文档说明";

    private static final String CLIENT_SECRET = "见上方文档说明";

    public String addChatMessage(String message) {
        ChatContext chatContext = CHAT_CONTEXT_THREAD_LOCAL.get();
        chatContext = Optional.ofNullable(chatContext).orElseGet(ChatContext::new);
        String token = chatContext.getToken();
        token = Optional.ofNullable(token).orElse(calToken());
        List<ChatMessage> chatMessageList = chatContext.getChatMessageList();
        chatMessageList = Optional.ofNullable(chatMessageList).orElseGet(Lists::newArrayList);
        ChatMessage chatMessage = new ChatMessage().setRole(ChatRole.USER.getRoleName()).setContent(message);
        chatMessageList.add(chatMessage);
        chatContext.setToken(token);
        chatContext.setChatMessageList(chatMessageList);
        setContext(chatContext);
        return getChatResponse(chatContext);
    }

    private void setContext(ChatContext chatContext) {
        CHAT_CONTEXT_THREAD_LOCAL.set(chatContext);
    }

    private void removeContext() {
        CHAT_CONTEXT_THREAD_LOCAL.remove();
    }

    private String calToken() {
        String response = HttpUtil.postJson("https://aip.baidubce.com/oauth/2.0/token",
                null,
                new HashMap<String, Object>() {{
                    put("grant_type", "client_credentials");
                    put("client_id", CLIENT_ID);
                    put("client_secret", CLIENT_SECRET);
                }},
                null);
        return Optional.ofNullable(response)
                .map(JSON::parseObject)
                .map(e -> e.getString("access_token"))
                .orElseThrow(() -> new RuntimeException("获取token失败"));
    }

    private String getChatResponse(ChatContext chatContext) {
        String response = HttpUtil.postJson("https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/yi_34b_chat",
                null,
                new HashMap<String, Object>() {{
                    put("access_token", chatContext.getToken());
                }},
                new JSONObject().fluentPut("messages", JSON.toJSON(chatContext.getChatMessageList())));
        return Optional.ofNullable(response)
                .map(JSON::parseObject)
                .map(e -> e.getString("result"))
                .map(chatResponse -> {
                    CHAT_CONTEXT_THREAD_LOCAL
                            .get()
                            .getChatMessageList()
                            .add(new ChatMessage().setRole(ChatRole.ASSISTANT.getRoleName()).setContent(chatResponse));
                    return chatResponse;
                })
                .orElseThrow(() -> new RuntimeException("获取chat结果失败"));
    }

    public static void main(String[] args) {
        WenXinChat wenXinChat = new WenXinChat();
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextLine()) {
            String sendMessage = scanner.nextLine();
            String receiveMessage = null;
            try {
                receiveMessage = wenXinChat.addChatMessage(sendMessage);
                log.info("助手回答:{}", receiveMessage);
            } catch (Exception e) {
                log.error("对话异常:{}" + e.getMessage());
                wenXinChat.removeContext();
            }
        }
        wenXinChat.removeContext();
    }


    @Data
    static class ChatContext {
        private String token;
        private List<ChatMessage> chatMessageList;
    }

    @Data
    @Accessors(chain = true)
    static class ChatMessage {
        private String role;
        private String content;
    }

    enum ChatRole {

        USER("user"),

        ASSISTANT("assistant");

        private String roleName;

        ChatRole(String roleName) {
            this.roleName = roleName;
        }

        public String getRoleName() {
            return roleName;
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值