GRPCController.java 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. package com.slibra.web.controller.business;
  2. import com.alibaba.fastjson2.JSONWriter;
  3. import com.alibaba.fastjson2.JSON;
  4. import com.google.protobuf.ByteString;
  5. import com.qiniu.util.Json;
  6. import com.slibra.business.domain.TXinyiChatRecord;
  7. import com.slibra.business.domain.TXinyiDaily;
  8. import com.slibra.business.domain.TXinyiIndustry;
  9. import com.slibra.business.domain.TXinyiNormConfig;
  10. import com.slibra.business.mapper.*;
  11. import com.slibra.business.req.ChatReq;
  12. import com.slibra.business.req.DecisionReq;
  13. import com.slibra.common.core.controller.BaseController;
  14. import com.slibra.common.core.domain.AjaxResult;
  15. import com.slibra.common.core.domain.R;
  16. import com.slibra.common.utils.DateUtils;
  17. import com.slibra.common.utils.SecurityUtils;
  18. import com.slibra.common.utils.StringUtils;
  19. import com.slibra.common.utils.uuid.IdUtils;
  20. import io.grpc.ManagedChannel;
  21. import io.grpc.ManagedChannelBuilder;
  22. import lombok.extern.slf4j.Slf4j;
  23. import org.apache.commons.lang3.StringEscapeUtils;
  24. import org.pytorch.serve.grpc.inference.InferenceAPIsServiceGrpc;
  25. import org.pytorch.serve.grpc.inference.PredictionResponse;
  26. import org.pytorch.serve.grpc.inference.PredictionsRequest;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.util.CollectionUtils;
  29. import org.springframework.web.bind.annotation.*;
  30. import javax.servlet.http.HttpServletResponse;
  31. import java.io.IOException;
  32. import java.io.OutputStream;
  33. import java.io.UnsupportedEncodingException;
  34. import java.math.BigDecimal;
  35. import java.math.RoundingMode;
  36. import java.nio.charset.StandardCharsets;
  37. import java.time.LocalDateTime;
  38. import java.time.ZoneId;
  39. import java.util.*;
  40. import static com.slibra.common.constant.MyConstants.WARNING_DEFAULT_CREATE;
  41. /**
  42. * 告警相关
  43. */
  44. @RestController
  45. @RequestMapping("/grpc")
  46. @Slf4j
  47. public class GRPCController extends BaseController {
  48. @Autowired
  49. private TXinyiChatRecordMapper chatRecordMapper;
  50. @Autowired
  51. private TXinyiIndustryMapper xinyiIndustryMapper;
  52. @Autowired
  53. private TXinyiDailyMapper xinyiDailyMapper;
  54. @Autowired
  55. private TXinyiChatRecordMapper xinyiChatRecordMapper;
  56. /*private InferenceAPIsServiceGrpc.InferenceAPIsServiceBlockingStub getStub(){
  57. return InferenceAPIsServiceGrpc.newBlockingStub(ManagedChannelBuilder.forAddress("10.0.0.24", 17070)
  58. .usePlaintext()
  59. .build());
  60. }*/
  61. /**
  62. * 调⽤大模型决策接口
  63. * @return
  64. */
  65. @PostMapping(value = "/decisionStream")
  66. public void decisionStream(HttpServletResponse response, @RequestBody ChatReq chatReq)
  67. // public void decisionStream(HttpServletResponse response, ChatReq chatReq)
  68. {
  69. log.info("进入了调⽤大模型决策接口");
  70. // StringBuilder sb = new StringBuilder();
  71. //大模型结果 放入一个结合中
  72. List<String> resultData = new ArrayList<>();
  73. //决策和问答不一样 没有历史的概念 所以sessionId都是新的 次数都是1
  74. String sessionId = IdUtils.simpleUUID();
  75. String feedback = chatReq.getFeedback();
  76. //决策请求的业务参数
  77. // List<HashMap<String, Object>> list = this.xinyiIndustryMapper.selectLast10RecordsForDecision();
  78. //2024年5月21日15:23:07 这里不能用关联查询处理,日报要获取最新的一条而不是今日的数据。
  79. List<DecisionReq> decisionReqs = this.xinyiIndustryMapper.selectLast10RecordsForDecisionOnlyIndustry();
  80. if(!CollectionUtils.isEmpty(decisionReqs)){
  81. for (DecisionReq decisionReq : decisionReqs) {
  82. //处理日报数据
  83. TXinyiDaily daily = this.xinyiDailyMapper.selectNewestData();
  84. if(!Objects.isNull(daily)){
  85. decisionReq.setT(daily.getJsSw());
  86. decisionReq.setSVI(daily.getWntjzsAll());
  87. decisionReq.setSV(daily.getWncjbAll());
  88. decisionReq.setMlvss(daily.getHfxwnndAll());
  89. decisionReq.setDoAna(daily.getYycRjyAll());
  90. decisionReq.setDoQue(daily.getQycRjyAll());
  91. BigDecimal jsBod5 = daily.getJsBod5();
  92. decisionReq.setBodIn(jsBod5);
  93. BigDecimal tpIn = decisionReq.getTpIn();
  94. BigDecimal tnIn = decisionReq.getTnIn();
  95. if(!Objects.isNull(jsBod5)){
  96. if(!Objects.isNull(tpIn) && tpIn.compareTo(new BigDecimal("0")) >0){
  97. decisionReq.setC(jsBod5.divide(tpIn, 4, RoundingMode.HALF_UP));
  98. }
  99. if(!Objects.isNull(tnIn) && tnIn.compareTo(new BigDecimal("0")) >0){
  100. decisionReq.setB(jsBod5.divide(tnIn, 4, RoundingMode.HALF_UP));
  101. }
  102. }
  103. }
  104. }
  105. }
  106. String rows = JSON.toJSONString(decisionReqs, JSONWriter.Feature.WriteNulls);
  107. // 获取输出流
  108. OutputStream outputStream = null;
  109. ManagedChannel channel = null;
  110. response.setContentType("text/plain");
  111. response.setCharacterEncoding("utf-8");
  112. String dataJson = "";
  113. try {
  114. channel = ManagedChannelBuilder.forAddress("10.0.0.24", 17070)
  115. .usePlaintext()
  116. .build();
  117. InferenceAPIsServiceGrpc.InferenceAPIsServiceBlockingStub stub = InferenceAPIsServiceGrpc.newBlockingStub(channel);
  118. 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 + "}}";
  119. log.info("请求大模型的决策的参数为{}", dataJson);
  120. PredictionsRequest request = PredictionsRequest.newBuilder()
  121. .setModelName("slibra_bot")
  122. .putInput("method", ByteString.copyFrom("decision_stream", "utf-8"))//推理
  123. .putInput("data", ByteString.copyFrom(dataJson, "utf-8"))
  124. .buildPartial();
  125. outputStream = response.getOutputStream();
  126. Iterator<PredictionResponse> predictions = stub.streamPredictions(request);
  127. while (predictions.hasNext()) {
  128. String responseStr = predictions.next().getPrediction().toStringUtf8();
  129. log.info("决策流式返回的结果是{}", responseStr);
  130. responseStr = JSON.parseObject(responseStr).getString("message");
  131. if("complete".equals(responseStr)){
  132. System.out.println("结尾语句并且是非JSON,无需处理");
  133. }else{
  134. // sb.append(responseStr);
  135. resultData.add(responseStr);
  136. outputStream.write(responseStr.getBytes());
  137. outputStream.flush();
  138. }
  139. // todo 类型判断处理
  140. }
  141. } catch (Exception e) {
  142. // throw new RuntimeException(e);
  143. log.error("处理大模型推理异常,异常信息为{}", JSON.toJSONString(e));
  144. } finally {
  145. System.out.println(JSON.toJSONString(resultData));
  146. //保存聊天记录
  147. //将问答更新到数据库中
  148. chatReq.setSessionId(sessionId);
  149. chatReq.setType(1);//0问答 1决策
  150. chatReq.setModule(3);//0=专家问答,1=智能工单,2=智能体助手,3.告警
  151. // String showVal = this.buildShowValue(tXinyiWarningRecord, tXinyiIndustry, normConfig);
  152. chatReq.setShowVal(feedback);//前端展示的数据和提问的数据不一致
  153. chatReq.setQuestion(dataJson);
  154. chatReq.setAnswer(JSON.toJSONString(resultData));
  155. chatReq.setWarningId(String.valueOf(chatReq.getWarningId()));
  156. chatReq.setCounts(1);//问答次数
  157. String userId = SecurityUtils.getUserId().toString();
  158. String username = SecurityUtils.getUsername();
  159. chatReq.setUserId(userId);
  160. chatReq.setCreateBy(username);
  161. chatReq.setCreateTime(DateUtils.getNowDate());
  162. this.xinyiChatRecordMapper.insertTXinyiChatRecord(chatReq);
  163. // 关闭输出流
  164. try {
  165. outputStream.close();
  166. } catch (IOException e) {
  167. throw new RuntimeException(e);
  168. }finally {
  169. channel.shutdown();
  170. }
  171. }
  172. }
  173. /**
  174. * RAG+⼤模型的调⽤参数
  175. * @return
  176. */
  177. @PostMapping(value = "/inferStreamRag")
  178. public void inferStreamRag(HttpServletResponse response, @RequestBody ChatReq chatReq) {
  179. // public void inferStreamRag(HttpServletResponse response, ChatReq chatReq) {
  180. log.info("进入了调⽤RAG+⼤模型的调⽤参数");
  181. StringBuilder sb = new StringBuilder();
  182. String sessionId = chatReq.getSessionId();
  183. String question = chatReq.getQuestion();
  184. int counts = 1;//默认是第一次
  185. List<String> historyDates = new ArrayList<>();
  186. //查询历史数据,放入集合中
  187. if(StringUtils.isBlank(sessionId))
  188. sessionId= IdUtils.simpleUUID();//第一次
  189. else{
  190. //通过sessionId获取所有的问答记录
  191. List<TXinyiChatRecord> chatRecords = this.chatRecordMapper.selectTXinyiChatRecordList(TXinyiChatRecord.builder().sessionId(sessionId).build());
  192. if(!CollectionUtils.isEmpty(chatRecords)){
  193. for (TXinyiChatRecord chatRecord : chatRecords) {
  194. historyDates.add(chatRecord.getQuestion());
  195. historyDates.add(chatRecord.getAnswer());
  196. }
  197. //问答次数增加
  198. counts = chatRecords.size() + 1;
  199. }
  200. }
  201. //将新的问题放入集合中
  202. historyDates.add(question);
  203. // 获取输出流
  204. OutputStream outputStream = null;
  205. ManagedChannel channel = null;
  206. response.setContentType("text/plain");
  207. response.setCharacterEncoding("utf-8");
  208. try {
  209. channel = ManagedChannelBuilder.forAddress("10.0.0.24", 17070)
  210. .usePlaintext()
  211. .build();
  212. InferenceAPIsServiceGrpc.InferenceAPIsServiceBlockingStub stub = InferenceAPIsServiceGrpc.newBlockingStub(channel);
  213. 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\":{}}";
  214. System.out.println(dataJson);
  215. PredictionsRequest request = PredictionsRequest.newBuilder()
  216. .setModelName("slibra_bot")
  217. .putInput("method", ByteString.copyFrom("infer_stream", "utf-8"))//推理
  218. .putInput("data", ByteString.copyFrom(dataJson, "utf-8"))
  219. .buildPartial();
  220. outputStream = response.getOutputStream();
  221. Iterator<PredictionResponse> predictions = stub.streamPredictions(request);
  222. outputStream.write("begin".getBytes());
  223. outputStream.flush();
  224. //将结果记录到问答表
  225. while (predictions.hasNext()) {
  226. String responseStr = predictions.next().getPrediction().toStringUtf8();
  227. System.out.println(responseStr);
  228. responseStr = JSON.parseObject(responseStr).getString("message");
  229. if("complete".equals(responseStr)){
  230. System.out.println("结尾语句并且是非JSON,无需处理");
  231. }else{
  232. sb.append(responseStr);
  233. outputStream.write(responseStr.getBytes());
  234. outputStream.flush();
  235. }
  236. //把SessionId返回给前端
  237. outputStream.write(sessionId.getBytes());
  238. outputStream.flush();
  239. }
  240. } catch (IOException e) {
  241. throw new RuntimeException(e);
  242. } finally {
  243. // System.out.println(sb.toString());
  244. //将问答更新到数据库中
  245. chatReq.setSessionId(sessionId);
  246. chatReq.setAnswer(sb.toString());
  247. chatReq.setType(0);//0问答 1决策
  248. chatReq.setModule(0);//0=专家问答,1=智能工单,2=智能体助手,3.告警
  249. chatReq.setShowVal(question);
  250. chatReq.setCounts(counts);//问答次数
  251. String userId = SecurityUtils.getUserId().toString();
  252. String username = SecurityUtils.getUsername();
  253. chatReq.setUserId(userId);
  254. chatReq.setCreateBy(username);
  255. chatReq.setCreateTime(DateUtils.getNowDate());
  256. this.chatRecordMapper.insertTXinyiChatRecord(chatReq);
  257. // 关闭输出流
  258. try {
  259. outputStream.close();
  260. } catch (IOException e) {
  261. throw new RuntimeException(e);
  262. }finally {
  263. channel.shutdown();
  264. }
  265. }
  266. // return AjaxResult.success("ok");
  267. }
  268. public static void main(String[] args) {
  269. 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";
  270. String decoded = decodeOctalToUtf8(encoded);
  271. System.out.println(decoded);
  272. }
  273. public static String decodeOctalToUtf8(String encoded) {
  274. // 移除反斜杠
  275. String octalSequence = encoded.replaceAll("\\\\", "");
  276. // 检查长度是否是3的倍数
  277. if (octalSequence.length() % 3 != 0) {
  278. throw new IllegalArgumentException("Encoded string length is not a multiple of 3");
  279. }
  280. byte[] bytes = new byte[octalSequence.length() / 3];
  281. for (int i = 0, j = 0; i < octalSequence.length(); i += 3, j++) {
  282. // 提取每三个字符的八进制数
  283. String octal = octalSequence.substring(i, i + 3);
  284. // 将八进制数转换为字节
  285. bytes[j] = (byte) Integer.parseInt(octal, 8);
  286. }
  287. // 将字节序列转换为UTF-8编码的字符串
  288. return new String(bytes, StandardCharsets.UTF_8);
  289. }
  290. /**
  291. * ⼤模型问答的调⽤参数
  292. * @return
  293. */
  294. @GetMapping(value = "/inferStreamCommon")
  295. // public void inferStreamCommon(HttpServletResponse response, @RequestBody ChatReq chatReq)
  296. public void inferStreamCommon(HttpServletResponse response, ChatReq chatReq)
  297. {
  298. log.info("进入了调⽤⼤模型问答的调⽤参数");
  299. StringBuilder sb = new StringBuilder();
  300. // 获取输出流
  301. OutputStream outputStream = null;
  302. ManagedChannel channel = null;
  303. response.setContentType("text/plain");
  304. response.setCharacterEncoding("utf-8");
  305. try {
  306. channel = ManagedChannelBuilder.forAddress("10.0.0.24", 17070)
  307. .usePlaintext()
  308. .build();
  309. InferenceAPIsServiceGrpc.InferenceAPIsServiceBlockingStub stub = InferenceAPIsServiceGrpc.newBlockingStub(channel);
  310. 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\":{}}";
  311. System.out.println(dataJson);
  312. PredictionsRequest request = PredictionsRequest.newBuilder()
  313. .setModelName("slibra_bot")
  314. .putInput("method", ByteString.copyFrom("infer_stream", "utf-8"))//推理
  315. .putInput("data", ByteString.copyFrom(dataJson, "utf-8"))
  316. .buildPartial();
  317. outputStream = response.getOutputStream();
  318. Iterator<PredictionResponse> predictions = stub.streamPredictions(request);
  319. while (predictions.hasNext()) {
  320. String responseStr = predictions.next().getPrediction().toStringUtf8();
  321. System.out.println(responseStr);
  322. responseStr = JSON.parseObject(responseStr).getString("message");
  323. if("complete".equals(responseStr)){
  324. System.out.println("结尾语句并且是非JSON,无需处理");
  325. }else{
  326. sb.append(responseStr);
  327. outputStream.write(responseStr.getBytes());
  328. outputStream.flush();
  329. }
  330. }
  331. } catch (IOException e) {
  332. throw new RuntimeException(e);
  333. } finally {
  334. System.out.println(sb.toString());
  335. // 关闭输出流
  336. try {
  337. outputStream.close();
  338. } catch (IOException e) {
  339. throw new RuntimeException(e);
  340. }finally {
  341. channel.shutdown();
  342. }
  343. }
  344. // return AjaxResult.success("ok");
  345. }
  346. /**
  347. * 调⽤大模型决策接口-第二次
  348. * @return
  349. */
  350. @GetMapping(value = "/decisionStreamTwo")
  351. // public void decisionStreamTwo(HttpServletResponse response, @RequestBody ChatReq chatReq)
  352. public void decisionStreamTwo(HttpServletResponse response)
  353. {
  354. log.info("进入了调⽤大模型决策接口-第二次");
  355. StringBuilder sb = new StringBuilder();
  356. // 获取输出流
  357. OutputStream outputStream = null;
  358. ManagedChannel channel = null;
  359. response.setContentType("text/plain");
  360. response.setCharacterEncoding("utf-8");
  361. try {
  362. channel = ManagedChannelBuilder.forAddress("10.0.0.24", 17070)
  363. .usePlaintext()
  364. .build();
  365. InferenceAPIsServiceGrpc.InferenceAPIsServiceBlockingStub stub = InferenceAPIsServiceGrpc.newBlockingStub(channel);
  366. // 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\":\"\"}]}}";
  367. 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\":[]}}";
  368. System.out.println(dataJson);
  369. PredictionsRequest request = PredictionsRequest.newBuilder()
  370. .setModelName("slibra_bot")
  371. .putInput("method", ByteString.copyFrom("decision_stream", "utf-8"))//推理
  372. .putInput("data", ByteString.copyFrom(dataJson, "utf-8"))
  373. .buildPartial();
  374. outputStream = response.getOutputStream();
  375. Iterator<PredictionResponse> predictions = stub.streamPredictions(request);
  376. while (predictions.hasNext()) {
  377. String responseStr = predictions.next().getPrediction().toStringUtf8();
  378. System.out.println(responseStr);
  379. responseStr = JSON.parseObject(responseStr).getString("message");
  380. if("complete".equals(responseStr)){
  381. System.out.println("结尾语句并且是非JSON,无需处理");
  382. }else{
  383. sb.append(responseStr);
  384. outputStream.write(responseStr.getBytes());
  385. outputStream.flush();
  386. }
  387. }
  388. } catch (IOException e) {
  389. throw new RuntimeException(e);
  390. } finally {
  391. System.out.println(sb.toString());
  392. // 关闭输出流
  393. try {
  394. outputStream.close();
  395. } catch (IOException e) {
  396. throw new RuntimeException(e);
  397. }finally {
  398. channel.shutdown();
  399. }
  400. }
  401. // return AjaxResult.success("ok");
  402. }
  403. }