讯飞星火通过API接入

国内的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等信息传过去

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回复的文字

样例如下:

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 进行交互

它解决提问发送的功能

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

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

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

其中图像理解挺有意思

可以根据识别出图片

从而回答用户的问题

如果您有兴趣

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

反正不要钱

### 如何在微信小程序中接入讯飞星火对话API #### 准备工作 为了成功集成讯飞星火对话API至微信小程序,需确保已获取必要的API密钥和其他认证凭证。这通常涉及注册成为开发者并创建项目来获得访问权限[^1]。 #### 获取API接口信息 进入讯飞星火提供的官方API接口文档页面,仔细阅读有关于如何调用服务的具体指南以及参数设置说明。特别注意关于请求方式、URL路径、HTTP头字段等细节描述。 #### 微信环境准备 对于希望直接操作桌面版微信实现自动化交互的情况,可以利用`uiautomation`库控制微信客户端窗口对象完成初步连接配置: ```python import uiautomation as auto wx = auto.WindowControl(Name="微信", ClassName='WeChatMainWndForPC') wx.SwitchToThisWindow() ``` 然而,在微信小程序环境下并不适用上述方法,因为小程序运行在一个受限的安全沙箱内,不允许直接操控宿主设备上的应用程序实例[^2]。 #### 小程序端开发要点 针对微信小程序平台特性调整方案如下: - **服务器搭建**:由于安全策略限制,前端无法直接向第三方发起网络请求;因此建议通过自建Node.js或其他后端框架作为中介代理转发数据给讯飞星火API,并处理返回的结果再响应给小程序。 - **消息收发机制**:参照终端代码样例设计一套适用于小程序的消息传递协议,用于封装用户输入及展示来自AI的回答内容。此部分具体实现依赖于所选编程语言和技术栈的选择[^3]。 - **调试工具运用**:当遇到问题时可借助Docker容器化技术简化本地测试流程,比如查看后台日志输出帮助排查错误原因: ```bash docker logs -f chatgpt-on-wechat ``` 该命令能够持续跟踪记录文件变化以便及时发现潜在异常情况[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全粘架构师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值