package com.slibra.web.controller.business; import com.alibaba.fastjson2.JSONWriter; import com.alibaba.fastjson2.JSON; import com.google.protobuf.ByteString; import com.qiniu.util.Json; import com.slibra.business.domain.TXinyiChatRecord; import com.slibra.business.domain.TXinyiDaily; import com.slibra.business.domain.TXinyiIndustry; import com.slibra.business.domain.TXinyiNormConfig; import com.slibra.business.mapper.*; import com.slibra.business.req.ChatReq; import com.slibra.business.req.DecisionReq; import com.slibra.common.core.controller.BaseController; import com.slibra.common.core.domain.AjaxResult; import com.slibra.common.core.domain.R; import com.slibra.common.utils.DateUtils; import com.slibra.common.utils.SecurityUtils; import com.slibra.common.utils.StringUtils; import com.slibra.common.utils.uuid.IdUtils; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringEscapeUtils; import org.pytorch.serve.grpc.inference.InferenceAPIsServiceGrpc; import org.pytorch.serve.grpc.inference.PredictionResponse; import org.pytorch.serve.grpc.inference.PredictionsRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.math.RoundingMode; import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.*; import static com.slibra.common.constant.MyConstants.WARNING_DEFAULT_CREATE; /** * 告警相关 */ @RestController @RequestMapping("/grpc") @Slf4j public class GRPCController extends BaseController { @Autowired private TXinyiChatRecordMapper chatRecordMapper; @Autowired private TXinyiIndustryMapper xinyiIndustryMapper; @Autowired private TXinyiDailyMapper xinyiDailyMapper; @Autowired private TXinyiChatRecordMapper xinyiChatRecordMapper; /*private InferenceAPIsServiceGrpc.InferenceAPIsServiceBlockingStub getStub(){ return InferenceAPIsServiceGrpc.newBlockingStub(ManagedChannelBuilder.forAddress("10.0.0.24", 17070) .usePlaintext() .build()); }*/ /** * 调⽤大模型决策接口 * @return */ @PostMapping(value = "/decisionStream") public void decisionStream(HttpServletResponse response, @RequestBody ChatReq chatReq) // public void decisionStream(HttpServletResponse response, ChatReq chatReq) { log.info("进入了调⽤大模型决策接口"); // StringBuilder sb = new StringBuilder(); //大模型结果 放入一个结合中 List resultData = new ArrayList<>(); //决策和问答不一样 没有历史的概念 所以sessionId都是新的 次数都是1 String sessionId = IdUtils.simpleUUID(); String feedback = chatReq.getFeedback(); //决策请求的业务参数 // List> list = this.xinyiIndustryMapper.selectLast10RecordsForDecision(); //2024年5月21日15:23:07 这里不能用关联查询处理,日报要获取最新的一条而不是今日的数据。 List decisionReqs = this.xinyiIndustryMapper.selectLast10RecordsForDecisionOnlyIndustry(); if(!CollectionUtils.isEmpty(decisionReqs)){ for (DecisionReq decisionReq : decisionReqs) { //处理日报数据 TXinyiDaily daily = this.xinyiDailyMapper.selectNewestData(); if(!Objects.isNull(daily)){ decisionReq.setT(daily.getJsSw()); decisionReq.setSVI(daily.getWntjzsAll()); decisionReq.setSV(daily.getWncjbAll()); decisionReq.setMlvss(daily.getHfxwnndAll()); decisionReq.setDoAna(daily.getYycRjyAll()); decisionReq.setDoQue(daily.getQycRjyAll()); BigDecimal jsBod5 = daily.getJsBod5(); decisionReq.setBodIn(jsBod5); BigDecimal tpIn = decisionReq.getTpIn(); BigDecimal tnIn = decisionReq.getTnIn(); if(!Objects.isNull(jsBod5)){ if(!Objects.isNull(tpIn) && tpIn.compareTo(new BigDecimal("0")) >0){ decisionReq.setC(jsBod5.divide(tpIn, 4, RoundingMode.HALF_UP)); } if(!Objects.isNull(tnIn) && tnIn.compareTo(new BigDecimal("0")) >0){ decisionReq.setB(jsBod5.divide(tnIn, 4, RoundingMode.HALF_UP)); } } } } } String rows = JSON.toJSONString(decisionReqs, JSONWriter.Feature.WriteNulls); // 获取输出流 OutputStream outputStream = null; ManagedChannel channel = null; response.setContentType("text/plain"); response.setCharacterEncoding("utf-8"); String dataJson = ""; try { channel = ManagedChannelBuilder.forAddress("10.0.0.24", 17070) .usePlaintext() .build(); InferenceAPIsServiceGrpc.InferenceAPIsServiceBlockingStub stub = InferenceAPIsServiceGrpc.newBlockingStub(channel); dataJson = "{\"bot_id\":\"b00001\",\"exp_id\":\"721\",\"norm\":\"" + chatReq.getCategory() + "\",\"feedback\":" + feedback + ",\"session_id\":" + "\"" + sessionId + "\"" + ",\"generate_args\":{\"max_new_tokens\":1024,\"max_length\":4096,\"num_beams\":1,\"do_sample\":true,\"top_p\":0.7,\"temperature\":0.95},\"extra\":{\"rows\":" + rows + "}}"; log.info("请求大模型的决策的参数为{}", dataJson); PredictionsRequest request = PredictionsRequest.newBuilder() .setModelName("slibra_bot") .putInput("method", ByteString.copyFrom("decision_stream", "utf-8"))//推理 .putInput("data", ByteString.copyFrom(dataJson, "utf-8")) .buildPartial(); outputStream = response.getOutputStream(); Iterator predictions = stub.streamPredictions(request); while (predictions.hasNext()) { String responseStr = predictions.next().getPrediction().toStringUtf8(); log.info("决策流式返回的结果是{}", responseStr); responseStr = JSON.parseObject(responseStr).getString("message"); if("complete".equals(responseStr)){ System.out.println("结尾语句并且是非JSON,无需处理"); }else{ // sb.append(responseStr); resultData.add(responseStr); outputStream.write(responseStr.getBytes()); outputStream.flush(); } // todo 类型判断处理 } } catch (Exception e) { // throw new RuntimeException(e); log.error("处理大模型推理异常,异常信息为{}", JSON.toJSONString(e)); } finally { System.out.println(JSON.toJSONString(resultData)); //保存聊天记录 //将问答更新到数据库中 chatReq.setSessionId(sessionId); chatReq.setType(1);//0问答 1决策 chatReq.setModule(3);//0=专家问答,1=智能工单,2=智能体助手,3.告警 // String showVal = this.buildShowValue(tXinyiWarningRecord, tXinyiIndustry, normConfig); chatReq.setShowVal(feedback);//前端展示的数据和提问的数据不一致 chatReq.setQuestion(dataJson); chatReq.setAnswer(JSON.toJSONString(resultData)); chatReq.setWarningId(String.valueOf(chatReq.getWarningId())); chatReq.setCounts(1);//问答次数 String userId = SecurityUtils.getUserId().toString(); String username = SecurityUtils.getUsername(); chatReq.setUserId(userId); chatReq.setCreateBy(username); chatReq.setCreateTime(DateUtils.getNowDate()); this.xinyiChatRecordMapper.insertTXinyiChatRecord(chatReq); // 关闭输出流 try { outputStream.close(); } catch (IOException e) { throw new RuntimeException(e); }finally { channel.shutdown(); } } } /** * RAG+⼤模型的调⽤参数 * @return */ @PostMapping(value = "/inferStreamRag") public void inferStreamRag(HttpServletResponse response, @RequestBody ChatReq chatReq) { // public void inferStreamRag(HttpServletResponse response, ChatReq chatReq) { log.info("进入了调⽤RAG+⼤模型的调⽤参数"); StringBuilder sb = new StringBuilder(); String sessionId = chatReq.getSessionId(); String question = chatReq.getQuestion(); int counts = 1;//默认是第一次 List historyDates = new ArrayList<>(); //查询历史数据,放入集合中 if(StringUtils.isBlank(sessionId)) sessionId= IdUtils.simpleUUID();//第一次 else{ //通过sessionId获取所有的问答记录 List chatRecords = this.chatRecordMapper.selectTXinyiChatRecordList(TXinyiChatRecord.builder().sessionId(sessionId).build()); if(!CollectionUtils.isEmpty(chatRecords)){ for (TXinyiChatRecord chatRecord : chatRecords) { historyDates.add(chatRecord.getQuestion()); historyDates.add(chatRecord.getAnswer()); } //问答次数增加 counts = chatRecords.size() + 1; } } //将新的问题放入集合中 historyDates.add(question); // 获取输出流 OutputStream outputStream = null; ManagedChannel channel = null; response.setContentType("text/plain"); response.setCharacterEncoding("utf-8"); try { channel = ManagedChannelBuilder.forAddress("10.0.0.24", 17070) .usePlaintext() .build(); InferenceAPIsServiceGrpc.InferenceAPIsServiceBlockingStub stub = InferenceAPIsServiceGrpc.newBlockingStub(channel); String dataJson = "{\"bot_id\":\"721\",\"exp_id\":\"721\",\"session_id\":\"" + sessionId + "\",\"use_rag\":\"true\",\"prompt\":\"你是⼀个资深⽔务领域专家,能回答各种⽔务相关问题\",\"history_dia\":" + JSON.toJSONString(historyDates) + ",\"generate_args\":{\"max_new_tokens\":2048,\"max_length\":4096,\"num_beams\":1,\"do_sample\":true,\"top_p\":0.7,\"temperature\":0.95},\"extra\":{}}"; System.out.println(dataJson); PredictionsRequest request = PredictionsRequest.newBuilder() .setModelName("slibra_bot") .putInput("method", ByteString.copyFrom("infer_stream", "utf-8"))//推理 .putInput("data", ByteString.copyFrom(dataJson, "utf-8")) .buildPartial(); outputStream = response.getOutputStream(); Iterator predictions = stub.streamPredictions(request); outputStream.write("begin".getBytes()); outputStream.flush(); //将结果记录到问答表 while (predictions.hasNext()) { String responseStr = predictions.next().getPrediction().toStringUtf8(); System.out.println(responseStr); responseStr = JSON.parseObject(responseStr).getString("message"); if("complete".equals(responseStr)){ System.out.println("结尾语句并且是非JSON,无需处理"); }else{ sb.append(responseStr); outputStream.write(responseStr.getBytes()); outputStream.flush(); } //把SessionId返回给前端 outputStream.write(sessionId.getBytes()); outputStream.flush(); } } catch (IOException e) { throw new RuntimeException(e); } finally { // System.out.println(sb.toString()); //将问答更新到数据库中 chatReq.setSessionId(sessionId); chatReq.setAnswer(sb.toString()); chatReq.setType(0);//0问答 1决策 chatReq.setModule(0);//0=专家问答,1=智能工单,2=智能体助手,3.告警 chatReq.setShowVal(question); chatReq.setCounts(counts);//问答次数 String userId = SecurityUtils.getUserId().toString(); String username = SecurityUtils.getUsername(); chatReq.setUserId(userId); chatReq.setCreateBy(username); chatReq.setCreateTime(DateUtils.getNowDate()); this.chatRecordMapper.insertTXinyiChatRecord(chatReq); // 关闭输出流 try { outputStream.close(); } catch (IOException e) { throw new RuntimeException(e); }finally { channel.shutdown(); } } // return AjaxResult.success("ok"); } public static void main(String[] args) { String encoded = "\\345\\216\\214\\346\\260\\247\\346\\261\\240\\347\\241\\235\\351\\205\\270\\347\\233\\220\\346\\260\\256\\346\\230\\257\\345\\220\\246\\345\\244\\247\\344\\272"; String decoded = decodeOctalToUtf8(encoded); System.out.println(decoded); } public static String decodeOctalToUtf8(String encoded) { // 移除反斜杠 String octalSequence = encoded.replaceAll("\\\\", ""); // 检查长度是否是3的倍数 if (octalSequence.length() % 3 != 0) { throw new IllegalArgumentException("Encoded string length is not a multiple of 3"); } byte[] bytes = new byte[octalSequence.length() / 3]; for (int i = 0, j = 0; i < octalSequence.length(); i += 3, j++) { // 提取每三个字符的八进制数 String octal = octalSequence.substring(i, i + 3); // 将八进制数转换为字节 bytes[j] = (byte) Integer.parseInt(octal, 8); } // 将字节序列转换为UTF-8编码的字符串 return new String(bytes, StandardCharsets.UTF_8); } /** * ⼤模型问答的调⽤参数 * @return */ @GetMapping(value = "/inferStreamCommon") // public void inferStreamCommon(HttpServletResponse response, @RequestBody ChatReq chatReq) public void inferStreamCommon(HttpServletResponse response, ChatReq chatReq) { log.info("进入了调⽤⼤模型问答的调⽤参数"); StringBuilder sb = new StringBuilder(); // 获取输出流 OutputStream outputStream = null; ManagedChannel channel = null; response.setContentType("text/plain"); response.setCharacterEncoding("utf-8"); try { channel = ManagedChannelBuilder.forAddress("10.0.0.24", 17070) .usePlaintext() .build(); InferenceAPIsServiceGrpc.InferenceAPIsServiceBlockingStub stub = InferenceAPIsServiceGrpc.newBlockingStub(channel); String dataJson = "{\"bot_id\":\"721\",\"exp_id\":\"721\",\"session_id\":\"C20231025153549AC11FC2905668524\",\"use_rag\":\"false\",\"prompt\":\"你是⼀个资深⽔务领域专家,能回答各种⽔务相关问题\",\"history_dia\":[\"什么是BOD\"],\"generate_args\":{\"max_new_tokens\":2048,\"max_length\":4096,\"num_beams\":1,\"do_sample\":true,\"top_p\":0.7,\"temperature\":0.95},\"extra\":{}}"; System.out.println(dataJson); PredictionsRequest request = PredictionsRequest.newBuilder() .setModelName("slibra_bot") .putInput("method", ByteString.copyFrom("infer_stream", "utf-8"))//推理 .putInput("data", ByteString.copyFrom(dataJson, "utf-8")) .buildPartial(); outputStream = response.getOutputStream(); Iterator predictions = stub.streamPredictions(request); while (predictions.hasNext()) { String responseStr = predictions.next().getPrediction().toStringUtf8(); System.out.println(responseStr); responseStr = JSON.parseObject(responseStr).getString("message"); if("complete".equals(responseStr)){ System.out.println("结尾语句并且是非JSON,无需处理"); }else{ sb.append(responseStr); outputStream.write(responseStr.getBytes()); outputStream.flush(); } } } catch (IOException e) { throw new RuntimeException(e); } finally { System.out.println(sb.toString()); // 关闭输出流 try { outputStream.close(); } catch (IOException e) { throw new RuntimeException(e); }finally { channel.shutdown(); } } // return AjaxResult.success("ok"); } /** * 调⽤大模型决策接口-第二次 * @return */ @GetMapping(value = "/decisionStreamTwo") // public void decisionStreamTwo(HttpServletResponse response, @RequestBody ChatReq chatReq) public void decisionStreamTwo(HttpServletResponse response) { log.info("进入了调⽤大模型决策接口-第二次"); StringBuilder sb = new StringBuilder(); // 获取输出流 OutputStream outputStream = null; ManagedChannel channel = null; response.setContentType("text/plain"); response.setCharacterEncoding("utf-8"); try { channel = ManagedChannelBuilder.forAddress("10.0.0.24", 17070) .usePlaintext() .build(); InferenceAPIsServiceGrpc.InferenceAPIsServiceBlockingStub stub = InferenceAPIsServiceGrpc.newBlockingStub(channel); // String dataJson = "{\"bot_id\":\"b00001\",\"exp_id\":\"721\",\"norm\":\"出⽔总磷\",\"feedback\":{\"6_3\":\"超标\",\"2_24\":\"是\"},\"session_id\":\"C20231025153549AC11FC2905668533\",\"generate_args\":{\"max_new_tokens\":1024,\"max_length\":4096,\"num_beams\":1,\"do_sample\":false,\"top_p\":1,\"temperature\":0},\"extra\":{\"rows\":[{\"ID\":914496,\"TEST_DATE\":\"2024/02/07\",\"TEST_HOUR\":\"2024/02/07 08\",\"COD_in\":218.06134033203126,\"COD_in_name\":630.0,\"COD_off\":18.75,\"COD_off_name\":40.0,\"COD_off_con\":32.0,\"TP_in\":4.0364580154418949,\"TP_in_name\":7.099999904632568,\"TP_off\":0.10069400072097779,\"TP_off_name\":0.5,\"TP_off_con\":0.30000001192092898,\"TN_in\":41.27314758300781,\"TN_in_name\":65.0,\"TN_off\":11.80555534362793,\"TN_off_name\":15.0,\"TN_off_con\":12.0,\"andan_in\":33.0555534362793,\"andan_in_name\":58.0,\"andan_off\":1.0648150444030762,\"andan_off_name\":4.0,\"andan_off_con\":3.200000047683716,\"SS_in\":292.53472900390627,\"SS_in_name\":315.0,\"SS_off\":1.9675920009613038,\"SS_off_name\":10.0,\"SS_off_con\":8.0,\"TDS_in\":639.4675903320313,\"TDS_in_name\":600.0,\"T\":12.399999618530274,\"pH\":7.360531806945801,\"Q_in\":2084.0,\"Q_in_name\":4166.669921875,\"continuity\":\"\",\"check_rise\":\"\",\"time_tips\":\"\",\"cs_continuity\":\"\",\"SVI\":\"[187.852223,188.139059]\",\"SVI_con\":170.0,\"SV\":\"[90.000000,92.000000]\",\"SV_con\":80.0,\"MLVSS\":\"[1987.000000,2064.000000]\",\"MLSS\":\"[4645.833496,4077.256836]\",\"MLVSS_wentai\":\"\",\"MLSS_wentai\":\"\",\"DO_ana\":\"[0.240000,0.230000]\",\"DO_O\":\"[2.100000,2.507031]\",\"DO_que\":\"[0.220000,0.200000]\",\"DO_que_wentai\":\"\",\"DO_ana_wentai\":\"\",\"DO_O_wentai\":\"\",\"BOD_in\":124.0,\"c\":30.720003128051759,\"b\":3.0043747425079347,\"BTP_wending\":\"\",\"JS_TN_wentai\":\"\",\"CL_P04_YCZ\":null,\"TP_LV\":null,\"TP_LV_continuity\":\"\"},{\"ID\":914497,\"TEST_DATE\":\"2024/02/07\",\"TEST_HOUR\":\"2024/02/07 15\",\"COD_in\":307.1006774902344,\"COD_in_name\":630.0,\"COD_off\":16.84027671813965,\"COD_off_name\":40.0,\"COD_off_con\":32.0,\"TP_in\":6.908275127410889,\"TP_in_name\":7.099999904632568,\"TP_off\":0.10358799993991852,\"TP_off_name\":0.5,\"TP_off_con\":0.30000001192092898,\"TN_in\":56.7881965637207,\"TN_in_name\":65.0,\"TN_off\":11.31944465637207,\"TN_off_name\":15.0,\"TN_off_con\":12.0,\"andan_in\":47.361114501953128,\"andan_in_name\":58.0,\"andan_off\":0.78125,\"andan_off_name\":4.0,\"andan_off_con\":3.200000047683716,\"SS_in\":392.361083984375,\"SS_in_name\":315.0,\"SS_off\":2.1122679710388185,\"SS_off_name\":10.0,\"SS_off_con\":8.0,\"TDS_in\":671.2962646484375,\"TDS_in_name\":600.0,\"T\":12.399999618530274,\"pH\":7.222801208496094,\"Q_in\":3386.0,\"Q_in_name\":4166.669921875,\"continuity\":\"\",\"check_rise\":\"\",\"time_tips\":\"\",\"cs_continuity\":\"\",\"SVI\":\"[187.852223,188.139059]\",\"SVI_con\":170.0,\"SV\":\"[90.000000,92.000000]\",\"SV_con\":80.0,\"MLVSS\":\"[1987.000000,2064.000000]\",\"MLSS\":\"[4598.958496,3813.078613]\",\"MLVSS_wentai\":\"\",\"MLSS_wentai\":\"\",\"DO_ana\":\"[0.240000,0.230000]\",\"DO_O\":\"[2.100000,3.078125]\",\"DO_que\":\"[0.220000,0.200000]\",\"DO_que_wentai\":\"\",\"DO_ana_wentai\":\"\",\"DO_O_wentai\":\"\",\"BOD_in\":124.0,\"c\":17.949487686157228,\"b\":2.1835522651672365,\"BTP_wending\":\"\",\"JS_TN_wentai\":\"\",\"CL_P04_YCZ\":null,\"TP_LV\":null,\"TP_LV_continuity\":\"\"},{\"ID\":914498,\"TEST_DATE\":\"2024/02/07\",\"TEST_HOUR\":\"2024/02/07 15\",\"COD_in\":307.1006774902344,\"COD_in_name\":630.0,\"COD_off\":16.84027671813965,\"COD_off_name\":40.0,\"COD_off_con\":32.0,\"TP_in\":6.92274284362793,\"TP_in_name\":7.099999904632568,\"TP_off\":0.10358799993991852,\"TP_off_name\":0.5,\"TP_off_con\":0.30000001192092898,\"TN_in\":56.747684478759769,\"TN_in_name\":65.0,\"TN_off\":11.31944465637207,\"TN_off_name\":15.0,\"TN_off_con\":12.0,\"andan_in\":47.361114501953128,\"andan_in_name\":58.0,\"andan_off\":0.78125,\"andan_off_name\":4.0,\"andan_off_con\":3.200000047683716,\"SS_in\":392.361083984375,\"SS_in_name\":315.0,\"SS_off\":1.8807870149612427,\"SS_off_name\":10.0,\"SS_off_con\":8.0,\"TDS_in\":668.4027709960938,\"TDS_in_name\":600.0,\"T\":12.399999618530274,\"pH\":7.222801208496094,\"Q_in\":3453.0,\"Q_in_name\":4166.669921875,\"continuity\":\"\",\"check_rise\":\"\",\"time_tips\":\"\",\"cs_continuity\":\"\",\"SVI\":\"[187.852223,188.139059]\",\"SVI_con\":170.0,\"SV\":\"[90.000000,92.000000]\",\"SV_con\":80.0,\"MLVSS\":\"[1987.000000,2064.000000]\",\"MLSS\":\"[4651.041504,3793.981445]\",\"MLVSS_wentai\":\"\",\"MLSS_wentai\":\"\",\"DO_ana\":\"[0.240000,0.230000]\",\"DO_O\":\"[2.100000,3.082031]\",\"DO_que\":\"[0.220000,0.200000]\",\"DO_que_wentai\":\"\",\"DO_ana_wentai\":\"\",\"DO_O_wentai\":\"\",\"BOD_in\":124.0,\"c\":17.911975860595704,\"b\":2.1851112842559816,\"BTP_wending\":\"\",\"JS_TN_wentai\":\"\",\"CL_P04_YCZ\":null,\"TP_LV\":null,\"TP_LV_continuity\":\"\"},{\"ID\":914499,\"TEST_DATE\":\"2024/02/07\",\"TEST_HOUR\":\"2024/02/07 15\",\"COD_in\":307.1006774902344,\"COD_in_name\":630.0,\"COD_off\":16.84027671813965,\"COD_off_name\":40.0,\"COD_off_con\":32.0,\"TP_in\":6.915509223937988,\"TP_in_name\":7.099999904632568,\"TP_off\":0.10358799993991852,\"TP_off_name\":0.5,\"TP_off_con\":0.30000001192092898,\"TN_in\":56.7881965637207,\"TN_in_name\":65.0,\"TN_off\":11.31944465637207,\"TN_off_name\":15.0,\"TN_off_con\":12.0,\"andan_in\":47.361114501953128,\"andan_in_name\":58.0,\"andan_off\":0.78125,\"andan_off_name\":4.0,\"andan_off_con\":3.200000047683716,\"SS_in\":392.361083984375,\"SS_in_name\":315.0,\"SS_off\":1.9386579990386963,\"SS_off_name\":10.0,\"SS_off_con\":8.0,\"TDS_in\":668.4027709960938,\"TDS_in_name\":600.0,\"T\":12.399999618530274,\"pH\":7.222801208496094,\"Q_in\":3602.0,\"Q_in_name\":4166.669921875,\"continuity\":\"\",\"check_rise\":\"\",\"time_tips\":\"\",\"cs_continuity\":\"\",\"SVI\":\"[187.852223,188.139059]\",\"SVI_con\":170.0,\"SV\":\"[90.000000,92.000000]\",\"SV_con\":80.0,\"MLVSS\":\"[1987.000000,2064.000000]\",\"MLSS\":\"[4369.791504,3819.444336]\",\"MLVSS_wentai\":\"\",\"MLSS_wentai\":\"\",\"DO_ana\":\"[0.240000,0.230000]\",\"DO_O\":\"[2.100000,3.085156]\",\"DO_que\":\"[0.220000,0.200000]\",\"DO_que_wentai\":\"\",\"DO_ana_wentai\":\"\",\"DO_O_wentai\":\"\",\"BOD_in\":124.0,\"c\":17.93071174621582,\"b\":2.1835522651672365,\"BTP_wending\":\"\",\"JS_TN_wentai\":\"\",\"CL_P04_YCZ\":null,\"TP_LV\":null,\"TP_LV_continuity\":\"\"},{\"ID\":914500,\"TEST_DATE\":\"2024/02/07\",\"TEST_HOUR\":\"2024/02/07 15\",\"COD_in\":306.817138671875,\"COD_in_name\":630.0,\"COD_off\":16.84027671813965,\"COD_off_name\":40.0,\"COD_off_con\":32.0,\"TP_in\":6.915509223937988,\"TP_in_name\":7.099999904632568,\"TP_off\":0.10358799993991852,\"TP_off_name\":0.5,\"TP_off_con\":0.30000001192092898,\"TN_in\":56.7881965637207,\"TN_in_name\":65.0,\"TN_off\":11.31944465637207,\"TN_off_name\":15.0,\"TN_off_con\":12.0,\"andan_in\":47.395835876464847,\"andan_in_name\":58.0,\"andan_off\":0.78125,\"andan_off_name\":4.0,\"andan_off_con\":3.200000047683716,\"SS_in\":381.9444580078125,\"SS_in_name\":315.0,\"SS_off\":1.7939820289611817,\"SS_off_name\":10.0,\"SS_off_con\":8.0,\"TDS_in\":668.4027709960938,\"TDS_in_name\":600.0,\"T\":12.399999618530274,\"pH\":7.222801208496094,\"Q_in\":3514.0,\"Q_in_name\":4166.669921875,\"continuity\":\"\",\"check_rise\":\"\",\"time_tips\":\"\",\"cs_continuity\":\"\",\"SVI\":\"[187.852223,188.139059]\",\"SVI_con\":170.0,\"SV\":\"[90.000000,92.000000]\",\"SV_con\":80.0,\"MLVSS\":\"[1987.000000,2064.000000]\",\"MLSS\":\"[4598.958496,3841.724609]\",\"MLVSS_wentai\":\"\",\"MLSS_wentai\":\"\",\"DO_ana\":\"[0.240000,0.230000]\",\"DO_O\":\"[2.100000,3.096875]\",\"DO_que\":\"[0.220000,0.200000]\",\"DO_que_wentai\":\"\",\"DO_ana_wentai\":\"\",\"DO_O_wentai\":\"\",\"BOD_in\":124.0,\"c\":17.93071174621582,\"b\":2.1835522651672365,\"BTP_wending\":\"\",\"JS_TN_wentai\":\"\",\"CL_P04_YCZ\":null,\"TP_LV\":null,\"TP_LV_continuity\":\"\"},{\"ID\":914501,\"TEST_DATE\":\"2024/02/07\",\"TEST_HOUR\":\"2024/02/07 15\",\"COD_in\":306.817138671875,\"COD_in_name\":630.0,\"COD_off\":16.84027671813965,\"COD_off_name\":40.0,\"COD_off_con\":32.0,\"TP_in\":6.915509223937988,\"TP_in_name\":7.099999904632568,\"TP_off\":0.10358799993991852,\"TP_off_name\":0.5,\"TP_off_con\":0.30000001192092898,\"TN_in\":56.7881965637207,\"TN_in_name\":65.0,\"TN_off\":11.31944465637207,\"TN_off_name\":15.0,\"TN_off_con\":12.0,\"andan_in\":47.395835876464847,\"andan_in_name\":58.0,\"andan_off\":0.78125,\"andan_off_name\":4.0,\"andan_off_con\":3.200000047683716,\"SS_in\":381.9444580078125,\"SS_in_name\":315.0,\"SS_off\":1.649306058883667,\"SS_off_name\":10.0,\"SS_off_con\":8.0,\"TDS_in\":668.4027709960938,\"TDS_in_name\":600.0,\"T\":12.399999618530274,\"pH\":7.222801208496094,\"Q_in\":3281.0,\"Q_in_name\":4166.669921875,\"continuity\":\"\",\"check_rise\":\"\",\"time_tips\":\"\",\"cs_continuity\":\"\",\"SVI\":\"[187.852223,188.139059]\",\"SVI_con\":170.0,\"SV\":\"[90.000000,92.000000]\",\"SV_con\":80.0,\"MLVSS\":\"[1987.000000,2064.000000]\",\"MLSS\":\"[4625.000000,3946.759277]\",\"MLVSS_wentai\":\"\",\"MLSS_wentai\":\"\",\"DO_ana\":\"[0.240000,0.230000]\",\"DO_O\":\"[2.100000,3.085938]\",\"DO_que\":\"[0.220000,0.200000]\",\"DO_que_wentai\":\"\",\"DO_ana_wentai\":\"\",\"DO_O_wentai\":\"\",\"BOD_in\":124.0,\"c\":17.93071174621582,\"b\":2.1835522651672365,\"BTP_wending\":\"\",\"JS_TN_wentai\":\"\",\"CL_P04_YCZ\":null,\"TP_LV\":null,\"TP_LV_continuity\":\"\"},{\"ID\":914502,\"TEST_DATE\":\"2024/02/07\",\"TEST_HOUR\":\"2024/02/07 15\",\"COD_in\":307.3842468261719,\"COD_in_name\":630.0,\"COD_off\":16.84027671813965,\"COD_off_name\":40.0,\"COD_off_con\":32.0,\"TP_in\":6.92274284362793,\"TP_in_name\":7.099999904632568,\"TP_off\":0.10358799993991852,\"TP_off_name\":0.5,\"TP_off_con\":0.30000001192092898,\"TN_in\":56.747684478759769,\"TN_in_name\":65.0,\"TN_off\":11.31944465637207,\"TN_off_name\":15.0,\"TN_off_con\":12.0,\"andan_in\":47.361114501953128,\"andan_in_name\":58.0,\"andan_off\":0.78125,\"andan_off_name\":4.0,\"andan_off_con\":3.200000047683716,\"SS_in\":392.361083984375,\"SS_in_name\":315.0,\"SS_off\":1.5914349555969239,\"SS_off_name\":10.0,\"SS_off_con\":8.0,\"TDS_in\":668.4027709960938,\"TDS_in_name\":600.0,\"T\":12.399999618530274,\"pH\":7.222801208496094,\"Q_in\":3159.0,\"Q_in_name\":4166.669921875,\"continuity\":\"\",\"check_rise\":\"\",\"time_tips\":\"\",\"cs_continuity\":\"\",\"SVI\":\"[187.852223,188.139059]\",\"SVI_con\":170.0,\"SV\":\"[90.000000,92.000000]\",\"SV_con\":80.0,\"MLVSS\":\"[1987.000000,2064.000000]\",\"MLSS\":\"[4562.500000,3803.530029]\",\"MLVSS_wentai\":\"\",\"MLSS_wentai\":\"\",\"DO_ana\":\"[0.240000,0.230000]\",\"DO_O\":\"[2.100000,3.071094]\",\"DO_que\":\"[0.220000,0.200000]\",\"DO_que_wentai\":\"\",\"DO_ana_wentai\":\"\",\"DO_O_wentai\":\"\",\"BOD_in\":124.0,\"c\":17.911975860595704,\"b\":2.1851112842559816,\"BTP_wending\":\"\",\"JS_TN_wentai\":\"\",\"CL_P04_YCZ\":null,\"TP_LV\":null,\"TP_LV_continuity\":\"\"},{\"ID\":914503,\"TEST_DATE\":\"2024/02/07\",\"TEST_HOUR\":\"2024/02/07 15\",\"COD_in\":306.817138671875,\"COD_in_name\":630.0,\"COD_off\":16.84027671813965,\"COD_off_name\":40.0,\"COD_off_con\":32.0,\"TP_in\":6.92274284362793,\"TP_in_name\":7.099999904632568,\"TP_off\":0.10358799993991852,\"TP_off_name\":0.5,\"TP_off_con\":0.30000001192092898,\"TN_in\":56.747684478759769,\"TN_in_name\":65.0,\"TN_off\":11.31944465637207,\"TN_off_name\":15.0,\"TN_off_con\":12.0,\"andan_in\":47.361114501953128,\"andan_in_name\":58.0,\"andan_off\":0.78125,\"andan_off_name\":4.0,\"andan_off_con\":3.200000047683716,\"SS_in\":392.361083984375,\"SS_in_name\":315.0,\"SS_off\":1.5625,\"SS_off_name\":10.0,\"SS_off_con\":8.0,\"TDS_in\":668.4027709960938,\"TDS_in_name\":600.0,\"T\":12.399999618530274,\"pH\":7.222801208496094,\"Q_in\":3131.0,\"Q_in_name\":4166.669921875,\"continuity\":\"\",\"check_rise\":\"\",\"time_tips\":\"\",\"cs_continuity\":\"\",\"SVI\":\"[187.852223,188.139059]\",\"SVI_con\":170.0,\"SV\":\"[90.000000,92.000000]\",\"SV_con\":80.0,\"MLVSS\":\"[1987.000000,2064.000000]\",\"MLSS\":\"[4593.750000,3819.444336]\",\"MLVSS_wentai\":\"\",\"MLSS_wentai\":\"\",\"DO_ana\":\"[0.240000,0.230000]\",\"DO_O\":\"[2.100000,3.070313]\",\"DO_que\":\"[0.220000,0.200000]\",\"DO_que_wentai\":\"\",\"DO_ana_wentai\":\"\",\"DO_O_wentai\":\"\",\"BOD_in\":124.0,\"c\":17.911975860595704,\"b\":2.1851112842559816,\"BTP_wending\":\"\",\"JS_TN_wentai\":\"\",\"CL_P04_YCZ\":null,\"TP_LV\":null,\"TP_LV_continuity\":\"\"},{\"ID\":914504,\"TEST_DATE\":\"2024/02/07\",\"TEST_HOUR\":\"2024/02/07 15\",\"COD_in\":306.817138671875,\"COD_in_name\":630.0,\"COD_off\":16.84027671813965,\"COD_off_name\":40.0,\"COD_off_con\":32.0,\"TP_in\":6.92274284362793,\"TP_in_name\":7.099999904632568,\"TP_off\":0.10358799993991852,\"TP_off_name\":0.5,\"TP_off_con\":0.30000001192092898,\"TN_in\":56.747684478759769,\"TN_in_name\":65.0,\"TN_off\":11.31944465637207,\"TN_off_name\":15.0,\"TN_off_con\":12.0,\"andan_in\":47.361114501953128,\"andan_in_name\":58.0,\"andan_off\":0.78125,\"andan_off_name\":4.0,\"andan_off_con\":3.200000047683716,\"SS_in\":392.361083984375,\"SS_in_name\":315.0,\"SS_off\":1.5625,\"SS_off_name\":10.0,\"SS_off_con\":8.0,\"TDS_in\":668.4027709960938,\"TDS_in_name\":600.0,\"T\":12.399999618530274,\"pH\":7.222801208496094,\"Q_in\":3131.0,\"Q_in_name\":4166.669921875,\"continuity\":\"\",\"check_rise\":\"\",\"time_tips\":\"\",\"cs_continuity\":\"\",\"SVI\":\"[187.852223,188.139059]\",\"SVI_con\":170.0,\"SV\":\"[90.000000,92.000000]\",\"SV_con\":80.0,\"MLVSS\":\"[1987.000000,2064.000000]\",\"MLSS\":\"[4593.750000,3819.444336]\",\"MLVSS_wentai\":\"\",\"MLSS_wentai\":\"\",\"DO_ana\":\"[0.240000,0.230000]\",\"DO_O\":\"[2.100000,3.070313]\",\"DO_que\":\"[0.220000,0.200000]\",\"DO_que_wentai\":\"\",\"DO_ana_wentai\":\"\",\"DO_O_wentai\":\"\",\"BOD_in\":124.0,\"c\":17.911975860595704,\"b\":2.1851112842559816,\"BTP_wending\":\"\",\"JS_TN_wentai\":\"\",\"CL_P04_YCZ\":null,\"TP_LV\":null,\"TP_LV_continuity\":\"\"},{\"ID\":914505,\"TEST_DATE\":\"2024/02/07\",\"TEST_HOUR\":\"2024/02/07 15\",\"COD_in\":307.1006774902344,\"COD_in_name\":630.0,\"COD_off\":16.84027671813965,\"COD_off_name\":40.0,\"COD_off_con\":32.0,\"TP_in\":6.915509223937988,\"TP_in_name\":7.099999904632568,\"TP_off\":0.10358799993991852,\"TP_off_name\":0.5,\"TP_off_con\":0.30000001192092898,\"TN_in\":56.7881965637207,\"TN_in_name\":65.0,\"TN_off\":11.31944465637207,\"TN_off_name\":15.0,\"TN_off_con\":12.0,\"andan_in\":47.361114501953128,\"andan_in_name\":58.0,\"andan_off\":0.78125,\"andan_off_name\":4.0,\"andan_off_con\":3.200000047683716,\"SS_in\":392.361083984375,\"SS_in_name\":315.0,\"SS_off\":1.736111044883728,\"SS_off_name\":10.0,\"SS_off_con\":8.0,\"TDS_in\":662.61572265625,\"TDS_in_name\":600.0,\"T\":12.399999618530274,\"pH\":7.222801208496094,\"Q_in\":3397.0,\"Q_in_name\":4166.669921875,\"continuity\":\"\",\"check_rise\":\"\",\"time_tips\":\"\",\"cs_continuity\":\"\",\"SVI\":\"[187.852223,188.139059]\",\"SVI_con\":170.0,\"SV\":\"[90.000000,92.000000]\",\"SV_con\":80.0,\"MLVSS\":\"[1987.000000,2064.000000]\",\"MLSS\":\"[4656.250000,3991.319336]\",\"MLVSS_wentai\":\"\",\"MLSS_wentai\":\"\",\"DO_ana\":\"[0.240000,0.230000]\",\"DO_O\":\"[2.100000,3.045312]\",\"DO_que\":\"[0.220000,0.200000]\",\"DO_que_wentai\":\"\",\"DO_ana_wentai\":\"\",\"DO_O_wentai\":\"\",\"BOD_in\":124.0,\"c\":17.93071174621582,\"b\":2.1835522651672365,\"BTP_wending\":\"\",\"JS_TN_wentai\":\"\",\"CL_P04_YCZ\":null,\"TP_LV\":null,\"TP_LV_continuity\":\"\"}]}}"; String dataJson = "{\"bot_id\":\"b00001\",\"exp_id\":\"721\",\"norm\":\"出水总磷\",\"feedback\":{\"6_3\":\"超标\",\"2_24\":\"是\"},\"session_id\":\"C20231025153549AC11FC2905668533\",\"generate_args\":{\"max_new_tokens\":1024,\"max_length\":4096,\"num_beams\":1,\"do_sample\":false,\"top_p\":1,\"temperature\":0},\"extra\":{\"rows\":[]}}"; System.out.println(dataJson); PredictionsRequest request = PredictionsRequest.newBuilder() .setModelName("slibra_bot") .putInput("method", ByteString.copyFrom("decision_stream", "utf-8"))//推理 .putInput("data", ByteString.copyFrom(dataJson, "utf-8")) .buildPartial(); outputStream = response.getOutputStream(); Iterator predictions = stub.streamPredictions(request); while (predictions.hasNext()) { String responseStr = predictions.next().getPrediction().toStringUtf8(); System.out.println(responseStr); responseStr = JSON.parseObject(responseStr).getString("message"); if("complete".equals(responseStr)){ System.out.println("结尾语句并且是非JSON,无需处理"); }else{ sb.append(responseStr); outputStream.write(responseStr.getBytes()); outputStream.flush(); } } } catch (IOException e) { throw new RuntimeException(e); } finally { System.out.println(sb.toString()); // 关闭输出流 try { outputStream.close(); } catch (IOException e) { throw new RuntimeException(e); }finally { channel.shutdown(); } } // return AjaxResult.success("ok"); } }