Java对接科大讯飞星火大模型V2.0实战

这篇具有很好参考价值的文章主要介绍了Java对接科大讯飞星火大模型V2.0实战。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java对接讯飞认知大模型教程,先注册账号领取免费测试额度

获取个人免费额度

个人免费 购买 星火认知大模型V2.0

获取秘钥

平台地址: 讯飞开放平台

Java对接科大讯飞星火大模型V2.0实战

pom.xml 文件

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.java-websocket</groupId>
        <artifactId>Java-WebSocket</artifactId>
        <version>1.3.8</version>
    </dependency>

    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.8.16</version>
    </dependency>

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.67</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

核心调用类


package com.xunfei;

import cn.hutool.core.codec.Base64;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.digest.HMac;
import com.alibaba.fastjson.JSONObject;
import com.xunfei.domain.RoleContent;
import com.xunfei.domain.request.Request;
import com.xunfei.domain.request.header.Header;
import com.xunfei.domain.request.parameter.Chat;
import com.xunfei.domain.request.parameter.Parameter;
import com.xunfei.domain.request.payload.Message;
import com.xunfei.domain.request.payload.Payload;
import com.xunfei.domain.response.payload.Text;
import com.xunfei.domain.response.Result;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.util.UriComponentsBuilder;


import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 讯飞大模型测试类
 *
 * @author Linzj
 * @date 2023/10/19/019 16:25
 */
public class XunFeiBigModelMain {

    private static final Logger log = LoggerFactory.getLogger(XunFeiBigModelMain.class);

    /**
     * 请求地址
     */
    private static final String HOST_URL = "https://spark-api.xf-yun.com/v2.1/chat";

    /**
     * v2版本
     */
    private static final String DOMAIN_2 = "generalv2";

    /**
     * APPID
     */
    private static final String APPID = "填你自己的";

    /**
     * APISecret
     */
    private static final String API_SECRET = "填你自己的";

    /**
     * APIKey
     */
    private static final String API_KEY = "填你自己的";

    /**
     * user表示是用户的问题
     */
    private static final String ROLE_USER = "user";

    /**
     * assistant表示AI的回复
     */
    private static final String ROLE_ASSISTANT = "assistant";

    /**
     * 接口响应内容集合
     */
    private static final LinkedList<Result> RESULT_LINKED_LIST = new LinkedList<>();

    /**
     * 对话历史存储集合
     */
    public static List<RoleContent> historyList = new LinkedList<>();

    public static void main(String[] args) throws MalformedURLException, URISyntaxException {
        System.out.println("您好,这里是星火认知大模型,请问有什么可以帮您的吗?");
        while (true) {
            Scanner scanner = new Scanner(System.in);
            String content = scanner.nextLine();
            // 如果键入“结束对话”,则跳出循环,终止程序
            if (Objects.equals(content, "结束对话")) {
                System.out.println("好的,再见!");
                break;
            }
            System.out.println("我:" + content);
            websocketClient(getAuthUrl(), createReqParams(content));
        }
    }


    /**
     * websocket 连接
     *
     * @param authUrl   鉴权地址
     * @param reqParams 请求参数
     * @throws URISyntaxException 异常
     */
    private static void websocketClient(String authUrl, String reqParams) throws URISyntaxException {
        String url = authUrl.replace("http://", "ws://").replace("https://", "wss://");
        URI uri = new URI(url);
        WebSocketClient webSocketClient = new WebSocketClient(uri) {
            @Override
            public void onOpen(ServerHandshake serverHandshake) {
                RESULT_LINKED_LIST.clear();
                send(reqParams);
            }

            @Override
            public void onMessage(String s) {
                // 错误码,0表示正常
                final int successCode = 0;
                // 会话状态,2代表最后一个结果
                final int lastStatus = 2;

                Result result = JSONObject.parseObject(s, Result.class);
                com.xunfei.domain.response.header.Header header = result.getHeader();
                if (Objects.equals(successCode, header.getCode())) {
                    RESULT_LINKED_LIST.add(result);
                } else {
                    log.error("大模型接口响应异常,错误码:{},sid:{}", header.getCode(), header.getSid());
                }

                // 如果是最后的结果,整合答复数据打印出来
                if (Objects.equals(lastStatus, header.getStatus())) {
                    printReply();
                }
            }

            @Override
            public void onClose(int i, String s, boolean b) {
                // log.info("WebSocket连接已关闭,原因:{},状态码:{},是否远程关闭:{}", i, s, b);
            }

            @Override
            public void onError(Exception e) {
                log.error("大模型接口调用发生异常,异常原因:{},异常位置:{}", e.getMessage(), e.getStackTrace()[0]);
            }
        };
        webSocketClient.connect();
    }

