Commit d46339dc authored by alex yao's avatar alex yao

feat(LongTextDialogues):新增核心观点、总结摘要提取接口

parent bc9cf150
...@@ -89,4 +89,18 @@ public class BizFileUploadRecordModel extends BaseModelClass implements Serializ ...@@ -89,4 +89,18 @@ public class BizFileUploadRecordModel extends BaseModelClass implements Serializ
super.addValidField("coverSheetUrl"); super.addValidField("coverSheetUrl");
} }
/**
* md5
*/
private String md5;
@Column(name = "md5", length = 128)
public String getMd5() {
return this.md5;
}
public void setMd5(String md5) {
this.md5 = md5;
super.addValidField("md5");
}
} }
\ No newline at end of file
...@@ -5,11 +5,15 @@ import cn.com.poc.common.rest.BosRest; ...@@ -5,11 +5,15 @@ import cn.com.poc.common.rest.BosRest;
import cn.com.poc.common.service.BizFileUploadRecordService; import cn.com.poc.common.service.BizFileUploadRecordService;
import cn.com.poc.common.service.BosConfigService; import cn.com.poc.common.service.BosConfigService;
import cn.com.poc.common.utils.Assert; import cn.com.poc.common.utils.Assert;
import cn.com.poc.common.utils.MD5Util;
import cn.com.poc.common.utils.MD5Utils;
import cn.hutool.crypto.digest.MD5;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
@Component @Component
public class BosRestImpl implements BosRest { public class BosRestImpl implements BosRest {
...@@ -29,9 +33,16 @@ public class BosRestImpl implements BosRest { ...@@ -29,9 +33,16 @@ public class BosRestImpl implements BosRest {
String upload = bosConfigService.upload(file.getInputStream(), prefix, contentType); String upload = bosConfigService.upload(file.getInputStream(), prefix, contentType);
//计算文件MD5值
InputStream inputStream = file.getInputStream();
byte[] bytes = new byte[inputStream.available()];
inputStream.read(bytes);
String md5 = MD5.create().digestHex(bytes);
BizFileUploadRecordModel bizFileUploadRecordModel = new BizFileUploadRecordModel(); BizFileUploadRecordModel bizFileUploadRecordModel = new BizFileUploadRecordModel();
bizFileUploadRecordModel.setFileName(file.getOriginalFilename()); bizFileUploadRecordModel.setFileName(file.getOriginalFilename());
bizFileUploadRecordModel.setFileUrl(upload); bizFileUploadRecordModel.setFileUrl(upload);
bizFileUploadRecordModel.setMd5(md5);
bizFileUploadRecordModel.setCoverSheetUrl(""); bizFileUploadRecordModel.setCoverSheetUrl("");
bizFileUploadRecordService.save(bizFileUploadRecordModel); bizFileUploadRecordService.save(bizFileUploadRecordModel);
return upload; return upload;
......
...@@ -3,8 +3,11 @@ package cn.com.poc.common.utils; ...@@ -3,8 +3,11 @@ package cn.com.poc.common.utils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Utils { public class MD5Utils {
/*** 编码 */ /*** 编码 */
public static byte[] getContentBytes(String content, String charset) { public static byte[] getContentBytes(String content, String charset) {
if (charset == null || "".equals(charset)) { if (charset == null || "".equals(charset)) {
......
...@@ -3,6 +3,7 @@ package cn.com.poc.long_document.aggregate; ...@@ -3,6 +3,7 @@ package cn.com.poc.long_document.aggregate;
import cn.com.poc.long_document.dto.DialoguesContextDto; import cn.com.poc.long_document.dto.DialoguesContextDto;
import cn.com.poc.long_document.dto.LongTextDialoguesDto; import cn.com.poc.long_document.dto.LongTextDialoguesDto;
import cn.com.poc.long_document.dto.LongTextExampleDto; import cn.com.poc.long_document.dto.LongTextExampleDto;
import cn.com.poc.long_document.dto.LongTextSummaryDto;
import java.util.List; import java.util.List;
...@@ -16,6 +17,8 @@ public interface LongTextDialoguesService { ...@@ -16,6 +17,8 @@ public interface LongTextDialoguesService {
void call(String dialoguesId, String fileUrl, String input, Integer[] knowledgeIds, Long userId) throws Exception; void call(String dialoguesId, String fileUrl, String input, Integer[] knowledgeIds, Long userId) throws Exception;
LongTextSummaryDto summary(String dialoguesId, Long userId) throws Exception;
void delete(String dialoguesId, Long userId) throws Exception; void delete(String dialoguesId, Long userId) throws Exception;
LongTextDialoguesDto dialoguesDetail(String dialoguesId, Long userId) throws Exception; LongTextDialoguesDto dialoguesDetail(String dialoguesId, Long userId) throws Exception;
......
...@@ -6,25 +6,29 @@ import cn.com.poc.agent_application.service.BizAgentApplicationGcConfigService; ...@@ -6,25 +6,29 @@ import cn.com.poc.agent_application.service.BizAgentApplicationGcConfigService;
import cn.com.poc.common.constant.CommonConstant; import cn.com.poc.common.constant.CommonConstant;
import cn.com.poc.common.model.BizFileUploadRecordModel; import cn.com.poc.common.model.BizFileUploadRecordModel;
import cn.com.poc.common.service.BizFileUploadRecordService; import cn.com.poc.common.service.BizFileUploadRecordService;
import cn.com.poc.common.utils.*; import cn.com.poc.common.utils.DocumentLoad;
import cn.com.poc.common.utils.JsonUtils;
import cn.com.poc.common.utils.SSEUtil;
import cn.com.poc.common.utils.UUIDTool;
import cn.com.poc.knowledge.aggregate.KnowledgeService; import cn.com.poc.knowledge.aggregate.KnowledgeService;
import cn.com.poc.knowledge.constant.KnowledgeConstant; import cn.com.poc.knowledge.constant.KnowledgeConstant;
import cn.com.poc.knowledge.entity.BizKnowledgeDocumentEntity; import cn.com.poc.knowledge.entity.BizKnowledgeDocumentEntity;
import cn.com.poc.knowledge.query.KnowledgeDocumentRelationQueryItem; import cn.com.poc.knowledge.query.KnowledgeDocumentRelationQueryItem;
import cn.com.poc.knowledge.service.BizKnowledgeDocumentService; import cn.com.poc.knowledge.service.BizKnowledgeDocumentService;
import cn.com.poc.knowledge.service.BizKnowledgeInfoService;
import cn.com.poc.long_document.aggregate.LongTextDialoguesService; import cn.com.poc.long_document.aggregate.LongTextDialoguesService;
import cn.com.poc.long_document.domain.LongtextDialoguesResult; import cn.com.poc.long_document.domain.LongtextDialoguesResult;
import cn.com.poc.long_document.dto.DialoguesContextDto; import cn.com.poc.long_document.dto.DialoguesContextDto;
import cn.com.poc.long_document.dto.LongTextDialoguesDto; import cn.com.poc.long_document.dto.LongTextDialoguesDto;
import cn.com.poc.long_document.dto.LongTextExampleDto; import cn.com.poc.long_document.dto.LongTextExampleDto;
import cn.com.poc.long_document.dto.LongTextSummaryDto;
import cn.com.poc.long_document.entity.BizLongTextSummaryCacheEntity;
import cn.com.poc.long_document.model.BizLongTextDialoguesModel; import cn.com.poc.long_document.model.BizLongTextDialoguesModel;
import cn.com.poc.long_document.model.BizLongTextDialoguesRecordModel; import cn.com.poc.long_document.model.BizLongTextDialoguesRecordModel;
import cn.com.poc.long_document.model.BizLongTextExampleModel; import cn.com.poc.long_document.model.BizLongTextExampleModel;
import cn.com.poc.long_document.service.BizLongTextDialoguesRecordService; import cn.com.poc.long_document.service.BizLongTextDialoguesRecordService;
import cn.com.poc.long_document.service.BizLongTextDialoguesService; import cn.com.poc.long_document.service.BizLongTextDialoguesService;
import cn.com.poc.long_document.service.BizLongTextExampleService; import cn.com.poc.long_document.service.BizLongTextExampleService;
import cn.com.poc.support.security.oauth.entity.UserBaseEntity; import cn.com.poc.long_document.service.BizLongTextSummaryCacheService;
import cn.com.poc.thirdparty.resource.demand.ai.aggregate.DemandKnowledgeService; import cn.com.poc.thirdparty.resource.demand.ai.aggregate.DemandKnowledgeService;
import cn.com.poc.thirdparty.resource.demand.ai.constants.KnowledgeSearchTypeEnum; import cn.com.poc.thirdparty.resource.demand.ai.constants.KnowledgeSearchTypeEnum;
import cn.com.poc.thirdparty.resource.demand.ai.constants.LLMRoleEnum; import cn.com.poc.thirdparty.resource.demand.ai.constants.LLMRoleEnum;
...@@ -34,8 +38,11 @@ import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelDema ...@@ -34,8 +38,11 @@ import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelDema
import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelResponse; import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelResponse;
import cn.com.poc.thirdparty.service.LLMService; import cn.com.poc.thirdparty.service.LLMService;
import cn.com.yict.framemax.core.exception.BusinessException; import cn.com.yict.framemax.core.exception.BusinessException;
import cn.com.yict.framemax.core.i18n.I18nMessageException;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.crypto.digest.MD5;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -48,6 +55,7 @@ import java.io.IOException; ...@@ -48,6 +55,7 @@ import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -87,6 +95,9 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService { ...@@ -87,6 +95,9 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService {
private DemandKnowledgeService demandKnowledgeService; private DemandKnowledgeService demandKnowledgeService;
@Resource
private BizLongTextSummaryCacheService bizLongTextSummaryCacheService;
@Override @Override
public String create(String fileUrl, Long userId) throws Exception { public String create(String fileUrl, Long userId) throws Exception {
String dialoguesId = UUIDTool.getUUID(); String dialoguesId = UUIDTool.getUUID();
...@@ -101,14 +112,9 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService { ...@@ -101,14 +112,9 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService {
@Override @Override
public void call(String dialoguesId, String fileUrl, String input, Integer[] knowledgeIds, Long userId) throws Exception { public void call(String dialoguesId, String fileUrl, String input, Integer[] knowledgeIds, Long userId) throws Exception {
UserBaseEntity userBaseEntity = BlContext.getCurrentUserNotException();
if (userBaseEntity == null) {
throw new BusinessException("用户未登录");
}
BizLongTextDialoguesModel model = new BizLongTextDialoguesModel(); BizLongTextDialoguesModel model = new BizLongTextDialoguesModel();
model.setDialogsId(dialoguesId); model.setDialogsId(dialoguesId);
model.setMemberId(userBaseEntity.getUserId()); model.setMemberId(userId);
model.setIsDeleted(CommonConstant.IsDeleted.N); model.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizLongTextDialoguesModel> models = bizLongTextDialoguesService.findByExample(model, null); List<BizLongTextDialoguesModel> models = bizLongTextDialoguesService.findByExample(model, null);
...@@ -125,7 +131,7 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService { ...@@ -125,7 +131,7 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService {
} }
BizLongTextDialoguesRecordModel dialoguesRecordModel = new BizLongTextDialoguesRecordModel(); BizLongTextDialoguesRecordModel dialoguesRecordModel = new BizLongTextDialoguesRecordModel();
dialoguesRecordModel.setDialogsId(dialoguesId); dialoguesRecordModel.setDialogsId(dialoguesId);
dialoguesRecordModel.setMemberId(userBaseEntity.getUserId()); dialoguesRecordModel.setMemberId(userId);
dialoguesRecordModel.setIsDeleted(CommonConstant.IsDeleted.N); dialoguesRecordModel.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizLongTextDialoguesRecordModel> dialoguesRecordModelList = bizLongTextDialoguesRecordService.findByExample(dialoguesRecordModel, null); List<BizLongTextDialoguesRecordModel> dialoguesRecordModelList = bizLongTextDialoguesRecordService.findByExample(dialoguesRecordModel, null);
...@@ -173,7 +179,7 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService { ...@@ -173,7 +179,7 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService {
//组装请求参数 //组装请求参数
List<Message> messages = buildMessages(dialoguesId, userBaseEntity.getUserId(), input, fileUrl, knowledgeResult); List<Message> messages = buildMessages(dialoguesId, userId, input, fileUrl, knowledgeResult);
LargeModelResponse largeModelResponse = new LargeModelResponse(); LargeModelResponse largeModelResponse = new LargeModelResponse();
largeModelResponse.setModel("qwen-long"); largeModelResponse.setModel("qwen-long");
largeModelResponse.setMessages(messages.toArray(new Message[0])); largeModelResponse.setMessages(messages.toArray(new Message[0]));
...@@ -184,7 +190,7 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService { ...@@ -184,7 +190,7 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService {
// 保存用户输入记录 // 保存用户输入记录
BizLongTextDialoguesRecordModel inputRecord = new BizLongTextDialoguesRecordModel(); BizLongTextDialoguesRecordModel inputRecord = new BizLongTextDialoguesRecordModel();
inputRecord.setMemberId(userBaseEntity.getUserId()); inputRecord.setMemberId(userId);
inputRecord.setContent(input); inputRecord.setContent(input);
if (isFileUrlChanged) { if (isFileUrlChanged) {
inputRecord.setFileUrl(fileUrl); inputRecord.setFileUrl(fileUrl);
...@@ -195,7 +201,7 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService { ...@@ -195,7 +201,7 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService {
// 保存AI回复记录 // 保存AI回复记录
BizLongTextDialoguesRecordModel assistantRecord = new BizLongTextDialoguesRecordModel(); BizLongTextDialoguesRecordModel assistantRecord = new BizLongTextDialoguesRecordModel();
assistantRecord.setMemberId(userBaseEntity.getUserId()); assistantRecord.setMemberId(userId);
assistantRecord.setContent(longtextDialoguesResult.getMessage()); assistantRecord.setContent(longtextDialoguesResult.getMessage());
assistantRecord.setReasoningContent(longtextDialoguesResult.getReasoningContent()); assistantRecord.setReasoningContent(longtextDialoguesResult.getReasoningContent());
assistantRecord.setDialogsId(dialoguesId); assistantRecord.setDialogsId(dialoguesId);
...@@ -207,6 +213,71 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService { ...@@ -207,6 +213,71 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService {
bizLongTextDialoguesRecordService.saveAll(recordModels); bizLongTextDialoguesRecordService.saveAll(recordModels);
} }
@Override
public LongTextSummaryDto summary(String dialoguesId, Long userId) throws Exception {
BizLongTextDialoguesModel longTextDialoguesModel = new BizLongTextDialoguesModel();
longTextDialoguesModel.setDialogsId(dialoguesId);
longTextDialoguesModel.setMemberId(userId);
longTextDialoguesModel.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizLongTextDialoguesModel> models = bizLongTextDialoguesService.findByExample(longTextDialoguesModel, null);
if (CollectionUtils.isEmpty(models)) {
throw new BusinessException("对话不存在");
}
BizLongTextDialoguesModel bizLongTextDialoguesModel = models.get(0);
String fileUrl = bizLongTextDialoguesModel.getFileUrl();
if (StringUtils.isBlank(fileUrl)) {
throw new BusinessException("对话文件不存在,重新创建对话");
}
String summary;
String corePoint;
File file = DocumentLoad.downloadURLDocument(fileUrl);
String fileMD5 = MD5.create().digestHex(file);
// 缓存中查询摘要和核心观点
BizLongTextSummaryCacheEntity bizLongTextSummaryCacheEntity = new BizLongTextSummaryCacheEntity();
bizLongTextSummaryCacheEntity.setFileMd5(fileMD5);
bizLongTextSummaryCacheEntity.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizLongTextSummaryCacheEntity> bizLongTextSummaryCacheEntities = bizLongTextSummaryCacheService.findByExample(bizLongTextSummaryCacheEntity, null);
if (CollectionUtils.isNotEmpty(bizLongTextSummaryCacheEntities)) {
BizLongTextSummaryCacheEntity longTextSummaryCacheEntity = bizLongTextSummaryCacheEntities.get(0);
summary = longTextSummaryCacheEntity.getSummary();
corePoint = longTextSummaryCacheEntity.getCorePoint();
} else {
String document = DocumentLoad.documentToText(file);
CompletableFuture<String> summaryFuture = CompletableFuture.supplyAsync(() -> createSummary(document)).exceptionally(throwable -> {
logger.error("生成摘要失败", throwable);
throw new BusinessException(throwable);
});
CompletableFuture<String> corePointFuture = CompletableFuture.supplyAsync(() -> createCorePoint(document)).exceptionally(throwable -> {
logger.error("生成核心观点失败", throwable);
throw new BusinessException(throwable);
});
CompletableFuture<Void> allOf = CompletableFuture.allOf(summaryFuture, corePointFuture);
allOf.join();
summary = summaryFuture.get();
corePoint = corePointFuture.get();
// 保存缓存
BizLongTextSummaryCacheEntity saveCache = new BizLongTextSummaryCacheEntity();
saveCache.setCorePoint(corePoint);
saveCache.setSummary(summary);
saveCache.setFileUrl(fileUrl);
saveCache.setFileMd5(fileMD5);
saveCache.setIsDeleted(CommonConstant.IsDeleted.N);
bizLongTextSummaryCacheService.save(saveCache);
}
// 返回摘要和核心观点
LongTextSummaryDto longTextSummaryDto = new LongTextSummaryDto();
longTextSummaryDto.setSummary(summary);
longTextSummaryDto.setCorePoint(corePoint);
return longTextSummaryDto;
}
@Override @Override
public void delete(String dialoguesId, Long userId) throws Exception { public void delete(String dialoguesId, Long userId) throws Exception {
BizLongTextDialoguesModel model = new BizLongTextDialoguesModel(); BizLongTextDialoguesModel model = new BizLongTextDialoguesModel();
...@@ -512,4 +583,126 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService { ...@@ -512,4 +583,126 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService {
return knowledgeContentResults; return knowledgeContentResults;
} }
private String createSummary(String document) {
// 获取对话提示词
String promptCode = "CreateSummaryPrompt";
BizAgentApplicationGcConfigEntity documentDialoguePrompt = bizAgentApplicationGcConfigService.getByConfigCode(promptCode);
if (documentDialoguePrompt == null || StringUtils.isBlank(documentDialoguePrompt.getConfigSystem())) {
logger.error("获取对话提示词失败 , configCode:{}", promptCode);
throw new BusinessException("获取对话提示词失败");
}
String prompt = documentDialoguePrompt.getConfigSystem();
String largeModel = documentDialoguePrompt.getLargeModel();
// 配置message
List<Message> messages = new ArrayList<>();
Message systemMessage = new Message();
systemMessage.setContent(prompt);
systemMessage.setRole(LLMRoleEnum.SYSTEM.getRole());
messages.add(systemMessage);
// 文件内容
Message fileSystemMessage = new Message();
fileSystemMessage.setContent(document);
fileSystemMessage.setRole(LLMRoleEnum.SYSTEM.getRole());
messages.add(fileSystemMessage);
Message questionMessage = new Message();
questionMessage.setContent("获取总结摘要");
questionMessage.setRole(LLMRoleEnum.USER.getRole());
messages.add(questionMessage);
// 调用LLM
LargeModelResponse response = new LargeModelResponse();
response.setModel(largeModel);
response.setMessages(messages.toArray(new Message[0]));
response.setStream(true);
response.setUser("CreateSummary");
try {
StringBuilder summary = new StringBuilder();
BufferedReader bufferedReader = llmService.chatChunk(response);
String res;
while ((res = bufferedReader.readLine()) != null) {
if (StringUtils.isEmpty(res)) {
continue;
}
res = res.replace("data: ", StringUtils.EMPTY);
LargeModelDemandResult result = JsonUtils.deSerialize(res, LargeModelDemandResult.class);
if (ObjectUtil.isEmpty(result) || !result.getCode().equals("0")) {
logger.error("LLM Error,code:{}", result.getCode());
throw new BusinessException("获取总结摘要失败");
}
String message = result.getMessage();
summary.append(message);
}
bufferedReader.close();
return summary.toString();
} catch (Exception e) {
logger.error("获取总结摘要失败", e);
throw new BusinessException("获取总结摘要失败");
}
}
private String createCorePoint(String document) {
// 获取对话提示词
String promptCode = "CreateCorePointPrompt";
BizAgentApplicationGcConfigEntity documentDialoguePrompt = bizAgentApplicationGcConfigService.getByConfigCode(promptCode);
if (documentDialoguePrompt == null || StringUtils.isBlank(documentDialoguePrompt.getConfigSystem())) {
logger.error("获取对话提示词失败 , configCode:{}", promptCode);
throw new BusinessException("获取对话提示词失败");
}
String prompt = documentDialoguePrompt.getConfigSystem();
String largeModel = documentDialoguePrompt.getLargeModel();
// 配置message
List<Message> messages = new ArrayList<>();
Message systemMessage = new Message();
systemMessage.setContent(prompt);
systemMessage.setRole(LLMRoleEnum.SYSTEM.getRole());
messages.add(systemMessage);
// 文件内容
Message fileSystemMessage = new Message();
fileSystemMessage.setContent(document);
fileSystemMessage.setRole(LLMRoleEnum.SYSTEM.getRole());
messages.add(fileSystemMessage);
Message questionMessage = new Message();
questionMessage.setContent("提取核心观点");
questionMessage.setRole(LLMRoleEnum.USER.getRole());
messages.add(questionMessage);
// 调用LLM
LargeModelResponse response = new LargeModelResponse();
response.setModel(largeModel);
response.setMessages(messages.toArray(new Message[0]));
response.setStream(false);
response.setUser("CreateCorePoint");
try {
StringBuilder corePoint = new StringBuilder();
BufferedReader bufferedReader = llmService.chatChunk(response);
String res;
while ((res = bufferedReader.readLine()) != null) {
if (StringUtils.isEmpty(res)) {
continue;
}
res = res.replace("data: ", StringUtils.EMPTY);
LargeModelDemandResult result = JsonUtils.deSerialize(res, LargeModelDemandResult.class);
if (ObjectUtil.isEmpty(result) || !result.getCode().equals("0")) {
logger.error("LLM Error,code:{}", result.getCode());
throw new BusinessException("获取核心观点失败");
}
String message = result.getMessage();
corePoint.append(message);
}
bufferedReader.close();
return corePoint.toString();
} catch (Exception e) {
logger.error("获取核心观点失败", e);
throw new BusinessException("获取核心观点失败");
}
}
} }
package cn.com.poc.long_document.convert;
import cn.com.poc.long_document.entity.BizLongTextSummaryCacheEntity;
import cn.com.poc.long_document.model.BizLongTextSummaryCacheModel;
public class BizLongTextSummaryCacheConvert {
public static BizLongTextSummaryCacheEntity modelToEntity(BizLongTextSummaryCacheModel model) {
BizLongTextSummaryCacheEntity entity = new BizLongTextSummaryCacheEntity();
entity.setId(model.getId());
entity.setCorePoint(model.getCorePoint());
entity.setSummary(model.getSummary());
entity.setFileUrl(model.getFileUrl());
entity.setFileMd5(model.getFileMd5());
entity.setIsDeleted(model.getIsDeleted());
entity.setCreator(model.getCreator());
entity.setCreatedTime(model.getCreatedTime());
entity.setModifier(model.getModifier());
entity.setModifiedTime(model.getModifiedTime());
entity.setSysVersion(model.getSysVersion());
return entity;
}
public static BizLongTextSummaryCacheModel entityToModel(BizLongTextSummaryCacheEntity entity) {
BizLongTextSummaryCacheModel model = new BizLongTextSummaryCacheModel();
model.setId(entity.getId());
model.setCorePoint(entity.getCorePoint());
model.setSummary(entity.getSummary());
model.setFileUrl(entity.getFileUrl());
model.setFileMd5(entity.getFileMd5());
model.setIsDeleted(entity.getIsDeleted());
model.setCreator(entity.getCreator());
model.setCreatedTime(entity.getCreatedTime());
model.setModifier(entity.getModifier());
model.setModifiedTime(entity.getModifiedTime());
model.setSysVersion(entity.getSysVersion());
return model;
}
}
\ No newline at end of file
package cn.com.poc.long_document.dto;
/**
* @author alex.yao
* @date 2025/6/18
*/
public class LongTextSummaryDto {
private String summary;
private String corePoint;
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
public String getCorePoint() {
return corePoint;
}
public void setCorePoint(String corePoint) {
this.corePoint = corePoint;
}
}
package cn.com.poc.long_document.entity;
public class BizLongTextSummaryCacheEntity {
private static final long serialVersionUID = 1L;
/** id
*
*/
private java.lang.Long id;
public java.lang.Long getId(){
return this.id;
}
public void setId(java.lang.Long id){
this.id = id;
}
/** core_point
*核心观点
*/
private java.lang.String corePoint;
public java.lang.String getCorePoint(){
return this.corePoint;
}
public void setCorePoint(java.lang.String corePoint){
this.corePoint = corePoint;
}
/** summary
*总结摘要
*/
private java.lang.String summary;
public java.lang.String getSummary(){
return this.summary;
}
public void setSummary(java.lang.String summary){
this.summary = summary;
}
/** file_url
*文件地址
*/
private java.lang.String fileUrl;
public java.lang.String getFileUrl(){
return this.fileUrl;
}
public void setFileUrl(java.lang.String fileUrl){
this.fileUrl = fileUrl;
}
/** file_md5
*文件MD5
*/
private java.lang.String fileMd5;
public java.lang.String getFileMd5(){
return this.fileMd5;
}
public void setFileMd5(java.lang.String fileMd5){
this.fileMd5 = fileMd5;
}
/** is_deleted
*是否删除 1、Y 是 2、N 否
*/
private java.lang.String isDeleted;
public java.lang.String getIsDeleted(){
return this.isDeleted;
}
public void setIsDeleted(java.lang.String isDeleted){
this.isDeleted = isDeleted;
}
/** CREATOR
*创建人
*/
private java.lang.String creator;
public java.lang.String getCreator(){
return this.creator;
}
public void setCreator(java.lang.String creator){
this.creator = creator;
}
/** CREATED_TIME
*创建时间
*/
private java.util.Date createdTime;
public java.util.Date getCreatedTime(){
return this.createdTime;
}
public void setCreatedTime(java.util.Date createdTime){
this.createdTime = createdTime;
}
/** MODIFIER
*修改人
*/
private java.lang.String modifier;
public java.lang.String getModifier(){
return this.modifier;
}
public void setModifier(java.lang.String modifier){
this.modifier = modifier;
}
/** MODIFIED_TIME
*修改时间
*/
private java.util.Date modifiedTime;
public java.util.Date getModifiedTime(){
return this.modifiedTime;
}
public void setModifiedTime(java.util.Date modifiedTime){
this.modifiedTime = modifiedTime;
}
/** SYS_VERSION
*乐观锁,版本号
*/
private java.lang.Integer sysVersion;
public java.lang.Integer getSysVersion(){
return this.sysVersion;
}
public void setSysVersion(java.lang.Integer sysVersion){
this.sysVersion = sysVersion;
}
}
\ No newline at end of file
package cn.com.poc.long_document.model;
import java.io.Serializable;
import cn.com.yict.framemax.data.model.BaseModelClass;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.Version;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
/**
* Model class for biz_long_text_summary_cache
* 文档核心观点提取、总结摘要缓存表
*/
@Entity
@Table(name = "biz_long_text_summary_cache")
@DynamicInsert
@DynamicUpdate
public class BizLongTextSummaryCacheModel extends BaseModelClass implements Serializable {
private static final long serialVersionUID = 1L;
/** id
*
*/
private java.lang.Long id;
@Column(name = "id",length = 19)
@Id @GeneratedValue(strategy = GenerationType.AUTO)
public java.lang.Long getId(){
return this.id;
}
public void setId(java.lang.Long id){
this.id = id;
super.addValidField("id");
}
/** core_point
*核心观点
*/
private java.lang.String corePoint;
@Column(name = "core_point",length = 2147483647)
public java.lang.String getCorePoint(){
return this.corePoint;
}
public void setCorePoint(java.lang.String corePoint){
this.corePoint = corePoint;
super.addValidField("corePoint");
}
/** summary
*总结摘要
*/
private java.lang.String summary;
@Column(name = "summary",length = 2147483647)
public java.lang.String getSummary(){
return this.summary;
}
public void setSummary(java.lang.String summary){
this.summary = summary;
super.addValidField("summary");
}
/** file_url
*文件地址
*/
private java.lang.String fileUrl;
@Column(name = "file_url",length = 200)
public java.lang.String getFileUrl(){
return this.fileUrl;
}
public void setFileUrl(java.lang.String fileUrl){
this.fileUrl = fileUrl;
super.addValidField("fileUrl");
}
/** file_md5
*文件MD5
*/
private java.lang.String fileMd5;
@Column(name = "file_md5",length = 128)
public java.lang.String getFileMd5(){
return this.fileMd5;
}
public void setFileMd5(java.lang.String fileMd5){
this.fileMd5 = fileMd5;
super.addValidField("fileMd5");
}
/** is_deleted
*是否删除 1、Y 是 2、N 否
*/
private java.lang.String isDeleted;
@Column(name = "is_deleted",length = 1)
public java.lang.String getIsDeleted(){
return this.isDeleted;
}
public void setIsDeleted(java.lang.String isDeleted){
this.isDeleted = isDeleted;
super.addValidField("isDeleted");
}
/** CREATOR
*创建人
*/
private java.lang.String creator;
@Column(name = "CREATOR",length = 225)
public java.lang.String getCreator(){
return this.creator;
}
public void setCreator(java.lang.String creator){
this.creator = creator;
super.addValidField("creator");
}
/** CREATED_TIME
*创建时间
*/
private java.util.Date createdTime;
@Column(name = "CREATED_TIME",length = 19)
public java.util.Date getCreatedTime(){
return this.createdTime;
}
public void setCreatedTime(java.util.Date createdTime){
this.createdTime = createdTime;
super.addValidField("createdTime");
}
/** MODIFIER
*修改人
*/
private java.lang.String modifier;
@Column(name = "MODIFIER",length = 225)
public java.lang.String getModifier(){
return this.modifier;
}
public void setModifier(java.lang.String modifier){
this.modifier = modifier;
super.addValidField("modifier");
}
/** MODIFIED_TIME
*修改时间
*/
private java.util.Date modifiedTime;
@Column(name = "MODIFIED_TIME",length = 19)
public java.util.Date getModifiedTime(){
return this.modifiedTime;
}
public void setModifiedTime(java.util.Date modifiedTime){
this.modifiedTime = modifiedTime;
super.addValidField("modifiedTime");
}
/** SYS_VERSION
*乐观锁,版本号
*/
private java.lang.Integer sysVersion;
@Column(name = "SYS_VERSION",length = 10)
@Version
public java.lang.Integer getSysVersion(){
return this.sysVersion;
}
public void setSysVersion(java.lang.Integer sysVersion){
this.sysVersion = sysVersion;
super.addValidField("sysVersion");
}
}
\ No newline at end of file
package cn.com.poc.long_document.repository;
import cn.com.yict.framemax.data.repository.Repository;
import cn.com.poc.long_document.model.BizLongTextSummaryCacheModel;
public interface BizLongTextSummaryCacheRepository extends Repository<BizLongTextSummaryCacheModel,java.lang.Long> {
}
\ No newline at end of file
...@@ -28,6 +28,11 @@ public interface LongTextDialoguesRest extends BaseRest { ...@@ -28,6 +28,11 @@ public interface LongTextDialoguesRest extends BaseRest {
*/ */
String create(@RequestBody CreateDialoguesDto dto) throws Exception; String create(@RequestBody CreateDialoguesDto dto) throws Exception;
/**
*核心观点提取、总结摘要
*
*/
LongTextSummaryDto summary(@RequestParam String dialoguesId) throws Exception;
/** /**
* 对话调用 * 对话调用
......
...@@ -51,6 +51,16 @@ public class LongTextDialoguesRestImpl implements LongTextDialoguesRest { ...@@ -51,6 +51,16 @@ public class LongTextDialoguesRestImpl implements LongTextDialoguesRest {
userBaseEntity.getUserId()); userBaseEntity.getUserId());
} }
@Override
public LongTextSummaryDto summary(String dialoguesId) throws Exception {
UserBaseEntity userBaseEntity = BlContext.getCurrentUserNotException();
if (userBaseEntity == null) {
throw new BusinessException("用户未登录");
}
return longTextDialoguesService.summary(dialoguesId, userBaseEntity.getUserId());
}
@Override @Override
public void delete(String dialoguesId) throws Exception { public void delete(String dialoguesId) throws Exception {
Assert.notBlank(dialoguesId, "对话ID不能为空"); Assert.notBlank(dialoguesId, "对话ID不能为空");
......
package cn.com.poc.long_document.service;
import cn.com.yict.framemax.core.service.BaseService;
import cn.com.poc.long_document.entity.BizLongTextSummaryCacheEntity;
import cn.com.yict.framemax.data.model.PagingInfo;
import java.util.Collection;
import java.util.List;
public interface BizLongTextSummaryCacheService extends BaseService {
BizLongTextSummaryCacheEntity get(java.lang.Long id) throws Exception;
List<BizLongTextSummaryCacheEntity> findByExample(BizLongTextSummaryCacheEntity example,PagingInfo pagingInfo) throws Exception;
BizLongTextSummaryCacheEntity save(BizLongTextSummaryCacheEntity entity) throws Exception;
BizLongTextSummaryCacheEntity update(BizLongTextSummaryCacheEntity entity) throws Exception;
void deletedById(java.lang.Long id) throws Exception;
}
\ No newline at end of file
package cn.com.poc.long_document.service.impl;
import cn.com.yict.framemax.core.service.impl.BaseServiceImpl;
import cn.com.poc.long_document.service.BizLongTextSummaryCacheService;
import cn.com.poc.long_document.model.BizLongTextSummaryCacheModel;
import cn.com.poc.long_document.entity.BizLongTextSummaryCacheEntity;
import cn.com.poc.long_document.convert.BizLongTextSummaryCacheConvert;
import cn.com.poc.long_document.repository.BizLongTextSummaryCacheRepository;
import cn.com.yict.framemax.data.model.PagingInfo;
import org.springframework.stereotype.Service;
import org.apache.commons.collections4.CollectionUtils;
import java.util.ArrayList;
import java.util.stream.Collectors;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.util.Assert;
@Service
public class BizLongTextSummaryCacheServiceImpl extends BaseServiceImpl
implements BizLongTextSummaryCacheService {
@Resource
private BizLongTextSummaryCacheRepository repository;
public BizLongTextSummaryCacheEntity get(java.lang.Long id) throws Exception{
Assert.notNull(id);
BizLongTextSummaryCacheModel model = this.repository.get(id);
if (model == null){
return null;
}
if ("Y".equals(model.getIsDeleted())){
return null;
}
return BizLongTextSummaryCacheConvert.modelToEntity(model);
}
public List<BizLongTextSummaryCacheEntity> findByExample(BizLongTextSummaryCacheEntity example,PagingInfo pagingInfo) throws Exception{
List<BizLongTextSummaryCacheEntity> result = new ArrayList<BizLongTextSummaryCacheEntity>();
BizLongTextSummaryCacheModel model = new BizLongTextSummaryCacheModel();
if (example != null){
model = BizLongTextSummaryCacheConvert.entityToModel(example);
}
model.setIsDeleted("N");
List<BizLongTextSummaryCacheModel> models = this.repository.findByExample(model,pagingInfo);
if (CollectionUtils.isNotEmpty(models)) {
result = models.stream().map(BizLongTextSummaryCacheConvert::modelToEntity).collect(Collectors.toList());
}
return result;
}
public BizLongTextSummaryCacheEntity save(BizLongTextSummaryCacheEntity entity) throws Exception{
Assert.notNull(entity);
entity.setId(null);
entity.setIsDeleted("N");
BizLongTextSummaryCacheModel model = BizLongTextSummaryCacheConvert.entityToModel(entity);
BizLongTextSummaryCacheModel saveModel = this.repository.save(model);
return BizLongTextSummaryCacheConvert.modelToEntity(saveModel);
}
public BizLongTextSummaryCacheEntity update(BizLongTextSummaryCacheEntity entity) throws Exception{
Assert.notNull(entity);
Assert.notNull(entity.getId(),"update pk can not be null");
BizLongTextSummaryCacheModel model = this.repository.get(entity.getId());
if (entity.getCorePoint() != null){
model.setCorePoint(entity.getCorePoint());
}
if (entity.getSummary() != null){
model.setSummary(entity.getSummary());
}
if (entity.getFileUrl() != null){
model.setFileUrl(entity.getFileUrl());
}
if (entity.getFileMd5() != null){
model.setFileMd5(entity.getFileMd5());
}
if (entity.getIsDeleted() != null){
model.setIsDeleted(entity.getIsDeleted());
}
if (entity.getCreator() != null){
model.setCreator(entity.getCreator());
}
if (entity.getCreatedTime() != null){
model.setCreatedTime(entity.getCreatedTime());
}
if (entity.getModifier() != null){
model.setModifier(entity.getModifier());
}
if (entity.getModifiedTime() != null){
model.setModifiedTime(entity.getModifiedTime());
}
if (entity.getSysVersion() != null){
model.setSysVersion(entity.getSysVersion());
}
BizLongTextSummaryCacheModel saveModel = this.repository.save(model);
return BizLongTextSummaryCacheConvert.modelToEntity(saveModel);
}
public void deletedById(java.lang.Long id) throws Exception{
Assert.notNull(id);
BizLongTextSummaryCacheModel model = this.repository.get(id);
if (model != null){
if ("N".equals(model.getIsDeleted())){
model.setIsDeleted("Y");
this.repository.save(model);
}
}
}
}
\ No newline at end of file
package cn.com.poc.utils;
import cn.com.poc.common.utils.MD5Utils;
import cn.com.yict.framemax.core.spring.SingleContextInitializer;
import cn.hutool.crypto.digest.MD5;
import org.junit.runner.RunWith;
import org.junit.Test;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import java.io.*;
import java.nio.file.Files;
/**
* @author alex.yao
* @date 2025/6/18
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(initializers = SingleContextInitializer.class)
@WebAppConfiguration
public class MD5UtilsTest {
@Test
public void test_md5() throws IOException {
//计算文件MD5值
File file = new File("C:\\Users\\52747\\Documents\\dataset\\22222(中文版).pdf");
InputStream inputStream = Files.newInputStream(file.toPath());
byte[] bytes = new byte[inputStream.available()];
inputStream.read(bytes);
String md5 = MD5.create().digestHex(bytes);
System.out.println(md5);
}
}
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