国内的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
星火还提供了图片生成、图像理解等
其中图像理解挺有意思
可以根据识别出图片
从而回答用户的问题
如果您有兴趣
也可以注册一个免费用户试一试
反正不要钱