|
|
|
@ -5,25 +5,33 @@ import cn.hutool.core.util.StrUtil;
|
|
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
|
|
import com.supervision.police.domain.ModelRecordType;
|
|
|
|
|
import com.supervision.police.domain.NotePrompt;
|
|
|
|
|
import com.supervision.police.domain.NotePromptTypeRel;
|
|
|
|
|
import com.supervision.police.domain.NoteRecordSplit;
|
|
|
|
|
import com.supervision.common.constant.NotePromptConstants;
|
|
|
|
|
import com.supervision.common.utils.StringUtils;
|
|
|
|
|
import com.supervision.demo.dto.QARecordNodeDTO;
|
|
|
|
|
import com.supervision.minio.domain.MinioFile;
|
|
|
|
|
import com.supervision.minio.service.MinioService;
|
|
|
|
|
import com.supervision.police.domain.*;
|
|
|
|
|
import com.supervision.police.dto.LLMExtractDto;
|
|
|
|
|
import com.supervision.police.dto.NotePromptDTO;
|
|
|
|
|
import com.supervision.police.mapper.NotePromptMapper;
|
|
|
|
|
import com.supervision.police.service.ModelRecordTypeService;
|
|
|
|
|
import com.supervision.police.service.NotePromptService;
|
|
|
|
|
import com.supervision.police.service.NotePromptTypeRelService;
|
|
|
|
|
import com.supervision.police.service.NoteRecordSplitService;
|
|
|
|
|
import com.supervision.police.service.*;
|
|
|
|
|
import com.supervision.utils.RecordRegexUtil;
|
|
|
|
|
import com.supervision.utils.WordReadUtil;
|
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.springframework.ai.chat.ChatClient;
|
|
|
|
|
import org.springframework.ai.chat.ChatResponse;
|
|
|
|
|
import org.springframework.ai.chat.messages.UserMessage;
|
|
|
|
|
import org.springframework.ai.chat.prompt.Prompt;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.Optional;
|
|
|
|
|
import java.io.BufferedReader;
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
import java.io.InputStream;
|
|
|
|
|
import java.io.InputStreamReader;
|
|
|
|
|
import java.nio.charset.StandardCharsets;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
@Slf4j
|
|
|
|
@ -40,6 +48,12 @@ public class NotePromptServiceImpl extends ServiceImpl<NotePromptMapper, NotePro
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final NotePromptTypeRelService notePromptTypeRelService;
|
|
|
|
|
@Autowired
|
|
|
|
|
private MinioService minioService;
|
|
|
|
|
@Autowired
|
|
|
|
|
private LLMExtractService llmExtractService;
|
|
|
|
|
@Autowired
|
|
|
|
|
private ChatClient chatClient;
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public List<NotePrompt> listPromptBySplitId(String recordSplitId) {
|
|
|
|
@ -96,4 +110,69 @@ public class NotePromptServiceImpl extends ServiceImpl<NotePromptMapper, NotePro
|
|
|
|
|
public IPage<NotePromptDTO> listPrompt(int page, int size, NotePrompt notePrompt) {
|
|
|
|
|
return notePromptMapper.selectNotePromptWithMatchNum(new Page<>(page, size), notePrompt);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public String promptDebugging(NotePromptDTO notePromptDTO) {
|
|
|
|
|
String result = "";
|
|
|
|
|
String text = notePromptDTO.getText();
|
|
|
|
|
String fileId = notePromptDTO.getFileId();
|
|
|
|
|
if (StringUtils.isNotEmpty(fileId)) {
|
|
|
|
|
MinioFile minioFile = minioService.getMinioFile(fileId);
|
|
|
|
|
if (minioFile != null) {
|
|
|
|
|
if (minioFile.getFilename().endsWith(".doc") || minioFile.getFilename().endsWith(".docx")) {
|
|
|
|
|
log.info("当前文件名为:{},当做word文件处理...", minioFile.getFilename());
|
|
|
|
|
text = WordReadUtil.readWord(minioService.getObjectInputStream(minioFile));
|
|
|
|
|
} else if (minioFile.getFilename().endsWith(".txt")) {
|
|
|
|
|
log.info("当前文件名为:{},当做txt文件处理...", minioFile.getFilename());
|
|
|
|
|
InputStream inputStream = minioService.getObjectInputStream(minioFile);
|
|
|
|
|
try (inputStream) {
|
|
|
|
|
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
|
|
|
|
|
text = reader.lines().collect(Collectors.joining("\n"));
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
|
log.error("读取文件内容失败", e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (StringUtils.isEmpty(text)) {
|
|
|
|
|
log.info("未上传文件且调试文本为空...");
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
String type = notePromptDTO.getType();
|
|
|
|
|
if (NotePromptConstants.TYPE_GRAPH_REASONING.equals(type)) {
|
|
|
|
|
List<QARecordNodeDTO> qaList = RecordRegexUtil.recordRegex(text, "");
|
|
|
|
|
log.info("拆分问答对:{}", qaList.size());
|
|
|
|
|
if (qaList.isEmpty()) {
|
|
|
|
|
return "未找到问答对";
|
|
|
|
|
}
|
|
|
|
|
QARecordNodeDTO qaRecordNodeDTO = qaList.get(0);
|
|
|
|
|
HashMap<String, String> paramMap = new HashMap<>();
|
|
|
|
|
paramMap.put("headEntityType", notePromptDTO.getStartEntityType());
|
|
|
|
|
paramMap.put("relation", notePromptDTO.getRelType());
|
|
|
|
|
paramMap.put("tailEntityType", notePromptDTO.getEndEntityType());
|
|
|
|
|
paramMap.put("question", qaRecordNodeDTO.getQuestion());
|
|
|
|
|
paramMap.put("answer", qaRecordNodeDTO.getAnswer());
|
|
|
|
|
paramMap.put("requirement", "");
|
|
|
|
|
log.info("开始尝试提取三元组:{}-{}-{}", notePromptDTO.getStartEntityType(), notePromptDTO.getRelType(), notePromptDTO.getEndEntityType());
|
|
|
|
|
String format = StrUtil.format(notePromptDTO.getPrompt(), paramMap);
|
|
|
|
|
log.info("提示词内容:{}", format);
|
|
|
|
|
ChatResponse call = chatClient.call(new Prompt(new UserMessage(format)));
|
|
|
|
|
String content = call.getResult().getOutput().getContent();
|
|
|
|
|
log.info("三元组提取结果:{}", content);
|
|
|
|
|
result = content;
|
|
|
|
|
} else if (NotePromptConstants.TYPE_STRUCTURAL_REASONING.equals(type)) {
|
|
|
|
|
LLMExtractDto llmExtractDto = new LLMExtractDto();
|
|
|
|
|
llmExtractDto.setText(text);
|
|
|
|
|
llmExtractDto.setPrompt(notePromptDTO.getPrompt());
|
|
|
|
|
llmExtractDto.setExtractAttributes(notePromptDTO.getExtractAttributes());
|
|
|
|
|
List<LLMExtractDto> llmExtractDtos = llmExtractService.extractAttribute(Collections.singletonList(llmExtractDto));
|
|
|
|
|
if (CollUtil.isNotEmpty(llmExtractDtos)) {
|
|
|
|
|
result = llmExtractDtos.get(0).toString();
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
log.info("未找到对应的调试类型...【{}】", type);
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|