package com.smtaiserver.smtaiserver.javaai.qwen; import java.util.HashSet; import java.util.List; import java.util.Set; import com.smtaiserver.smtaiserver.core.SMTAIServerApp; import com.smtaiserver.smtaiserver.core.SMTAIServerRequest; import com.smtaiserver.smtaiserver.database.SMTDatabase; import com.smtaiserver.smtaiserver.database.SMTDatabase.DBRecord; import com.smtaiserver.smtaiserver.database.SMTDatabase.DBRecords; import com.smtaiserver.smtaiserver.javaai.SMTJavaAIError; import com.smtaiserver.smtaiserver.javaai.SMTJavaAISession; import com.smtaiserver.smtaiserver.javaai.llm.core.SMTLLMConnect; import com.smtaiserver.smtaiserver.javaai.qwen.extcall.SMTQwenExtCall; import com.smtservlet.util.Json; import com.smtservlet.util.SMTJsonWriter; public class SMTJavaAISessionQwen extends SMTJavaAISession { private SMTQwenAgentManager _agentManager; private SMTLLMConnect _llm; public SMTJavaAISessionQwen() throws Exception { _llm = SMTAIServerApp.getApp().allocLLMConnect(null); _agentManager = SMTAIServerApp.getApp().getQwenAgentManager(); } @Override public void close() { if(_llm != null) { _llm.close(); _llm = null; } super.close(); } @Override public Json executeSupervisor(boolean rawMode, Set setAgentGroup, String groupType, SMTAIServerRequest tranReq, boolean checkInnerCall) throws Exception { if(rawMode) { tranReq.sendChunkedBlock("begin", "将由大模型直接回答问题"); String answer = _llm.callWithMessage(null, this.getQuestion(), tranReq); tranReq.sendChunkedBlock("end", "大模型回答了您的问题"); SMTJsonWriter jsonWrResult = tranReq.getResultJsonWr(); jsonWrResult.addKeyValue("json_ok", true); jsonWrResult.addKeyValue("answer_type", "knowledge"); jsonWrResult.beginArray("knowledge"); { jsonWrResult.beginMap(null); jsonWrResult.addKeyValue("answer", answer); jsonWrResult.endMap(); } jsonWrResult.endArray(); tranReq.traceLLMDebug("返回结果:================="); return Json.read(jsonWrResult.getFullJson()); } else { SMTJsonWriter jsonWr = new SMTJsonWriter(false); String prevQuestion = null; String question = this.getQuestion().replace("概况", "运行状况"); prevQuestion = this.getPrevQuestion(); if(question.startsWith("新问题:") || question.startsWith("新问题:")) { prevQuestion = null; question = question.substring(4); tranReq.setAIQuestion(question); } if(prevQuestion != null) { tranReq.traceLLMDebug("前文 : " + prevQuestion); question = _llm.callWithMessage( SMTAIServerApp.getApp().getGlobalConfig("prompt.merge_question") , new String[] { "前一个问题:" + prevQuestion, question }, tranReq); if(question.startsWith("新问题:")) question = question.substring(4); tranReq.setRawQuestion(this.getQuestion()); tranReq.setAIQuestion(question); } // else // { // question = question; //_llm.callWithMessage(null, SMTAIServerApp.getApp().getGlobalConfig("prompt.fix_question"), question); // } tranReq.traceLLMDebug("现文 : " + this.getQuestion()); tranReq.traceLLMDebug("修正文 : " + question); SMTJavaAIError error = _agentManager.callAgents(_llm, setAgentGroup, groupType, question, _mapId2Agent, tranReq, checkInnerCall); { jsonWr.addKeyValue("json_ok", true); List listSupervisorJson = tranReq.getSupervisorJsonList(); if(listSupervisorJson != null) { jsonWr.beginArray("supervisors"); for(Json jsonSupervisor : listSupervisorJson) { jsonWr.addKeyRaw(null, jsonSupervisor); } jsonWr.endArray(); } // 输出关联问题 List listSampleQustion = tranReq.getContentSampleQuestion(); if(listSampleQustion != null) { jsonWr.beginArray("sample_question"); for(String sampleQuestion : listSampleQustion) { jsonWr.addKeyValue(null, sampleQuestion); } jsonWr.endArray(); } // 查询最接近的问题 SMTDatabase db = SMTAIServerApp.getApp().allocDatabase(); try { String sql = "SELECT\r\n" + " *\r\n" + "FROM (\r\n" + " select\r\n" + " max(ratio) as ratio,\r\n" + " max(history_id) as history_id,\r\n" + " question\r\n" + " from\r\n" + " (\r\n" + " select\r\n" + " similarity(?,\r\n" + " question) as ratio,\r\n" + " history_id,\r\n" + " question\r\n" + " from\r\n" + " chat_history_detail\r\n" + " ) T\r\n" + " where\r\n" + " ratio > " + SMTAIServerApp.getApp().getGlobalConfig("history.math.ratio") + "\r\n" + " group by\r\n" + " question\r\n" + ")T\r\n" + "order by\r\n" + " ratio desc\r\n" + "limit 20" ; DBRecords recs = db.querySQL(sql, new Object[] {this.getQuestion()}); if(recs.getRowCount() > 0) { int count = 0; Set setExist = new HashSet<>(); setExist.add(this.getQuestion().replace("\r", "").replace("\n", "").replace(" ", "")); jsonWr.beginArray("context_history"); for(DBRecord rec : recs.getRecords()) { String curQuestion = rec.getString("question").replace("\r", "").replace("\n", "").replace(" ", ""); if(setExist.contains(curQuestion)) continue; setExist.add(curQuestion); count ++; if(count > 3) break; jsonWr.beginMap(null); { jsonWr.addKeyValue("ratio", rec.getString("ratio")); jsonWr.addKeyValue("history_id", rec.getString("history_id")); jsonWr.addKeyValue("question", rec.getString("question")); } jsonWr.endMap(); } jsonWr.endArray(); } } finally { db.close(); } } if(error != null) { jsonWr.addKeyValue("json_ok", false); error.appendToResonse(jsonWr); } tranReq.traceLLMDebug("返回结果:================="); return jsonWr.getRootJson(); } } @Override public SMTJavaAIError callExtJson(Json jsonCallExtList, SMTJsonWriter jsonWr, SMTAIServerRequest tranReq) throws Exception { return _agentManager.callExtJson(_llm, this.getQuestion(), jsonCallExtList, jsonWr, tranReq); } @Override public void executeExtChat(String callExtId, Json callExtArgs, SMTAIServerRequest tranReq) throws Exception { SMTJsonWriter jsonWrResult = tranReq.getResultJsonWr(); SMTQwenExtCall extCall = SMTQwenApp.getApp().getExtCall(callExtId); SMTJavaAIError error = extCall.invoke(this, callExtArgs, jsonWrResult, tranReq); if(error != null) { jsonWrResult.addKeyValue("json_ok", false); error.appendToResonse(jsonWrResult); } } }