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

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

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

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

@ -18,10 +18,8 @@ import org.springframework.web.bind.annotation.*;
@RequiredArgsConstructor
public class PromptController {
private final NotePromptService promptService;
/**
*
*
@ -31,9 +29,15 @@ public class PromptController {
@PostMapping("/list")
@Operation(summary = "查询提示词列表")
public R<IPage<NotePromptDTO>> listPrompt(@RequestBody NotePrompt notePrompt,
@RequestParam(required = false, defaultValue = "1") Integer page,
@RequestParam(required = false, defaultValue = "20") Integer size) {
@RequestParam(required = false, defaultValue = "1") Integer page,
@RequestParam(required = false, defaultValue = "20") Integer size) {
IPage<NotePromptDTO> notePrompts = promptService.listPrompt(page, size, notePrompt);
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
public class NotePromptDTO extends NotePrompt {
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);
String promptDebugging(NotePromptDTO notePromptDTO);
}

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

Loading…
Cancel
Save