Commit 8c04b634 authored by R10's avatar R10

文件对话提交

parent 0681cfb0
package cn.com.poc.ai_data_audit.dto;
import java.util.List;
/**
* @Author:Roger Wu
* @name:BizAiDataAuditTaskDeleteDto
* @Date:2025-10-30 18:46
*/
public class BizAiDataAuditTaskDeleteDto {
List<Integer> taskIds;
public List<Integer> getTaskIds() {
return taskIds;
}
public void setTaskIds(List<Integer> taskIds) {
this.taskIds = taskIds;
}
}
package cn.com.poc.ai_data_audit.dto;
/**
* @Author:Roger Wu
* @name:DataAuditCallDto
* @Date:2025-10-30 19:00
*/
public class DataAuditCallDto {
Integer fileId;
String input;
String dialoguesId;
public Integer getFileId() {
return fileId;
}
public void setFileId(Integer fileId) {
this.fileId = fileId;
}
public String getInput() {
return input;
}
public void setInput(String input) {
this.input = input;
}
public String getDialoguesId() {
return dialoguesId;
}
public void setDialoguesId(String dialoguesId) {
this.dialoguesId = dialoguesId;
}
}
package cn.com.poc.ai_data_audit.dto;
/**
* @Author:Roger Wu
* @name:DataAuditResult
* @Date:2025-10-30 20:01
*/
public class DataAuditResult {
private String message;
private String reasoningContent;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getReasoningContent() {
return reasoningContent;
}
public void setReasoningContent(String reasoningContent) {
this.reasoningContent = reasoningContent;
}
}
package cn.com.poc.ai_data_audit.rest; package cn.com.poc.ai_data_audit.rest;
import cn.com.poc.ai_data_audit.dto.BizAiDataAuditTaskDeleteDto;
import cn.com.poc.writing.dto.ExaminationBatchDeleteDto;
import cn.com.yict.framemax.core.rest.BaseRest; import cn.com.yict.framemax.core.rest.BaseRest;
import cn.com.poc.ai_data_audit.dto.BizAiDataAuditTaskDto; import cn.com.poc.ai_data_audit.dto.BizAiDataAuditTaskDto;
import cn.com.yict.framemax.data.model.PagingInfo; import cn.com.yict.framemax.data.model.PagingInfo;
...@@ -17,5 +19,5 @@ public interface BizAiDataAuditTaskRest extends BaseRest { ...@@ -17,5 +19,5 @@ public interface BizAiDataAuditTaskRest extends BaseRest {
BizAiDataAuditTaskDto getByTaskId(@RequestParam Integer taskId) throws Exception; BizAiDataAuditTaskDto getByTaskId(@RequestParam Integer taskId) throws Exception;
void delete(@RequestParam Integer taskId) throws Exception; void delete(@RequestBody BizAiDataAuditTaskDeleteDto dto) throws Exception;
} }
\ No newline at end of file
package cn.com.poc.ai_data_audit.rest; package cn.com.poc.ai_data_audit.rest;
import cn.com.poc.ai_data_audit.dto.FileUploadConfirmDto; import cn.com.poc.ai_data_audit.dto.*;
import cn.com.poc.ai_data_audit.dto.FileUploadDto;
import cn.com.poc.ai_data_audit.dto.FileUploadReturnDto;
import cn.com.yict.framemax.core.rest.BaseRest; import cn.com.yict.framemax.core.rest.BaseRest;
import cn.com.yict.framemax.web.permission.Access; import cn.com.yict.framemax.web.permission.Access;
import cn.com.yict.framemax.web.permission.Permission; import cn.com.yict.framemax.web.permission.Permission;
...@@ -26,9 +24,9 @@ public interface DataAuditRest extends BaseRest { ...@@ -26,9 +24,9 @@ public interface DataAuditRest extends BaseRest {
/** /**
* 对话 * 对话
* @param fileId * @param dataAuditCallDto
* @param input * @param input
* @throws Exception * @throws Exception
*/ */
void call(@RequestParam String fileId, @RequestParam String input) throws Exception; DataAuditResult call(@RequestBody DataAuditCallDto dataAuditCallDto) throws Exception;
} }
...@@ -6,9 +6,11 @@ import javax.annotation.Resource; ...@@ -6,9 +6,11 @@ import javax.annotation.Resource;
import cn.com.poc.ai_data_audit.convert.BizAiDataAuditFileConvert; import cn.com.poc.ai_data_audit.convert.BizAiDataAuditFileConvert;
import cn.com.poc.ai_data_audit.dto.BizAiDataAuditFileDto; import cn.com.poc.ai_data_audit.dto.BizAiDataAuditFileDto;
import cn.com.poc.ai_data_audit.dto.BizAiDataAuditTaskDeleteDto;
import cn.com.poc.ai_data_audit.entity.BizAiDataAuditFileEntity; import cn.com.poc.ai_data_audit.entity.BizAiDataAuditFileEntity;
import cn.com.poc.ai_data_audit.service.BizAiDataAuditFileService; import cn.com.poc.ai_data_audit.service.BizAiDataAuditFileService;
import cn.com.poc.common.utils.BlContext; import cn.com.poc.common.utils.BlContext;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import cn.com.poc.ai_data_audit.rest.BizAiDataAuditTaskRest; import cn.com.poc.ai_data_audit.rest.BizAiDataAuditTaskRest;
import cn.com.poc.ai_data_audit.service.BizAiDataAuditTaskService; import cn.com.poc.ai_data_audit.service.BizAiDataAuditTaskService;
...@@ -66,8 +68,12 @@ public class BizAiDataAuditTaskRestImpl implements BizAiDataAuditTaskRest { ...@@ -66,8 +68,12 @@ public class BizAiDataAuditTaskRestImpl implements BizAiDataAuditTaskRest {
} }
@Override @Override
public void delete(Integer taskId) throws Exception { public void delete(BizAiDataAuditTaskDeleteDto dto) throws Exception {
Assert.notNull(taskId, "taskId can not be null"); if (CollectionUtils.isEmpty(dto.getTaskIds())) {
bizAiDataAuditTaskService.delete(taskId); throw new Exception("the task can not be found");
}
for (Integer taskId : dto.getTaskIds()) {
bizAiDataAuditTaskService.delete(taskId);
}
} }
} }
\ No newline at end of file
package cn.com.poc.ai_data_audit.rest.impl; package cn.com.poc.ai_data_audit.rest.impl;
import cn.com.poc.ai_data_audit.dto.*;
import cn.com.poc.ai_data_audit.rest.DataAuditRest; import cn.com.poc.ai_data_audit.rest.DataAuditRest;
import cn.com.poc.ai_data_audit.dto.BizAiDataAuditFileDto;
import cn.com.poc.ai_data_audit.dto.FileUploadConfirmDto;
import cn.com.poc.ai_data_audit.dto.FileUploadDto;
import cn.com.poc.ai_data_audit.dto.FileUploadReturnDto;
import cn.com.poc.ai_data_audit.service.BizAiDataAuditTaskService; import cn.com.poc.ai_data_audit.service.BizAiDataAuditTaskService;
import cn.com.poc.ai_data_audit.service.DataAuditService; import cn.com.poc.ai_data_audit.service.DataAuditService;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
...@@ -52,8 +49,8 @@ public class DataAuditRestImpl implements DataAuditRest { ...@@ -52,8 +49,8 @@ public class DataAuditRestImpl implements DataAuditRest {
* @throws Exception * @throws Exception
*/ */
@Override @Override
public void call(String fileId, String input) throws Exception { public DataAuditResult call(DataAuditCallDto dataAuditCallDto) throws Exception {
return dataAuditService.call(dataAuditCallDto);
} }
......
package cn.com.poc.ai_data_audit.service; package cn.com.poc.ai_data_audit.service;
import cn.com.poc.ai_data_audit.dto.FileUploadConfirmDto; import cn.com.poc.ai_data_audit.dto.DataAuditCallDto;
import cn.com.poc.ai_data_audit.dto.DataAuditResult;
import cn.com.poc.ai_data_audit.dto.FileUploadDto; import cn.com.poc.ai_data_audit.dto.FileUploadDto;
import cn.com.poc.ai_data_audit.entity.BizAiDataAuditTaskEntity;
import cn.com.yict.framemax.core.service.BaseService; import cn.com.yict.framemax.core.service.BaseService;
import cn.com.yict.framemax.data.model.PagingInfo;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
...@@ -15,4 +14,5 @@ public interface DataAuditService extends BaseService { ...@@ -15,4 +14,5 @@ public interface DataAuditService extends BaseService {
public List fileUploadAndProcessing(List<FileUploadDto> fileUploadDtoList) throws ExecutionException, InterruptedException; public List fileUploadAndProcessing(List<FileUploadDto> fileUploadDtoList) throws ExecutionException, InterruptedException;
DataAuditResult call(DataAuditCallDto dataAuditCallDto) throws Exception;
} }
\ No newline at end of file
package cn.com.poc.ai_data_audit.service.impl; package cn.com.poc.ai_data_audit.service.impl;
import cn.com.poc.agent_application.entity.BizAgentApplicationDialoguesRecordEntity;
import cn.com.poc.agent_application.entity.BizAgentApplicationGcConfigEntity; import cn.com.poc.agent_application.entity.BizAgentApplicationGcConfigEntity;
import cn.com.poc.agent_application.service.BizAgentApplicationDialoguesRecordService;
import cn.com.poc.agent_application.service.BizAgentApplicationGcConfigService; import cn.com.poc.agent_application.service.BizAgentApplicationGcConfigService;
import cn.com.poc.ai_data_audit.dto.DataAuditCallDto;
import cn.com.poc.ai_data_audit.dto.DataAuditResult;
import cn.com.poc.ai_data_audit.dto.FileUploadDto; import cn.com.poc.ai_data_audit.dto.FileUploadDto;
import cn.com.poc.ai_data_audit.dto.FileUploadReturnDto; import cn.com.poc.ai_data_audit.dto.FileUploadReturnDto;
import cn.com.poc.ai_data_audit.entity.AIDataAuditMatchFileNameResponse; import cn.com.poc.ai_data_audit.entity.AIDataAuditMatchFileNameResponse;
import cn.com.poc.ai_data_audit.entity.BizAiDataAuditFileEntity;
import cn.com.poc.ai_data_audit.service.BizAiDataAuditFileService;
import cn.com.poc.ai_data_audit.service.DataAuditService; import cn.com.poc.ai_data_audit.service.DataAuditService;
import cn.com.poc.common.utils.DocumentLoad; import cn.com.poc.common.constant.CommonConstant;
import cn.com.poc.common.utils.*;
import cn.com.poc.law.entity.motorVehicleDrivingComplaint.Plaintiff; import cn.com.poc.law.entity.motorVehicleDrivingComplaint.Plaintiff;
import cn.com.poc.thirdparty.resource.demand.ai.aggregate.MinerUOcrService; import cn.com.poc.ocr.entity.BizFileOcrCacheEntity;
import cn.com.poc.ocr.service.BizFileOcrCacheService;
import cn.com.poc.thirdparty.resource.demand.ai.constants.LLMRoleEnum; import cn.com.poc.thirdparty.resource.demand.ai.constants.LLMRoleEnum;
import cn.com.poc.thirdparty.resource.demand.ai.entity.dialogue.Message; import cn.com.poc.thirdparty.resource.demand.ai.entity.dialogue.Message;
import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelDemandResult; import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelDemandResult;
...@@ -19,11 +27,15 @@ import cn.com.yict.framemax.core.exception.BusinessException; ...@@ -19,11 +27,15 @@ import cn.com.yict.framemax.core.exception.BusinessException;
import cn.com.yict.framemax.core.service.impl.BaseServiceImpl; import cn.com.yict.framemax.core.service.impl.BaseServiceImpl;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
...@@ -34,9 +46,19 @@ import java.util.stream.Collectors; ...@@ -34,9 +46,19 @@ import java.util.stream.Collectors;
@Service @Service
public class DataAuditServiceImpl extends BaseServiceImpl public class DataAuditServiceImpl extends BaseServiceImpl
implements DataAuditService { implements DataAuditService {
@Resource
private BizAiDataAuditFileService bizAiDataAuditFileService;
@Resource @Resource
private LLMService llmService; private LLMService llmService;
@Resource
private BizFileOcrCacheService bizFileOcrCacheService;
@Resource
private BizAgentApplicationDialoguesRecordService bizAgentApplicationDialoguesRecordService;
@Resource @Resource
private BizAgentApplicationGcConfigService bizAgentApplicationGcConfigService; private BizAgentApplicationGcConfigService bizAgentApplicationGcConfigService;
...@@ -139,6 +161,132 @@ public class DataAuditServiceImpl extends BaseServiceImpl ...@@ -139,6 +161,132 @@ public class DataAuditServiceImpl extends BaseServiceImpl
return fileUploadReturnDtoList; return fileUploadReturnDtoList;
} }
@Override
public DataAuditResult call(DataAuditCallDto dataAuditCallDto) throws Exception {
Long userId = BlContext.getCurrentUser().getUserId();
String input = dataAuditCallDto.getInput();
String dialoguesId = dataAuditCallDto.getDialoguesId();
Assert.notNull(dataAuditCallDto.getFileId(), "file can not be null");
//记录提问时间
long inputTimestamp = System.currentTimeMillis();
SSEUtil sseUtil = new SSEUtil();
// 获取大模型配置
String promptCode = "AIDataAuditCall";
BizAgentApplicationGcConfigEntity documentDialoguePrompt = bizAgentApplicationGcConfigService.getByConfigCode(promptCode);
if (documentDialoguePrompt == null || StringUtils.isBlank(documentDialoguePrompt.getConfigSystem())) {
throw new BusinessException("获取对话提示词失败");
}
BizAiDataAuditFileEntity bizAiDataAuditFileEntity = bizAiDataAuditFileService.get(dataAuditCallDto.getFileId());
BizFileOcrCacheEntity example = new BizFileOcrCacheEntity();
example.setMd5(bizAiDataAuditFileEntity.getMd5());
List<BizFileOcrCacheEntity> bizFileOcrCacheEntityList = bizFileOcrCacheService.findByExample(example,null);
if(CollectionUtils.isEmpty(bizFileOcrCacheEntityList)){
throw new BusinessException("can not file the file");
}
File file = DocumentLoad.downloadURLDocument(bizFileOcrCacheEntityList.get(0).getMdFileUrl());
String fileContent="";
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String content;
while ((content = br.readLine()) != null) {
fileContent=content+fileContent;
}
} catch (IOException e) {
e.printStackTrace();
}
//组装请求参数
List<Message> messages = buildMessagesAndRecord(dialoguesId, userId, input, null, documentDialoguePrompt.getConfigSystem().replace("${content}", fileContent));
LargeModelResponse largeModelResponse = new LargeModelResponse();
largeModelResponse.setModel(documentDialoguePrompt.getLargeModel());
largeModelResponse.setMessages(messages.toArray(new Message[0]));
largeModelResponse.setStream(true);
BufferedReader bufferedReader = llmService.chatChunk(largeModelResponse);
DataAuditResult dataAuditResult = textOutputStream(sseUtil, bufferedReader);
// 保存用户输入记录
BizAgentApplicationDialoguesRecordEntity inputRecord = new BizAgentApplicationDialoguesRecordEntity();
inputRecord.setMemberId(userId);
inputRecord.setContent(input);
inputRecord.setDialogsId(dialoguesId);
inputRecord.setRole(LLMRoleEnum.USER.getRole());
inputRecord.setTimestamp(inputTimestamp);
// 保存AI回复记录
BizAgentApplicationDialoguesRecordEntity assistantRecord = new BizAgentApplicationDialoguesRecordEntity();
assistantRecord.setMemberId(userId);
assistantRecord.setContent(dataAuditResult.getMessage());
assistantRecord.setReasoningContent(dataAuditResult.getReasoningContent());
assistantRecord.setDialogsId(dialoguesId);
assistantRecord.setRole(LLMRoleEnum.ASSISTANT.getRole());
assistantRecord.setTimestamp(System.currentTimeMillis());
bizAgentApplicationDialoguesRecordService.save(inputRecord);
bizAgentApplicationDialoguesRecordService.save(assistantRecord);
return dataAuditResult;
}
/**
* 文本输出结果
*
* @param sseUtil
* @param bufferedReader
* @throws IOException
*/
private DataAuditResult textOutputStream(SSEUtil sseUtil, BufferedReader bufferedReader) throws IOException {
String res = "";
StringBuilder output = new StringBuilder();
StringBuilder reasoningContent = new StringBuilder();
try {
while ((res = bufferedReader.readLine()) != null) {
if (StringUtils.isEmpty(res)) {
continue;
}
res = StringUtils.replace(res, "data: ", StringUtils.EMPTY);
LargeModelDemandResult result = JsonUtils.deSerialize(res, LargeModelDemandResult.class);
if (!"0".equals(result.getCode())) {
BusinessException ex = new BusinessException("exception/call.failure");
result.setMessage(ex.getMessage());
sseUtil.send(JsonUtils.serialize(result));
sseUtil.send("[DONE]");
sseUtil.complete();
throw ex;
}
result.setFunction(null);
result.setDbChainResult(null);
result.setKnowledgeContentResult(null);
result.setMessage(result.getMessage());
sseUtil.send(JsonUtils.serialize(result));
if (StringUtils.isNotEmpty(result.getMessage())) {
output.append(result.getMessage());
}
if (StringUtils.isNotEmpty(result.getReasoningContent())) {
reasoningContent.append(result.getReasoningContent());
}
}
// 关闭资源
sseUtil.send("[DONE]");
sseUtil.complete();
DataAuditResult dataAuditResult = new DataAuditResult();
dataAuditResult.setMessage(output.toString());
dataAuditResult.setReasoningContent(reasoningContent.toString());
return dataAuditResult;
} catch (IOException e) {
sseUtil.completeByError("连接断开");
throw new BusinessException("连接断开");
} finally {
bufferedReader.close();
sseUtil.complete();
}
}
public List<AIDataAuditMatchFileNameResponse> matchOriginalTemplateAndUploadFile(List<String> fileNames) throws Exception { public List<AIDataAuditMatchFileNameResponse> matchOriginalTemplateAndUploadFile(List<String> fileNames) throws Exception {
// 获取对话提示词 // 获取对话提示词
String promptCode = "AIDataAuditMatchFileName"; String promptCode = "AIDataAuditMatchFileName";
...@@ -172,28 +320,23 @@ public class DataAuditServiceImpl extends BaseServiceImpl ...@@ -172,28 +320,23 @@ public class DataAuditServiceImpl extends BaseServiceImpl
} }
private List<Message> buildMessages(String input, String fileUrl, String prompt) throws Exception { private List<Message> buildMessages(String input, String fileUrl, String prompt) throws Exception {
// 配置message
List<Message> messages = new ArrayList<>();
Message systemMessage = new Message();
systemMessage.setContent(prompt);
systemMessage.setRole(LLMRoleEnum.SYSTEM.getRole());
messages.add(systemMessage);
// 用户输入
Message message = new Message();
message.setContent(input);
message.setRole(LLMRoleEnum.USER.getRole());
messages.add(message);
// 加载文件 return messages;
String fileContent = StringUtils.EMPTY; }
if (StringUtils.isNoneBlank(fileUrl)) {
File file = DocumentLoad.downloadURLDocument(fileUrl);
fileContent = DocumentLoad.documentToText(file);
}
// 加载对话提示词 private List<Message> buildMessagesAndRecord(String dialoguesId, Long userId, String input, String fileUrl, String prompt) throws Exception {
// String prompt = documentDialoguePrompt.getConfigSystem();
// if (CollectionUtils.isNotEmpty(knowledgeContentResults)) {
// String knowledgeContent = JsonUtils.serialize(knowledgeContentResults);
// prompt = prompt.replace("${knowledgeContent}", knowledgeContent);
// } else {
// prompt = prompt.replace("${knowledgeContent}", StringUtils.EMPTY);
// }
// if (toolFunction != null) {
// prompt = prompt.replace("${toolFunction}", JsonUtils.serialize(toolFunction));
// }
//
// prompt = prompt.replace("${question}", input).replace("${fileContent}", fileContent);
// 配置message // 配置message
List<Message> messages = new ArrayList<>(); List<Message> messages = new ArrayList<>();
...@@ -202,13 +345,34 @@ public class DataAuditServiceImpl extends BaseServiceImpl ...@@ -202,13 +345,34 @@ public class DataAuditServiceImpl extends BaseServiceImpl
systemMessage.setRole(LLMRoleEnum.SYSTEM.getRole()); systemMessage.setRole(LLMRoleEnum.SYSTEM.getRole());
messages.add(systemMessage); messages.add(systemMessage);
// 对话记录
BizAgentApplicationDialoguesRecordEntity recordEntity = new BizAgentApplicationDialoguesRecordEntity();
recordEntity.setDialogsId(dialoguesId);
recordEntity.setIsDeleted(CommonConstant.IsDeleted.N);
recordEntity.setMemberId(userId);
List<BizAgentApplicationDialoguesRecordEntity> recordEntities = bizAgentApplicationDialoguesRecordService.findByExample(recordEntity, null);
if (CollectionUtils.isNotEmpty(recordEntities)) {
for (BizAgentApplicationDialoguesRecordEntity entity : recordEntities) {
Message message = new Message();
message.setContent(entity.getContent());
message.setRole(entity.getRole());
messages.add(message);
}
}
//判断最后是否为User,若是则删除。
if (CollectionUtils.isNotEmpty(messages)) {
if (LLMRoleEnum.USER.getRole().equals(messages.get(messages.size() - 1).getRole())) {
Long recordId = recordEntities.get(recordEntities.size() - 1).getId();
bizAgentApplicationDialoguesRecordService.deletedById(recordId);
messages.remove(messages.size() - 1);
}
}
// 用户输入 // 用户输入
Message message = new Message(); Message message = new Message();
message.setContent(""); message.setContent(input);
message.setRole(LLMRoleEnum.USER.getRole()); message.setRole(LLMRoleEnum.USER.getRole());
messages.add(message); messages.add(message);
// logger.info("--------- Build Messages dialogsId:{},messages:{}--------------", dialogsId, messages);
return messages; return messages;
} }
......
...@@ -38,6 +38,9 @@ public enum AiDialoguesTypeEnum { ...@@ -38,6 +38,9 @@ public enum AiDialoguesTypeEnum {
CAR_RECOMMEND("car_recommend","车辆推荐"), CAR_RECOMMEND("car_recommend","车辆推荐"),
DATA_AUDIT("data_audit","数据校验"),
; ;
private final String type; private final String type;
......
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