|
|
|
@ -2,6 +2,7 @@ package com.supervision.police.service.impl;
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
|
|
import cn.hutool.json.JSONUtil;
|
|
|
|
|
import com.alibaba.druid.util.StringUtils;
|
|
|
|
|
import com.supervision.police.domain.*;
|
|
|
|
|
import com.supervision.police.mapper.NotePromptMapper;
|
|
|
|
@ -25,10 +26,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
import org.springframework.util.StopWatch;
|
|
|
|
|
|
|
|
|
|
import java.time.LocalDateTime;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.Iterator;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.concurrent.Future;
|
|
|
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
@ -56,10 +54,14 @@ public class ExtractTripleInfoServiceImpl implements ExtractTripleInfoService {
|
|
|
|
|
|
|
|
|
|
@Async
|
|
|
|
|
@Transactional(transactionManager = "dataSourceTransactionManager", rollbackFor = Exception.class)
|
|
|
|
|
public void extractTripleInfo(String caseId, String name, String recordId) {
|
|
|
|
|
public void extractTripleInfo(String caseId, String name, String recordSplitId) {
|
|
|
|
|
// 首先获取所有切分后的笔录
|
|
|
|
|
List<NoteRecordSplit> recordSplitList = noteRecordSplitService.lambdaQuery().eq(StrUtil.isNotBlank(recordId), NoteRecordSplit::getNoteRecordId, recordId)
|
|
|
|
|
.eq(NoteRecordSplit::getCaseId, caseId).eq(NoteRecordSplit::getPersonName, name).list();
|
|
|
|
|
Optional<NoteRecordSplit> optById = noteRecordSplitService.getOptById(recordSplitId);
|
|
|
|
|
if (optById.isEmpty()) {
|
|
|
|
|
log.info("{} 切分笔录不存在,跳过", recordSplitId);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
NoteRecordSplit recordSplit = optById.get();
|
|
|
|
|
// 获取所有的分类
|
|
|
|
|
List<ModelRecordType> allTypeList = modelRecordTypeService.list();
|
|
|
|
|
Map<String, String> allTypeMap = allTypeList.stream().collect(Collectors.toMap(ModelRecordType::getRecordType, ModelRecordType::getId, (k1, k2) -> k1));
|
|
|
|
@ -67,51 +69,49 @@ public class ExtractTripleInfoServiceImpl implements ExtractTripleInfoService {
|
|
|
|
|
List<TripleInfo> tripleInfos = new ArrayList<>();
|
|
|
|
|
List<Future<TripleInfo>> futures = new ArrayList<>();
|
|
|
|
|
// 对切分后的笔录进行遍历
|
|
|
|
|
for (NoteRecordSplit recordSplit : recordSplitList) {
|
|
|
|
|
String recordType = recordSplit.getRecordType();
|
|
|
|
|
if (StrUtil.isBlank(recordType)) {
|
|
|
|
|
log.info("{} 切分笔录不属于任何类型,跳过", recordSplit.getId());
|
|
|
|
|
}
|
|
|
|
|
String[] split = recordType.split(";");
|
|
|
|
|
for (String typeName : split) {
|
|
|
|
|
String typeId = allTypeMap.get(typeName);
|
|
|
|
|
if (StrUtil.isBlank(typeId)) {
|
|
|
|
|
log.info("{} 切分笔录类型:{}未找到,跳过", recordSplit.getId(), typeName);
|
|
|
|
|
String recordType = recordSplit.getRecordType();
|
|
|
|
|
if (StrUtil.isBlank(recordType)) {
|
|
|
|
|
log.info("{} 切分笔录不属于任何类型,跳过", recordSplit.getId());
|
|
|
|
|
}
|
|
|
|
|
String[] split = recordType.split(";");
|
|
|
|
|
for (String typeName : split) {
|
|
|
|
|
String typeId = allTypeMap.get(typeName);
|
|
|
|
|
if (StrUtil.isBlank(typeId)) {
|
|
|
|
|
log.info("{} 切分笔录类型:{}未找到,跳过", recordSplit.getId(), typeName);
|
|
|
|
|
} else {
|
|
|
|
|
// 根据笔录类型找到所有的提取三元组的提示词
|
|
|
|
|
// 一个提示词可能关联多个类型,要进行拆分操作
|
|
|
|
|
List<NotePromptTypeRel> promptTypeRelList = notePromptTypeRelService.lambdaQuery().eq(NotePromptTypeRel::getTypeId, typeId).select(NotePromptTypeRel::getPromptId).list();
|
|
|
|
|
if (CollUtil.isEmpty(promptTypeRelList)) {
|
|
|
|
|
log.info("{} 切分笔录类型:{}无对应的提示词,跳过", recordSplit.getId(), typeName);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
List<NotePrompt> prompts = notePromptService.lambdaQuery()
|
|
|
|
|
.in(NotePrompt::getId, promptTypeRelList.stream().map(NotePromptTypeRel::getPromptId).collect(Collectors.toSet()))
|
|
|
|
|
.list();
|
|
|
|
|
if (CollUtil.isEmpty(prompts)) {
|
|
|
|
|
log.info("{} 切分笔录类型:{}无对应的提示词,跳过", recordSplit.getId(), typeName);
|
|
|
|
|
} else {
|
|
|
|
|
// 根据笔录类型找到所有的提取三元组的提示词
|
|
|
|
|
// 一个提示词可能关联多个类型,要进行拆分操作
|
|
|
|
|
List<NotePromptTypeRel> promptTypeRelList = notePromptTypeRelService.lambdaQuery().eq(NotePromptTypeRel::getTypeId, typeId).select(NotePromptTypeRel::getPromptId).list();
|
|
|
|
|
if (CollUtil.isEmpty(promptTypeRelList)) {
|
|
|
|
|
log.info("{} 切分笔录类型:{}无对应的提示词,跳过", recordSplit.getId(), typeName);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
List<NotePrompt> prompts = notePromptService.lambdaQuery()
|
|
|
|
|
.in(NotePrompt::getId, promptTypeRelList.stream().map(NotePromptTypeRel::getPromptId).collect(Collectors.toSet()))
|
|
|
|
|
.list();
|
|
|
|
|
if (CollUtil.isEmpty(prompts)) {
|
|
|
|
|
log.info("{} 切分笔录类型:{}无对应的提示词,跳过", recordSplit.getId(), typeName);
|
|
|
|
|
} else {
|
|
|
|
|
// 遍历提示词进行提取
|
|
|
|
|
for (NotePrompt prompt : prompts) {
|
|
|
|
|
if (StringUtils.isEmpty(prompt.getPrompt())) {
|
|
|
|
|
log.info("{} 切分笔录类型:{}对应的提示词:{} 提示词模板为空,跳过", recordSplit.getId(), typeName, prompt.getId());
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
log.info("提交任务到线程池中进行三元组提取");
|
|
|
|
|
TripleExtractThread tripleExtractThread = new TripleExtractThread(chatClient, caseId, recordId, recordSplit.getId(), prompt, recordSplit.getQuestion(), recordSplit.getAnswer());
|
|
|
|
|
Future<TripleInfo> submit = TripleExtractThreadPool.chatExecutor.submit(tripleExtractThread);
|
|
|
|
|
futures.add(submit);
|
|
|
|
|
log.info("任务提交成功");
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error(e.getMessage(), e);
|
|
|
|
|
}
|
|
|
|
|
// 遍历提示词进行提取
|
|
|
|
|
for (NotePrompt prompt : prompts) {
|
|
|
|
|
if (StringUtils.isEmpty(prompt.getPrompt())) {
|
|
|
|
|
log.info("{} 切分笔录类型:{}对应的提示词:{} 提示词模板为空,跳过", recordSplit.getId(), typeName, prompt.getId());
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
log.info("提交任务到线程池中进行三元组提取");
|
|
|
|
|
TripleExtractThread tripleExtractThread = new TripleExtractThread(chatClient, caseId, recordSplit.getNoteRecordId(), recordSplit.getId(), prompt, recordSplit.getQuestion(), recordSplit.getAnswer());
|
|
|
|
|
Future<TripleInfo> submit = TripleExtractThreadPool.chatExecutor.submit(tripleExtractThread);
|
|
|
|
|
futures.add(submit);
|
|
|
|
|
log.info("三元组提取任务提交成功");
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error(e.getMessage(), e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
log.info("休眠5秒,5秒之后再去查询三元组的结果,需要查询的任务数量为:{}", futures.size());
|
|
|
|
@ -157,10 +157,9 @@ public class ExtractTripleInfoServiceImpl implements ExtractTripleInfoService {
|
|
|
|
|
}
|
|
|
|
|
// 如果有提取到三元组信息
|
|
|
|
|
if (CollUtil.isNotEmpty(tripleInfos)) {
|
|
|
|
|
// 首先清除现在已经提取过的三元组信息
|
|
|
|
|
tripleInfoService.lambdaUpdate().eq(TripleInfo::getRecordId, recordId).remove();
|
|
|
|
|
for (TripleInfo tripleInfo : tripleInfos) {
|
|
|
|
|
tripleInfoService.save(tripleInfo);
|
|
|
|
|
log.info("保存三元组信息{}", JSONUtil.toJsonStr(tripleInfo));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
log.info("三元组提取任务执行完毕,结束");
|
|
|
|
|