提示词调试接口改造,minio上传临时文件接口改造

topo_dev
DESKTOP-DDTUS3E\yaxin 7 months ago
parent 863f3e819f
commit 86cc6ab8c9

@ -3,16 +3,16 @@ package com.supervision.minio.client;
import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.IoUtil;
import com.supervision.minio.exception.SysObsException; import com.supervision.minio.exception.SysObsException;
import io.minio.*; import io.minio.*;
import io.minio.errors.*; import io.minio.errors.MinioException;
import io.minio.messages.DeleteError; import io.minio.messages.DeleteError;
import io.minio.messages.DeleteObject; import io.minio.messages.DeleteObject;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.security.InvalidKeyException; import java.security.InvalidKeyException;
@ -36,7 +36,6 @@ public class MinioTemplate {
@Value("${minio.bucketName}") @Value("${minio.bucketName}")
private String bucketName; private String bucketName;
/** /**
* *
* *
@ -46,12 +45,10 @@ public class MinioTemplate {
* @param stream * @param stream
* @param objectSize * @param objectSize
* @param contentType contentType * @param contentType contentType
* @return void * @param tags
* @author qmy * @throws SysObsException
* @version 1.0.0 2021/6/30 9:11
* @since JDK1.8
*/ */
public void putObject(String bucketName, String objectName, Map<String, String> userMetadata, InputStream stream, long objectSize, String contentType) { public void putObject(String bucketName, String objectName, Map<String, String> userMetadata, InputStream stream, long objectSize, String contentType, Map<String, String> tags) {
try { try {
minioClient.putObject(PutObjectArgs.builder() minioClient.putObject(PutObjectArgs.builder()
.bucket(bucketName) .bucket(bucketName)
@ -59,6 +56,7 @@ public class MinioTemplate {
.userMetadata(userMetadata) .userMetadata(userMetadata)
.contentType(contentType == null ? "application/octet-stream" : contentType) .contentType(contentType == null ? "application/octet-stream" : contentType)
.stream(stream, objectSize, -1) .stream(stream, objectSize, -1)
.tags(tags)
.build()); .build());
} catch (MinioException | InvalidKeyException | IOException | NoSuchAlgorithmException e) { } catch (MinioException | InvalidKeyException | IOException | NoSuchAlgorithmException e) {
e.printStackTrace(); e.printStackTrace();
@ -227,7 +225,7 @@ public class MinioTemplate {
if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) { if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
log.info("未找到bucket:{},自动建立", bucketName); log.info("未找到bucket:{},自动建立", bucketName);
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
}else { } else {
log.info("bucket:{}已存在", bucketName); log.info("bucket:{}已存在", bucketName);
} }
} }

@ -8,12 +8,12 @@ import com.supervision.minio.client.MinioTemplate;
import com.supervision.minio.domain.MinioFile; import com.supervision.minio.domain.MinioFile;
import com.supervision.minio.mapper.MinioFileMapper; import com.supervision.minio.mapper.MinioFileMapper;
import com.supervision.minio.service.MinioService; import com.supervision.minio.service.MinioService;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.*; import java.util.*;
@ -45,7 +45,11 @@ public class MinioServiceImpl implements MinioService {
minioFile.setSize(in.available()); minioFile.setSize(in.available());
int i = minioFileMapper.insert(minioFile); int i = minioFileMapper.insert(minioFile);
if (i > 0) { if (i > 0) {
minioTemplate.putObject(bucketName, temp ? "temp-" + minioFile.getId() : minioFile.getId(), null, in, in.available(), file.getContentType()); Map<String, String> tags = new HashMap<>();
if (temp) {
tags.put("type", "temp");
}
minioTemplate.putObject(bucketName, minioFile.getId(), null, in, in.available(), file.getContentType(), tags);
return minioFile.getId(); return minioFile.getId();
} else { } else {
return null; return null;
@ -53,7 +57,7 @@ public class MinioServiceImpl implements MinioService {
} }
@Override @Override
public void downloadFile(String fileId, HttpServletResponse response){ public void downloadFile(String fileId, HttpServletResponse response) {
MinioFile minioFile = minioFileMapper.selectById(fileId); MinioFile minioFile = minioFileMapper.selectById(fileId);
String fileType = minioFile.getFileType(); String fileType = minioFile.getFileType();
minioTemplate.getObject(bucketName, fileId, fileType, response); minioTemplate.getObject(bucketName, fileId, fileType, response);
@ -89,7 +93,7 @@ public class MinioServiceImpl implements MinioService {
@Override @Override
public List<MinioFile> listMinioFile(List<String> fileIdList) { public List<MinioFile> listMinioFile(List<String> fileIdList) {
if (CollUtil.isEmpty(fileIdList)){ if (CollUtil.isEmpty(fileIdList)) {
return new ArrayList<>(1); return new ArrayList<>(1);
} }
return minioFileMapper.selectBatchIds(fileIdList); return minioFileMapper.selectBatchIds(fileIdList);

@ -18,10 +18,8 @@ import org.springframework.web.bind.annotation.*;
@RequiredArgsConstructor @RequiredArgsConstructor
public class PromptController { public class PromptController {
private final NotePromptService promptService; private final NotePromptService promptService;
/** /**
* *
* *
@ -36,4 +34,10 @@ public class PromptController {
IPage<NotePromptDTO> notePrompts = promptService.listPrompt(page, size, notePrompt); IPage<NotePromptDTO> notePrompts = promptService.listPrompt(page, size, notePrompt);
return R.ok(notePrompts); return R.ok(notePrompts);
} }
@PostMapping("/promptDebugging")
@Operation(summary = "提示词调试")
public R<String> promptDebugging(@RequestBody NotePromptDTO notePromptDTO) {
return R.ok(promptService.promptDebugging(notePromptDTO));
}
} }

@ -8,4 +8,6 @@ import lombok.EqualsAndHashCode;
@Data @Data
public class NotePromptDTO extends NotePrompt { public class NotePromptDTO extends NotePrompt {
private Integer matchNum; private Integer matchNum;
private String fileId;
private String text;
} }

@ -13,4 +13,6 @@ public interface NotePromptService extends IService<NotePrompt> {
IPage<NotePromptDTO> listPrompt(int page, int size, NotePrompt notePrompt); IPage<NotePromptDTO> listPrompt(int page, int size, NotePrompt notePrompt);
String promptDebugging(NotePromptDTO notePromptDTO);
} }

@ -150,6 +150,7 @@ public class LLMExtractServiceImpl implements LLMExtractService {
ChatResponse call = ollamaChatClient.call(new Prompt(new UserMessage(prompt))); ChatResponse call = ollamaChatClient.call(new Prompt(new UserMessage(prompt)));
String content = call.getResult().getOutput().getContent(); String content = call.getResult().getOutput().getContent();
JSONObject jsonObject = new JSONObject(content); JSONObject jsonObject = new JSONObject(content);
log.info("属性提取结果: {}", jsonObject);
List<NotePromptExtractAttributesDto> extractAttributesList = LLMExtractDto.getExtractAttributes(); List<NotePromptExtractAttributesDto> extractAttributesList = LLMExtractDto.getExtractAttributes();
extractAttributesMap.forEach((key, value) -> { extractAttributesMap.forEach((key, value) -> {
String attrValue = jsonObject.getString(key); String attrValue = jsonObject.getString(key);

@ -5,25 +5,33 @@ import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.supervision.police.domain.ModelRecordType; import com.supervision.common.constant.NotePromptConstants;
import com.supervision.police.domain.NotePrompt; import com.supervision.common.utils.StringUtils;
import com.supervision.police.domain.NotePromptTypeRel; import com.supervision.demo.dto.QARecordNodeDTO;
import com.supervision.police.domain.NoteRecordSplit; 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.dto.NotePromptDTO;
import com.supervision.police.mapper.NotePromptMapper; import com.supervision.police.mapper.NotePromptMapper;
import com.supervision.police.service.ModelRecordTypeService; import com.supervision.police.service.*;
import com.supervision.police.service.NotePromptService; import com.supervision.utils.RecordRegexUtil;
import com.supervision.police.service.NotePromptTypeRelService; import com.supervision.utils.WordReadUtil;
import com.supervision.police.service.NoteRecordSplitService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; 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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.io.BufferedReader;
import java.util.List; import java.io.IOException;
import java.util.Map; import java.io.InputStream;
import java.util.Optional; import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Slf4j @Slf4j
@ -40,6 +48,12 @@ public class NotePromptServiceImpl extends ServiceImpl<NotePromptMapper, NotePro
private final NotePromptTypeRelService notePromptTypeRelService; private final NotePromptTypeRelService notePromptTypeRelService;
@Autowired
private MinioService minioService;
@Autowired
private LLMExtractService llmExtractService;
@Autowired
private ChatClient chatClient;
@Override @Override
public List<NotePrompt> listPromptBySplitId(String recordSplitId) { 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) { public IPage<NotePromptDTO> listPrompt(int page, int size, NotePrompt notePrompt) {
return notePromptMapper.selectNotePromptWithMatchNum(new Page<>(page, size), 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;
}
} }

Loading…
Cancel
Save