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<String> 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<Json> listSupervisorJson = tranReq.getSupervisorJsonList();
|
if(listSupervisorJson != null)
|
{
|
jsonWr.beginArray("supervisors");
|
for(Json jsonSupervisor : listSupervisorJson)
|
{
|
jsonWr.addKeyRaw(null, jsonSupervisor);
|
}
|
jsonWr.endArray();
|
}
|
|
// 输出关联问题
|
List<String> 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<String> 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);
|
}
|
}
|
|
}
|