    /**
     * 生成请求参数
     *
     * @param content 对话内容
     * @return 请求参数
     */
    public static String createReqParams(String content) {
        // 组装接口请求参数
        Header header = new Header();
        header.setAppId(APPID);

        Chat chat = new Chat();
        chat.setDomain(DOMAIN_2);
        Parameter parameter = new Parameter();
        parameter.setChat(chat);

        Message message = new Message();
        if (historyList.isEmpty()) {
            com.xunfei.domain.request.payload.Text text = new com.xunfei.domain.request.payload.Text();
            text.setRole(ROLE_USER);
            text.setContent(content);
            message.setText(Collections.singletonList(text));

            // 添加历史对话集合
            RoleContent roleContent = new RoleContent();
            roleContent.setRole(ROLE_USER);
            roleContent.setContent(content);
            historyList.add(roleContent);
        } else {
            // 添加历史对话集合
            RoleContent roleContent = new RoleContent();
            roleContent.setRole(ROLE_USER);
            roleContent.setContent(content);
            historyList.add(roleContent);
            delHistory();

            List<com.xunfei.domain.request.payload.Text> textList = historyList.stream()
                    .map(item -> {
                        com.xunfei.domain.request.payload.Text text = new com.xunfei.domain.request.payload.Text();
                        text.setContent(item.getContent());
                        text.setRole(item.getRole());
                        return text;
                    })
                    .collect(Collectors.toList());
            message.setText(textList);
        }

        Payload payload = new Payload();
        payload.setMessage(message);

        Request request = new Request();
        request.setHeader(header);
        request.setParameter(parameter);
        request.setPayload(payload);
        return JSONObject.toJSONString(request);
    }


    /**
     * URL鉴权
     *
     * @return 请求url
     * @throws MalformedURLException 异常
     */
    private static String getAuthUrl() throws MalformedURLException {
        String date = DateUtil.format(new Date(), DatePattern.HTTP_DATETIME_FORMAT);
        URL url = new URL(HOST_URL);
        String preStr = "host: " + url.getHost() + "\n" +
                "date: " + date + "\n" +
                "GET " + url.getPath() + " HTTP/1.1";

        HMac hMac = SecureUtil.hmacSha256(API_SECRET.getBytes(StandardCharsets.UTF_8));
        byte[] digest = hMac.digest(preStr);
        String signature = Base64.encode(digest);
        String authorizationOrigin = String.format("api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"",
                API_KEY, "hmac-sha256", "host date request-line", signature);
        String authorization = Base64.encode(authorizationOrigin);
        return UriComponentsBuilder.fromUriString(HOST_URL)
                .queryParam("authorization", authorization)
                .queryParam("date", date)
                .queryParam("host", url.getHost()).toUriString();
    }

    /**
     * 如果历史数据太大,将前面的历史数据清除一些
     */
    public static void delHistory() {
        // 由于历史记录最大上线1.2W左右,如果最大值,删除前面的数据
        final int maxLength = 12000;
        Iterator<RoleContent> iterator = historyList.iterator();
        while (iterator.hasNext()) {
            iterator.next();
            int historyLength = historyList.stream()
                    .map(RoleContent::getContent)
                    .collect(Collectors.joining()).length();
            if (historyLength > maxLength) {
                iterator.remove();
            } else {
                break;
            }
        }
    }

    /**
     * 打印星火认知大模型回复内容
     */
    private static void printReply() {
        String content = RESULT_LINKED_LIST.stream()
                .map(item -> item.getPayload().getChoices().getText())
                .flatMap(Collection::stream)
                .map(Text::getContent)
                .collect(Collectors.joining());
        RoleContent roleContent = new RoleContent();
        roleContent.setRole(ROLE_ASSISTANT);
        roleContent.setContent(content);
        historyList.add(roleContent);
        System.out.println("星火认知大模型:" + content);
    }
}

相关文档

通用鉴权URL生成说明

其他一些实体类就不详细写了,文末有项目地址,可以自行获取,或者照着官方文档自己写一下

最终效果

Java对接科大讯飞星火大模型V2.0实战

对接完成,全部代码已提交至Gitee 讯飞大模型文章来源地址https://www.toymoban.com/news/detail-711445.html

