前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >讯飞星火通过API接入

讯飞星火通过API接入

作者头像
编程思维
发布2024-06-25 18:36:54
720
发布2024-06-25 18:36:54
举报

国内的GPT王者讯飞星火

如果你想暴富

可以关注一下科大讯飞

看看它的股票走势

每次讯飞星火发布新版本的时候

都掀起了一个小涨停

科大讯飞作为国内领先的人工智能企业

常年以来积累的优势

包括智能客服、语音识别、机器翻译等

多场景的大量应用

铺垫了海量的训练数据

除了传统的新闻、小说、论文

更多的是在学习和理解人类语言方面

有着巨大的优势

星火大模型2.0

我们前面也介绍过一些讯飞星火的使用

基本上是基于1.5的大模型

在对话、翻译、写作、编程等方面

做到了国内最强

星火的2.0在星火的1.5的基础上

做了更多的提升

比如语音识别、图像识别、自然语言处理等方面

并且开放了API

对程序员来说

可以为自己的项目增加一个新的亮点


传统行业讲究的是“短板理论”

即一个木桶要想不漏水

取决的是最短的哪个木板

即补足自己的弱点

而在IT人的眼里

只有“长板理论”才是极致

唯有发挥自己的专长

做深做强,才有竞争优势

就像鹅厂的社交,天下第一

而自然语言和AI这块

讯飞的优势遥遥领先

星火API

目前已经开放测试

注册用户可以获得百万token的免费额度

我注册完成后

就送了100万的1.5版

以及200万的2.0版

试用绰绰有余

但大家注意,每次请求上下文的文字越多

消耗的量越大

一般正常对话一次就会消耗几百个token

当然也可以购买token

现在的价格1亿token才2800元

实属便宜了

API接入

注册这块就不讲了

进入控制台

先创建一个应用

建好之后就会生成对应的APPID,Secret,Key等信息

这个我们写代码时要用

编码需要一定的WebSocket基础

因为对话有来有往

是一个双向的,带有会话上下文的交互


当然,也支持SDK方式接入

包括Android、IOS、Windows、Linux等

都可以下载SDK包和文档来处理

我们为了演示

采用最简单的ws方式

示范代码

主要分两步

第一步,鉴权

就是将我的应用ID等信息传过去

代码语言:javascript
复制
public static final String hostUrl = "https://spark-api.xf-yun.com/v1.1/chat"; // 1.5的地址,2.0版本,把版本号改成 v2.1
public static final String appid = "1111111"; // 替换成你的appid
public static final String apiSecret = "ZmFlYaskdjfhakdfkZjRm"; // 替换成你的appsecret
public static final String apiKey = "fd4slkdjfhalkwqieurlkjew92baa"; // 替换成你的appkey

public static void main(String[] args) throws Exception {
    // 构建鉴权url
    String authUrl = getAuthUrl(hostUrl, apiKey, apiSecret);
    OkHttpClient client = new OkHttpClient.Builder().build();
    String url = authUrl.toString().replace("http://", "ws://").replace("https://", "wss://");
    Request request = new Request.Builder().url(url).build();
    for (int i = 0; i < 1; i++) {
        WebSocket webSocket = client.newWebSocket(request, new XinghuoChat(i + "", false));
    }
}

public static String getAuthUrl(String hostUrl, String apiKey, String apiSecret) throws Exception {
    URL url = new URL(hostUrl);
    SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);
    format.setTimeZone(TimeZone.getTimeZone("GMT"));
    String date = format.format(new Date());
    String preStr = "host: " + url.getHost() + "\n" + "date: " + date + "\n" + "GET " + url.getPath() + " HTTP/1.1";

    Mac mac = Mac.getInstance("hmacsha256");
    SecretKeySpec spec = new SecretKeySpec(apiSecret.getBytes(StandardCharsets.UTF_8), "hmacsha256");
    mac.init(spec);

    byte[] hexDigits = mac.doFinal(preStr.getBytes(StandardCharsets.UTF_8));
    String sha = Base64.getEncoder().encodeToString(hexDigits);
    String authorization = String.format("api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"", apiKey, "hmac-sha256", "host date request-line", sha);

    // 拼接地址
    HttpUrl httpUrl = Objects.requireNonNull(HttpUrl.parse("https://" + url.getHost() + url.getPath())).newBuilder().//
            addQueryParameter("authorization", Base64.getEncoder().encodeToString(authorization.getBytes(StandardCharsets.UTF_8))).//
            addQueryParameter("date", date).//
            addQueryParameter("host", url.getHost()).//
            build();

    return httpUrl.toString();
}

以上步骤构造了鉴权地址

并向 XinghuoChat 发起对话

这是我们自建的一个类

用于发送信息,并获取AI回复的文字

样例如下:

代码语言:javascript
复制
public class XinghuoChat extends WebSocketListener {
    public static final String myQuestion = "软件需求文档的格式是怎样的"; // 这是我要问的问题
    public static final Gson gson = new Gson();

    private String userId;
    private Boolean wsCloseFlag;

    public XinghuoChat(String userId, Boolean wsCloseFlag) {
        this.userId = userId;
        this.wsCloseFlag = wsCloseFlag;
    }
    
    @Override
    public void onOpen(WebSocket webSocket, Response response) {
        super.onOpen(webSocket, response);
        MyThread myThread = new MyThread(webSocket);
        myThread.start();
    }

    @Override
    public void onMessage(WebSocket webSocket, String text) {
        JsonParse myJsonParse = gson.fromJson(text, JsonParse.class);
        if (myJsonParse.header.code != 0) { 
            webSocket.close(1000, "");
        }
        List<Text> textList = myJsonParse.payload.choices.text;
        for (Text temp : textList) {
            System.out.print(temp.content);
        }
        if (myJsonParse.header.status == 2) {
            wsCloseFlag = true;
        }
    }

    @Override
    public void onFailure(WebSocket webSocket, Throwable t, Response response) {
        super.onFailure(webSocket, t, response);
        try {
            if (null != response) {
                int code = response.code();
                System.out.println("错误码 code:" + code);
                System.out.println("错误信息 body:" + response.body().string());
                if (101 != code) {
                    System.out.println("connection failed");
                    System.exit(0);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

其中使用了一个线程类 MyThread 进行交互

它解决提问发送的功能

可以单独提问请求,也可以加上上下文的对话

代码语言:javascript
复制
public class MyThread extends Thread {
    private WebSocket webSocket;

    public MyThread(WebSocket webSocket) {
        this.webSocket = webSocket;
    }

    public void run() {
        String requestJson; // 请求参数json串
        try {
            requestJson = "{\n" +
                    "  \"header\": {\n" +
                    "    \"app_id\": \"" + appid + "\",\n" +
                    "    \"uid\": \"" + UUID.randomUUID().toString().substring(0, 10) + "\"\n" +
                    "  },\n" +
                    "  \"parameter\": {\n" +
                    "    \"chat\": {\n" +
                    "      \"domain\": \"general\",\n" +
                    "      \"temperature\": 0.5,\n" +
                    "      \"max_tokens\": 1024\n" +
                    "    }\n" +
                    "  },\n" +
                    "  \"payload\": {\n" +
                    "    \"message\": {\n" +
                    "      \"text\": [\n" +
//                        "        {\n" +
//                        "          \"role\": \"user\",\n" +
//                        "          \"content\": \"你是中国人吗\"\n" +
//                        "        },\n" +
//                        "        {\n" +
//                        "          \"role\": \"assistant\",\n" +
//                        "          \"content\": \"是的\"\n" +
//                        "        },\n" +
                    "        {\n" +
                    "          \"role\": \"user\",\n" +
                    "          \"content\": \"" + myQuestion + "\"\n" +
                    "        }\n" +
                    "      ]\n" +
                    "    }\n" +
                    "  }\n" +
                    "}";
            webSocket.send(requestJson);
            while (true) {
                Thread.sleep(200);
                if (wsCloseFlag) {
                    break;
                }
            }
            webSocket.close(1000, "");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

如果只是发送一次对话

只需要里面的 payload.message 有最后一个问题即可

也可以加上前面的对话内容

注意,如果发起了多次交互

则每个来回的问答都要加进去

才会得到连续的交互效果

即上文中注释掉的那段代码

但最大长度不得超过8192 tokens

这样就完成了一个最简单的API交互

其他功能

除了对话交互API

星火还提供了图片生成、图像理解等

其中图像理解挺有意思

可以根据识别出图片

从而回答用户的问题

如果您有兴趣

也可以注册一个免费用户试一试

反正不要钱

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 国内的GPT王者讯飞星火
  • 星火大模型2.0
  • 星火API
  • API接入
  • 示范代码
  • 其他功能
相关产品与服务
语音识别
腾讯云语音识别(Automatic Speech Recognition,ASR)是将语音转化成文字的PaaS产品,为企业提供精准而极具性价比的识别服务。被微信、王者荣耀、腾讯视频等大量业务使用,适用于录音质检、会议实时转写、语音输入法等多个场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档