织梦手机网站教程视频教程,兰州关键词优化排名,百度做app的网站,做网站哪家公司比较好而且不贵讯飞星火大模型#xff0c;通过websocket方式通信传递协议要求的报文#xff0c;然后将流式返回的报文拼接为完整的响应内容#xff0c;status2时是最后一条消息。因为是websocket方式所以是异步响应的#xff0c;如果想要同步需要使用CountDownLatch控制下线程等待最后一条…讯飞星火大模型通过websocket方式通信传递协议要求的报文然后将流式返回的报文拼接为完整的响应内容status2时是最后一条消息。因为是websocket方式所以是异步响应的如果想要同步需要使用CountDownLatch控制下线程等待最后一条消息处理完再继续往下走。星火不同版本稍微有一些差异具体以官网提供的demo为准。
具体步骤
首先,需要在公网创建应用然后查看服务接口认证信息APPID、APISecret、APIKey、URL。
https://console.xfyun.cn/services/bm3 点应用名称进去查看详情
然后点“文档”查看报文协议可以下载调用示例使用Java代码调用星火api
https://www.xfyun.cn/doc/spark/Web.html
下面仅仅是个示例具体代码要根据官网最新文档确定。注意domain在1.523版本分别传general,generalv2,generalv3传错了会报错10404。另外如果想同步返回结果需要自己使用CountDownLatch控制主线程等待一段时间 countDownLatch.await(30000, TimeUnit.MILLISECONDS); 这样会在指定的最大超时时间内等待。 import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import okhttp3.*;import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.*;/*** 带历史会话的示例*/
public class BigModelNew extends WebSocketListener {// 地址与鉴权信息 https://spark-api.xf-yun.com/v1.1/chat 1.5地址 domain参数为general// 地址与鉴权信息 https://spark-api.xf-yun.com/v2.1/chat 2.0地址 domain参数为generalv2public static final String hostUrl https://spark-api.xf-yun.com/v1/chat;public static final String appid 1234;public static final String apiSecret xxxxx;public static final String apiKey xxxxxxxxxx;public static final String domain general; //1.523版本分别传general,generalv2,generalv3传错了会报错10404public static ListRoleContent historyListnew ArrayList(); // 对话历史存储集合public static String totalAnswer; // 大模型的答案汇总// 环境治理的重要性 环保 人口老龄化 我爱我的祖国public static String NewQuestion ;public static final Gson gson new Gson();// 个性化参数private String userId;private Boolean wsCloseFlag;private static Boolean totalFlagtrue; // 控制提示用户是否输入// 构造函数public BigModelNew(String userId, Boolean wsCloseFlag) {this.userId userId;this.wsCloseFlag wsCloseFlag;}// 主函数public static void main(String[] args) throws Exception {// 个性化参数入口如果是并发使用可以在这里模拟while (true){if(totalFlag){Scanner scannernew Scanner(System.in);System.out.print(我);totalFlagfalse;NewQuestionscanner.nextLine();// 构建鉴权urlString 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) {totalAnswer;WebSocket webSocket client.newWebSocket(request, new BigModelNew(i ,false));}}else{Thread.sleep(200);}}}public static boolean canAddHistory(){ // 由于历史记录最大上线1.2W左右需要判断是能能加入历史int history_length0;for(RoleContent temp:historyList){history_lengthhistory_lengthtemp.content.length();}if(history_length12000){historyList.remove(0);historyList.remove(1);historyList.remove(2);historyList.remove(3);historyList.remove(4);return false;}else{return true;}}// 线程来发送音频与参数class MyThread extends Thread {private WebSocket webSocket;public MyThread(WebSocket webSocket) {this.webSocket webSocket;}public void run() {try {JSONObject requestJsonnew JSONObject();JSONObject headernew JSONObject(); // header参数header.put(app_id,appid);header.put(uid,UUID.randomUUID().toString().substring(0, 10));JSONObject parameternew JSONObject(); // parameter参数JSONObject chatnew JSONObject();chat.put(domain, domain);chat.put(temperature,0.5);chat.put(max_tokens,4096);parameter.put(chat,chat);JSONObject payloadnew JSONObject(); // payload参数JSONObject messagenew JSONObject();JSONArray textnew JSONArray();// 历史问题获取if(historyList.size()0){for(RoleContent tempRoleContent:historyList){text.add(JSON.toJSON(tempRoleContent));}}// 最新问题RoleContent roleContentnew RoleContent();roleContent.roleuser;roleContent.contentNewQuestion;text.add(JSON.toJSON(roleContent));historyList.add(roleContent);message.put(text,text);payload.put(message,message);requestJson.put(header,header);requestJson.put(parameter,parameter);requestJson.put(payload,payload);// System.err.println(requestJson); // 可以打印看每次的传参明细webSocket.send(requestJson.toString());// 等待服务端返回完毕后关闭while (true) {// System.err.println(wsCloseFlag ---);Thread.sleep(200);if (wsCloseFlag) {break;}}webSocket.close(1000, );} catch (Exception e) {e.printStackTrace();}}}Overridepublic void onOpen(WebSocket webSocket, Response response) {super.onOpen(webSocket, response);System.out.print(大模型);MyThread myThread new MyThread(webSocket);myThread.start();}Overridepublic void onMessage(WebSocket webSocket, String text) {// System.out.println(userId 用来区分那个用户的结果 text);JsonParse myJsonParse gson.fromJson(text, JsonParse.class);if (myJsonParse.header.code ! 0) {System.out.println(发生错误错误码为 myJsonParse.header.code);System.out.println(本次请求的sid为 myJsonParse.header.sid);webSocket.close(1000, );}ListText textList myJsonParse.payload.choices.text;for (Text temp : textList) {System.out.print(temp.content);totalAnswertotalAnswertemp.content;}if (myJsonParse.header.status 2) {// 可以关闭连接释放资源System.out.println();System.out.println(*************************************************************************************);if(canAddHistory()){RoleContent roleContentnew RoleContent();roleContent.setRole(assistant);roleContent.setContent(totalAnswer);historyList.add(roleContent);}else{historyList.remove(0);RoleContent roleContentnew RoleContent();roleContent.setRole(assistant);roleContent.setContent(totalAnswer);historyList.add(roleContent);}wsCloseFlag true;totalFlagtrue;}}Overridepublic void onFailure(WebSocket webSocket, Throwable t, Response response) {super.onFailure(webSocket, t, response);try {if (null ! response) {int code response.code();System.out.println(onFailure code: code);System.out.println(onFailure body: response.body().string());if (101 ! code) {System.out.println(connection failed);System.exit(0);}}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}// 鉴权方法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;// System.err.println(preStr);// SHA256加密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));// Base64加密String sha Base64.getEncoder().encodeToString(hexDigits);// System.err.println(sha);// 拼接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();// System.err.println(httpUrl.toString());return httpUrl.toString();}//返回的json结果拆解class JsonParse {Header header;Payload payload;}class Header {int code;int status;String sid;}class Payload {Choices choices;}class Choices {ListText text;}class Text {String role;String content;}class RoleContent{String role;String content;public String getRole() {return role;}public void setRole(String role) {this.role role;}public String getContent() {return content;}public void setContent(String content) {this.content content;}}
}pom.xml
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdorg.example/groupIdartifactIdbig_model/artifactIdversion1.0-SNAPSHOT/versionbuildpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdconfigurationsource8/sourcetarget8/target/configuration/plugin/plugins/buildpropertiesjava.version1.8/java.version/propertiesdependencies!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.67/version/dependency!-- https://mvnrepository.com/artifact/com.google.code.gson/gson --dependencygroupIdcom.google.code.gson/groupIdartifactIdgson/artifactIdversion2.8.5/version/dependency!-- https://mvnrepository.com/artifact/org.java-websocket/Java-WebSocket --dependencygroupIdorg.java-websocket/groupIdartifactIdJava-WebSocket/artifactIdversion1.3.8/version/dependency!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp --dependencygroupIdcom.squareup.okhttp3/groupIdartifactIdokhttp/artifactIdversion4.10.0/version/dependency!-- https://mvnrepository.com/artifact/com.squareup.okio/okio --dependencygroupIdcom.squareup.okio/groupIdartifactIdokio/artifactIdversion2.10.0/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversionRELEASE/versionscopecompile/scope/dependencydependencygroupIdorg.slf4j/groupIdartifactIdslf4j-log4j12/artifactIdversion1.7.25/version/dependency/dependencies/project# Global logging configuration
log4j.rootLoggerDEBUG, stdout
# Console output...
log4j.appender.stdoutorg.apache.log4j.ConsoleAppender
log4j.appender.stdout.layoutorg.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern%5p [%t] - %m%n