到了这里,关于Java对接科大讯飞星火大模型V2.0实战的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 科大讯飞一季度净亏损同比扩大418%,讯飞星火大模型不灵了?

    近日,科大讯飞公布截至2024年3月31日的一季度业绩报告及2023年年报。财报显示,科大讯飞一季度总营收同比增长26.27%,为36.46亿元;一季度净亏损3亿元,上年同期净亏损5789.5万元,同比扩大418.17%。 科大讯飞2023年总营收为196.5亿元,归母净利润6.57亿元,同比增长17.12%。 营收

    2024年04月25日
    浏览(24)
  • 国内又款智能AI聊天软件-科大讯飞星火模型

    中国科大讯飞星火GPT聊天软件是一款基于自然语言处理技术的人工智能聊天机器人。它利用了大量的文本数据,通过深度学习模型进行训练,从而实现与用户的智能对话。讯飞星火GPT聊天软件能够理解用户输入的问题或指令,并根据预设的回答模式来生成合适的回答。 使用讯

    2024年02月03日
    浏览(47)
  • 免费200万Tokens 用科大讯飞API调用星火大模型服务

    简介 自ChatGPT火了之后,国内的大模型发展如雨后春笋。其中的佼佼者之一就是科大讯飞研发的星火大模型,现在大模型已经更新到V3nbsp;版本,而且对开发者也是相当友好, 注册就送200万tokens ,讯飞1tokensnbsp;约等于nbsp;1.5nbsp;个中文汉字 或者nbsp;0.8nbsp;个英文单词。所以200万to

    2024年01月20日
    浏览(42)
  • 科大讯飞星火模型申请与chatgpt 3.5模型以及new bing的对比

    注册网址: 科大讯飞星火认知大模型 如实填写信息,后面会提示你填写真实姓名,以及公司信息和职位,如实填写即可,如果你是学生,则可以填写学校名称为单位名称,职位填学生即可,过不了多久,会有一个机器人给你注册手机号打电话,询问你单位名称,需要用这个

    2024年02月12日
    浏览(33)
  • chatGPT VS 科大讯飞星火大模型 使用初体验,到底谁更胜一筹?

    下午这会有时间,正好之前申请了讯飞星火大模型的体验,这里就想着简单使用体验对比一下chatGPT和星火大模型的差异,废话不多说这里直接上图: 【诺特兰德叶黄素与纯天然蔬菜中的叶黄素有什么区别】  【今年六月份我就要参加高考了,对于高考我没有很多的实战经验

    2024年02月08日
    浏览(36)
  • 讯飞星火认知大模型V2.0:迈向认知计算的全新时代

    🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础入门篇)》学会Golang语言

    2024年02月12日
    浏览(33)
  • 给ChuanhuChatGPT 配上讯飞星火spark大模型V2.0(一)

    ChuanhuChatGPT 拥有多端、比较好看的Gradio界面,开发比较完整; 刚好讯飞星火非常 大气 ,免费可以领取大概20w(!!!)的token,这波必须不亏,整上。 重要参考: 川虎 Chat 🐯 Chuanhu Chat 讯飞星火认知大模型 基本上实名认证后,可以申请个人免费包,然后来到控制台 开启应

    2024年01月25日
    浏览(23)
  • php对接讯飞星火认知大模型SparkDesk的Web API示例代码

    最近我在给客户开发科大讯飞的星火认知大模型SparkDesk,踩过一些坑,网上几乎搜不到PHP的demo代码,这里模板兔给出以下成果代码供大家参考。 首先,sparkdesk的接口需要使用到websocket,所以我们需要先安装websocket,使用composer在网站根目录安装: 然后就是写php代码: 我把接

    2024年02月10日
    浏览(26)
  • 科大讯飞版ChatGPT开始内测《讯飞星火》

    科大讯飞版ChatGPT产品,提前交卷了! 就在昨夜,讯飞骤然向开发者提供了内测通道,取名为 讯飞星火认知大模型 对外开启内测。 还有个神奇的英文名字Spark Desk,据说有“火花桌面智能助手”的意思。 申请的过程很简单。用电脑或者手机打开这个网址:https://xinghuo.xfyun.c

    2024年02月05日
    浏览(46)
  • 【AI产品测评】垂直领域——AI智能招聘|拉钩招聘HrMind、科大讯飞星火大模型、百度文心一言、金山办公WPSAI 各显神通

    原文地址:【AI产品测评】垂直领域——AI智能招聘|拉钩招聘HrMind、科大讯飞星火大模型、百度文心一言、金山办公WPSAI 各显神通

    2024年02月16日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包