更新ai功能
This commit is contained in:
parent
95a82bb69c
commit
c6b5471858
|
|
@ -1,11 +1,13 @@
|
||||||
package com.electromagnetic.industry.software.manage.config;
|
package com.electromagnetic.industry.software.manage.config;
|
||||||
|
|
||||||
|
import cn.hutool.core.io.FileUtil;
|
||||||
import com.electromagnetic.industry.software.common.enums.DataOwnEnum;
|
import com.electromagnetic.industry.software.common.enums.DataOwnEnum;
|
||||||
import com.electromagnetic.industry.software.common.util.EleCommonUtil;
|
import com.electromagnetic.industry.software.common.util.EleCommonUtil;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
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 java.io.File;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
|
|
@ -78,6 +80,16 @@ public class ElePropertyConfig {
|
||||||
@Value("${allow.upload.file.types}")
|
@Value("${allow.upload.file.types}")
|
||||||
private String allowUploadFileTypes;
|
private String allowUploadFileTypes;
|
||||||
|
|
||||||
|
@Value("${ai.file.upload.store.dir}")
|
||||||
|
private String aiFileUploadStoreDir;
|
||||||
|
|
||||||
|
public String getAiFileUploadStoreDir() {
|
||||||
|
if (EleCommonUtil.isWinOs()) {
|
||||||
|
return FileUtil.normalize(winPrefix + File.separator + aiFileUploadStoreDir);
|
||||||
|
}
|
||||||
|
return FileUtil.normalize(aiFileUploadStoreDir);
|
||||||
|
}
|
||||||
|
|
||||||
public List<String> getAiAllowUploadFileTypes() {
|
public List<String> getAiAllowUploadFileTypes() {
|
||||||
return List.of(allowUploadFileTypes.replace(" ", "").split(","));
|
return List.of(allowUploadFileTypes.replace(" ", "").split(","));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -39,12 +39,10 @@ import org.springframework.web.multipart.MultipartFile;
|
||||||
import reactor.core.publisher.Flux;
|
import reactor.core.publisher.Flux;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.nio.charset.Charset;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Service
|
@Service
|
||||||
|
|
@ -145,10 +143,20 @@ public class ChatService {
|
||||||
return ElectromagneticResultUtil.fail("-1", StrFormatter.format("当前格式 {} 不支持", fileType));
|
return ElectromagneticResultUtil.fail("-1", StrFormatter.format("当前格式 {} 不支持", fileType));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
documents = new TokenTextSplitter().apply(documents);
|
List<Document> newDocuments = new ArrayList<>();
|
||||||
documents = documents.subList(0, Math.min(elePropertyConfig.getAiMaxDocs(), documents.size()));
|
StringBuilder stringBuilder = new StringBuilder();
|
||||||
vectorStore.write(documents);
|
|
||||||
for (Document document : documents) {
|
for (Document document : documents) {
|
||||||
|
Map<String, Object> metadata = new HashMap<>();
|
||||||
|
metadata.put("fileName", file.getOriginalFilename());
|
||||||
|
metadata.put("fileMd5", fileMd5);
|
||||||
|
newDocuments.add(new Document(Objects.requireNonNull(document.getText()), metadata));
|
||||||
|
stringBuilder.append(document.getText());
|
||||||
|
}
|
||||||
|
FileUtil.writeString(stringBuilder.toString(), elePropertyConfig.getAiFileUploadStoreDir() + File.separator + fileMd5, Charset.defaultCharset());
|
||||||
|
newDocuments = new TokenTextSplitter().apply(newDocuments);
|
||||||
|
newDocuments = newDocuments.subList(0, Math.min(elePropertyConfig.getAiMaxDocs(), newDocuments.size()));
|
||||||
|
vectorStore.write(newDocuments);
|
||||||
|
for (Document document : newDocuments) {
|
||||||
aiFileUploadRecordMapper.insert(new AiFileUploadRecord()
|
aiFileUploadRecordMapper.insert(new AiFileUploadRecord()
|
||||||
.setId(IdWorker.getSnowFlakeIdString())
|
.setId(IdWorker.getSnowFlakeIdString())
|
||||||
.setVectorId(document.getId())
|
.setVectorId(document.getId())
|
||||||
|
|
@ -169,7 +177,17 @@ public class ChatService {
|
||||||
aiQuestionRecordMapper.insert(record);
|
aiQuestionRecordMapper.insert(record);
|
||||||
UserThreadLocal.remove();
|
UserThreadLocal.remove();
|
||||||
List<Document> documents = vectorStore.similaritySearch(queryDTO.getMsg());
|
List<Document> documents = vectorStore.similaritySearch(queryDTO.getMsg());
|
||||||
String augmentedPrompt = "基于以下信息回答:" + documents + "\n\n" + queryDTO.getMsg();
|
Set<String> files = new LinkedHashSet<>();
|
||||||
|
assert documents != null;
|
||||||
|
for (Document document : documents) {
|
||||||
|
files.add(document.getMetadata().get("fileMd5").toString());
|
||||||
|
}
|
||||||
|
List<Document> newDocuments = new ArrayList<>();
|
||||||
|
for (String fileMd5 : files) {
|
||||||
|
String s = FileUtil.readString(elePropertyConfig.getAiFileUploadStoreDir() + File.separator + fileMd5, Charset.defaultCharset());
|
||||||
|
newDocuments.add(new Document(s));
|
||||||
|
}
|
||||||
|
String augmentedPrompt = "基于以下信息回答:" + newDocuments + "\n\n" + queryDTO.getMsg();
|
||||||
return ChatClient.builder(model)
|
return ChatClient.builder(model)
|
||||||
.defaultSystem("必须用中文回答")
|
.defaultSystem("必须用中文回答")
|
||||||
.defaultAdvisors(messageChatMemoryAdvisor)
|
.defaultAdvisors(messageChatMemoryAdvisor)
|
||||||
|
|
@ -191,7 +209,19 @@ public class ChatService {
|
||||||
aiQuestionRecordMapper.insert(record);
|
aiQuestionRecordMapper.insert(record);
|
||||||
UserThreadLocal.remove();
|
UserThreadLocal.remove();
|
||||||
List<Document> documents = vectorStore.similaritySearch(queryDTO.getMsg());
|
List<Document> documents = vectorStore.similaritySearch(queryDTO.getMsg());
|
||||||
String augmentedPrompt = "基于以下信息回答:" + documents + "\n\n" + queryDTO.getMsg();
|
|
||||||
|
Set<String> files = new LinkedHashSet<>();
|
||||||
|
assert documents != null;
|
||||||
|
for (Document document : documents) {
|
||||||
|
files.add(document.getMetadata().get("fileMd5").toString());
|
||||||
|
}
|
||||||
|
List<Document> newDocuments = new ArrayList<>();
|
||||||
|
for (String fileMd5 : files) {
|
||||||
|
String s = FileUtil.readString(elePropertyConfig.getAiFileUploadStoreDir() + File.separator + fileMd5, Charset.defaultCharset());
|
||||||
|
newDocuments.add(new Document(s));
|
||||||
|
}
|
||||||
|
|
||||||
|
String augmentedPrompt = "基于以下信息回答:" + newDocuments + "\n\n" + queryDTO.getMsg();
|
||||||
return ChatClient.builder(model)
|
return ChatClient.builder(model)
|
||||||
.defaultSystem("必须用中文回答")
|
.defaultSystem("必须用中文回答")
|
||||||
.defaultAdvisors(messageChatMemoryAdvisor)
|
.defaultAdvisors(messageChatMemoryAdvisor)
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ spring.ai.vectorstore.mariadb.distance-type=COSINE
|
||||||
spring.ai.vectorstore.mariadb.dimensions=1536
|
spring.ai.vectorstore.mariadb.dimensions=1536
|
||||||
spring.ai.vectorstore.mariadb.table-name=rag
|
spring.ai.vectorstore.mariadb.table-name=rag
|
||||||
allow.upload.file.types=doc, docx, txt, csv, xls, xlsx, pdf, ppt, pptx
|
allow.upload.file.types=doc, docx, txt, csv, xls, xlsx, pdf, ppt, pptx
|
||||||
|
ai.file.upload.store.dir=/szsd/data/ele/aifile/
|
||||||
# mybatis
|
# mybatis
|
||||||
mybatis-plus.mapper-locations=classpath:sqlmapper/*.xml
|
mybatis-plus.mapper-locations=classpath:sqlmapper/*.xml
|
||||||
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
|
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,10 @@ package com.electromagnetic.industry.software.common.util;
|
||||||
import cn.hutool.core.codec.Base64;
|
import cn.hutool.core.codec.Base64;
|
||||||
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
||||||
|
|
||||||
import javax.crypto.*;
|
import javax.crypto.BadPaddingException;
|
||||||
|
import javax.crypto.Cipher;
|
||||||
|
import javax.crypto.IllegalBlockSizeException;
|
||||||
|
import javax.crypto.NoSuchPaddingException;
|
||||||
import javax.crypto.spec.SecretKeySpec;
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
import java.security.InvalidKeyException;
|
import java.security.InvalidKeyException;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue