Commit 64582e53 authored by alex yao's avatar alex yao

fix[智能问数]: 修复[数据库查询异常]断连问题

parent cf7758b9
...@@ -212,159 +212,162 @@ public class AiBiServiceImpl implements AiBiService { ...@@ -212,159 +212,162 @@ public class AiBiServiceImpl implements AiBiService {
@Override @Override
public void callV2(String dialoguesId, String input, String fileUrl, Integer[] knowledgeIds, Integer[] databaseIds, Long userId) throws Exception { public void callV2(String dialoguesId, String input, String fileUrl, Integer[] knowledgeIds, Integer[] databaseIds, Long userId) throws IOException {
SSEUtil sseUtil = new SSEUtil();
// 保存对话基础信息 // 保存对话基础信息
BizAiDialoguesEntity bizAiDialoguesEntity = new BizAiDialoguesEntity(); try {
bizAiDialoguesEntity.setMemberId(userId); BizAiDialoguesEntity bizAiDialoguesEntity = new BizAiDialoguesEntity();
bizAiDialoguesEntity.setDialoguesId(dialoguesId); bizAiDialoguesEntity.setMemberId(userId);
bizAiDialoguesEntity.setIsDeleted(CommonConstant.IsDeleted.N); bizAiDialoguesEntity.setDialoguesId(dialoguesId);
List<BizAiDialoguesEntity> bizAiDialoguesEntities = bizAiDialoguesService.findByExample(bizAiDialoguesEntity, null); bizAiDialoguesEntity.setIsDeleted(CommonConstant.IsDeleted.N);
if (CollectionUtils.isEmpty(bizAiDialoguesEntities)) { List<BizAiDialoguesEntity> bizAiDialoguesEntities = bizAiDialoguesService.findByExample(bizAiDialoguesEntity, null);
logger.error("dialogues id 不存在,请重新创建"); if (CollectionUtils.isEmpty(bizAiDialoguesEntities)) {
throw new BusinessException("对话异常"); logger.error("dialogues id 不存在,请重新创建");
} throw new BusinessException("对话异常");
}
// 保存标题信息 // 保存标题信息
if (StringUtils.isBlank(bizAiDialoguesEntities.get(0).getTitle())) { if (StringUtils.isBlank(bizAiDialoguesEntities.get(0).getTitle())) {
BizAiDialoguesEntity portalDialoguesEntity = bizAiDialoguesEntities.get(0); BizAiDialoguesEntity portalDialoguesEntity = bizAiDialoguesEntities.get(0);
portalDialoguesEntity.setTitle(input); portalDialoguesEntity.setTitle(input);
bizAiDialoguesService.update(portalDialoguesEntity); bizAiDialoguesService.update(portalDialoguesEntity);
} }
if (databaseIds.length > 1) { if (databaseIds.length > 1) {
throw new BusinessException("仅支持单个数据库"); throw new BusinessException("仅支持单个数据库");
} }
long inputTime = System.currentTimeMillis(); long inputTime = System.currentTimeMillis();
SSEUtil sseUtil = new SSEUtil();
CSVChainResult csvChainResult = new CSVChainResult();
List<DBChainResult> dbChainResults = new ArrayList<>();
String functionRecord = StringUtils.EMPTY;
BizAgentApplicationGcConfigEntity gcConfigEntity = bizAgentApplicationGcConfigService.getByConfigCode("AIBIPrompt"); CSVChainResult csvChainResult = new CSVChainResult();
if (gcConfigEntity == null) { List<DBChainResult> dbChainResults = new ArrayList<>();
throw new BusinessException("无法找到【智能问数】配置"); String functionRecord = StringUtils.EMPTY;
}
//1. 文件/数据库 chain BizAgentApplicationGcConfigEntity gcConfigEntity = bizAgentApplicationGcConfigService.getByConfigCode("AIBIPrompt");
if (ArrayUtils.isNotEmpty(databaseIds)) { if (gcConfigEntity == null) {
for (Integer databaseId : databaseIds) { throw new BusinessException("无法找到【智能问数】配置");
BizKnowledgeDatabaseEntity bizKnowledgeDatabaseEntity = bizKnowledgeDatabaseService.get(databaseId.longValue());
if (bizKnowledgeDatabaseEntity == null) {
continue;
}
DBChainResponse dbChainResponse = new DBChainResponse();
dbChainResponse.setQuestion(input);
dbChainResponse.setContext(null);
dbChainResponse.setPrompt(null);
dbChainResponse.setTableFilters(null);
dbChainResponse.setMysqlUser(bizKnowledgeDatabaseEntity.getDbUsername());
dbChainResponse.setMysqlPassword(bizKnowledgeDatabaseEntity.getDbPassword());
dbChainResponse.setMysqlHost(bizKnowledgeDatabaseEntity.getDbHost());
dbChainResponse.setMysqlPort(bizKnowledgeDatabaseEntity.getDbPort());
dbChainResponse.setMysqlDatabase(bizKnowledgeDatabaseEntity.getDbName());
DBChainResult dbChainResult = chainService.dbChain(dbChainResponse);
if (dbChainResult != null) {
dbChainResult.setSql("```SQL\n" + dbChainResult.getSql() + "\n```");
dbChainResults.add(dbChainResult);
}
} }
//2. 若有数据, 执行[EChart Agent] 判断并生成EChart Option
if (CollectionUtils.isNotEmpty(dbChainResults)) {
DBChainResult dbChainResult = dbChainResults.get(0);
//输出SQL
LargeModelDemandResult result = new LargeModelDemandResult();
result.setCode("0");
result.setFunction(null);
result.setDbChainResult(dbChainResults);
result.setKnowledgeContentResult(null);
sseUtil.send(JsonUtils.serialize(result));
JSONObject echartJSONObject = new JSONObject(); //1. 文件/数据库 chain
echartJSONObject.put("sql", dbChainResult.getSql()); if (ArrayUtils.isNotEmpty(databaseIds)) {
echartJSONObject.put("sql_result", dbChainResult.getSqlResult()); for (Integer databaseId : databaseIds) {
echartJSONObject.put("question", input); BizKnowledgeDatabaseEntity bizKnowledgeDatabaseEntity = bizKnowledgeDatabaseService.get(databaseId.longValue());
AbstractFunctionResult<String> functionResult = eChartGenerateFunction.doFunction(echartJSONObject.toJSONString(), null, null, null); if (bizKnowledgeDatabaseEntity == null) {
String eChartOption = functionResult.getFunctionResult(); continue;
//输出EChart }
if (eChartOption != null) { DBChainResponse dbChainResponse = new DBChainResponse();
JSONObject jsonObject = JSONObject.parseObject(eChartOption); dbChainResponse.setQuestion(input);
if (!jsonObject.containsKey("skip")) { dbChainResponse.setContext(null);
ToolFunction toolFunction = new ToolFunction(); dbChainResponse.setPrompt(null);
toolFunction.setName("echart_function"); dbChainResponse.setTableFilters(null);
toolFunction.setResult(eChartOption); dbChainResponse.setMysqlUser(bizKnowledgeDatabaseEntity.getDbUsername());
toolFunction.setDisplayFormat("json"); dbChainResponse.setMysqlPassword(bizKnowledgeDatabaseEntity.getDbPassword());
toolFunction.setArguments(null); dbChainResponse.setMysqlHost(bizKnowledgeDatabaseEntity.getDbHost());
result = new LargeModelDemandResult(); dbChainResponse.setMysqlPort(bizKnowledgeDatabaseEntity.getDbPort());
result.setCode("0"); dbChainResponse.setMysqlDatabase(bizKnowledgeDatabaseEntity.getDbName());
result.setFunction(toolFunction); DBChainResult dbChainResult = chainService.dbChain(dbChainResponse);
result.setDbChainResult(null); if (dbChainResult != null) {
result.setKnowledgeContentResult(null); dbChainResult.setSql("```SQL\n" + dbChainResult.getSql() + "\n```");
dbChainResults.add(dbChainResult);
String toolFunctionJson = JsonUtils.serialize(result);
sseUtil.send(toolFunctionJson);
functionRecord = toolFunctionJson;
} }
} }
} //2. 若有数据, 执行[EChart Agent] 判断并生成EChart Option
} else if (StringUtils.isNotBlank(fileUrl)) { if (CollectionUtils.isNotEmpty(dbChainResults)) {
CSVChainResponse csvChainResponse = new CSVChainResponse(); DBChainResult dbChainResult = dbChainResults.get(0);
csvChainResponse.setQuestion(input); //输出SQL
csvChainResponse.setContext(null); LargeModelDemandResult result = new LargeModelDemandResult();
csvChainResponse.setFilePath(fileUrl); result.setCode("0");
csvChainResult = chainService.csvChain(csvChainResponse); result.setFunction(null);
if (csvChainResult != null) { result.setDbChainResult(dbChainResults);
String[] csvRes = JsonUtils.deSerialize(csvChainResult.getResult(), String[].class); result.setKnowledgeContentResult(null);
if (ArrayUtils.isNotEmpty(csvRes)) { sseUtil.send(JsonUtils.serialize(result));
JSONObject echartJSONObject = new JSONObject(); JSONObject echartJSONObject = new JSONObject();
echartJSONObject.put("sql", null); echartJSONObject.put("sql", dbChainResult.getSql());
echartJSONObject.put("sql_result", csvRes.toString()); echartJSONObject.put("sql_result", dbChainResult.getSqlResult());
echartJSONObject.put("question", input); echartJSONObject.put("question", input);
AbstractFunctionResult<String> functionResult = eChartGenerateFunction.doFunction(echartJSONObject.toJSONString(), null, null, null); AbstractFunctionResult<String> functionResult = eChartGenerateFunction.doFunction(echartJSONObject.toJSONString(), null, null, null);
String eChartOption = functionResult.getFunctionResult(); //输出EChart
functionRecord = outputECharts(eChartOption, sseUtil, functionRecord); if (functionResult != null && StringUtils.isNotBlank(functionResult.getFunctionResult())) {
JSONObject jsonObject = JSONObject.parseObject(functionResult.getFunctionResult());
if (!jsonObject.containsKey("skip")) {
ToolFunction toolFunction = new ToolFunction();
toolFunction.setName("echart_function");
toolFunction.setResult(functionResult.getFunctionResult());
toolFunction.setDisplayFormat("json");
toolFunction.setArguments(null);
result = new LargeModelDemandResult();
result.setCode("0");
result.setFunction(toolFunction);
result.setDbChainResult(null);
result.setKnowledgeContentResult(null);
String toolFunctionJson = JsonUtils.serialize(result);
sseUtil.send(toolFunctionJson);
functionRecord = toolFunctionJson;
}
}
}
} else if (StringUtils.isNotBlank(fileUrl)) {
CSVChainResponse csvChainResponse = new CSVChainResponse();
csvChainResponse.setQuestion(input);
csvChainResponse.setContext(null);
csvChainResponse.setFilePath(fileUrl);
csvChainResult = chainService.csvChain(csvChainResponse);
if (csvChainResult != null) {
String[] csvRes = JsonUtils.deSerialize(csvChainResult.getResult(), String[].class);
if (ArrayUtils.isNotEmpty(csvRes)) {
JSONObject echartJSONObject = new JSONObject();
echartJSONObject.put("sql", null);
echartJSONObject.put("sql_result", csvRes.toString());
echartJSONObject.put("question", input);
AbstractFunctionResult<String> functionResult = eChartGenerateFunction.doFunction(echartJSONObject.toJSONString(), null, null, null);
String eChartOption = functionResult.getFunctionResult();
functionRecord = outputECharts(eChartOption, sseUtil, functionRecord);
}
} }
} }
}
//3. 执行对话大模型 //3. 执行对话大模型
List<Message> messages = buildMessage(userId, dialoguesId, gcConfigEntity.getConfigSystem(), input, dbChainResults, csvChainResult); List<Message> messages = buildMessage(userId, dialoguesId, gcConfigEntity.getConfigSystem(), input, dbChainResults, csvChainResult);
LargeModelResponse largeModelResponse = new LargeModelResponse(); LargeModelResponse largeModelResponse = new LargeModelResponse();
largeModelResponse.setModel(gcConfigEntity.getLargeModel()); largeModelResponse.setModel(gcConfigEntity.getLargeModel());
largeModelResponse.setMessages(messages.toArray(new Message[0])); largeModelResponse.setMessages(messages.toArray(new Message[0]));
largeModelResponse.setStream(true); largeModelResponse.setStream(true);
largeModelResponse.setUser("AI_BI_CHAT"); largeModelResponse.setUser("AI_BI_CHAT");
BufferedReader bufferedReader = llmService.chatChunk(largeModelResponse); BufferedReader bufferedReader = llmService.chatChunk(largeModelResponse);
LongtextDialoguesResult longtextDialoguesResult = textOutputStream(sseUtil, bufferedReader); LongtextDialoguesResult longtextDialoguesResult = textOutputStream(sseUtil, bufferedReader);
//保存对话记录 //保存对话记录
BizAgentApplicationDialoguesRecordEntity inputRecord = new BizAgentApplicationDialoguesRecordEntity(); BizAgentApplicationDialoguesRecordEntity inputRecord = new BizAgentApplicationDialoguesRecordEntity();
inputRecord.setMemberId(userId); inputRecord.setMemberId(userId);
inputRecord.setContent(input); inputRecord.setContent(input);
if (StringUtils.isNotBlank(fileUrl)) { if (StringUtils.isNotBlank(fileUrl)) {
inputRecord.setFileUrl(fileUrl); inputRecord.setFileUrl(fileUrl);
}
inputRecord.setDialogsId(dialoguesId);
inputRecord.setRole("user");
inputRecord.setTimestamp(inputTime);
// 保存AI回复记录
BizAgentApplicationDialoguesRecordEntity assistantRecord = new BizAgentApplicationDialoguesRecordEntity();
assistantRecord.setMemberId(userId);
assistantRecord.setContent(longtextDialoguesResult.getMessage());
assistantRecord.setReasoningContent(longtextDialoguesResult.getReasoningContent());
assistantRecord.setDialogsId(dialoguesId);
assistantRecord.setFunction(functionRecord);
assistantRecord.setRole("assistant");
assistantRecord.setTimestamp(System.currentTimeMillis());
bizAgentApplicationDialoguesRecordService.save(inputRecord);
bizAgentApplicationDialoguesRecordService.save(assistantRecord);
} catch (Exception e) {
sseUtil.completeByError(e.getMessage());
} }
inputRecord.setDialogsId(dialoguesId);
inputRecord.setRole("user");
inputRecord.setTimestamp(inputTime);
// 保存AI回复记录
BizAgentApplicationDialoguesRecordEntity assistantRecord = new BizAgentApplicationDialoguesRecordEntity();
assistantRecord.setMemberId(userId);
assistantRecord.setContent(longtextDialoguesResult.getMessage());
assistantRecord.setReasoningContent(longtextDialoguesResult.getReasoningContent());
assistantRecord.setDialogsId(dialoguesId);
assistantRecord.setFunction(functionRecord);
assistantRecord.setRole("assistant");
assistantRecord.setTimestamp(System.currentTimeMillis());
bizAgentApplicationDialoguesRecordService.save(inputRecord);
bizAgentApplicationDialoguesRecordService.save(assistantRecord);
} }
private String outputECharts(String eChartOption, SSEUtil sseUtil, String functionRecord) throws IOException { private String outputECharts(String eChartOption, SSEUtil sseUtil, String functionRecord) throws IOException {
//输出EChart //输出EChart
if (eChartOption != null) { if (eChartOption != null) {
JSONObject jsonObject = JSONObject.parseObject(eChartOption); JSONObject jsonObject = JSONObject.parseObject(eChartOption);
......
...@@ -33,16 +33,21 @@ public class ChainServiceImpl implements ChainService { ...@@ -33,16 +33,21 @@ public class ChainServiceImpl implements ChainService {
@Override @Override
public DBChainResult dbChain(DBChainResponse response) { public DBChainResult dbChain(DBChainResponse response) {
logger.info("dbChain response : {}", response); logger.info("dbChain response : {}", response);
DBChainResult dbChainResult = aiDialogueService.dbChain(response); try {
if (dbChainResult == null || dbChainResult.getStatus().equals("error")) { DBChainResult dbChainResult = aiDialogueService.dbChain(response);
logger.error("dbChain result error : {} , response:{}", dbChainResult, response); if (dbChainResult == null || dbChainResult.getStatus().equals("error")) {
logger.error("dbChain result error : {} , response:{}", dbChainResult, response);
return null;
}
if (StringUtils.isBlank(dbChainResult.getSqlResult())) {
logger.warn("dbChain result sqlResult is blank : {} , response:{}", dbChainResult, response);
return null;
}
return dbChainResult;
} catch (Exception e) {
logger.error("调用数据库失败:{}", e.getMessage());
return null; return null;
} }
if (StringUtils.isBlank(dbChainResult.getSqlResult())) {
logger.warn("dbChain result sqlResult is blank : {} , response:{}", dbChainResult, response);
return null;
}
return dbChainResult;
} }
@Override @Override
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment