|
|
|
@ -3,7 +3,11 @@ 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.supervision.police.domain.*;
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
|
|
import com.supervision.police.domain.CasePerson;
|
|
|
|
|
import com.supervision.police.domain.NotePrompt;
|
|
|
|
|
import com.supervision.police.domain.NoteRecordSplit;
|
|
|
|
|
import com.supervision.police.domain.TripleInfo;
|
|
|
|
|
import com.supervision.police.service.*;
|
|
|
|
|
import com.supervision.thread.TripleExtractTask;
|
|
|
|
|
import com.supervision.thread.TripleExtractTaskPool;
|
|
|
|
@ -11,11 +15,13 @@ import lombok.RequiredArgsConstructor;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.springframework.ai.ollama.OllamaChatClient;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.scheduling.annotation.Async;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Objects;
|
|
|
|
|
import java.util.Optional;
|
|
|
|
|
import java.util.concurrent.ExecutionException;
|
|
|
|
|
import java.util.concurrent.Future;
|
|
|
|
|
import java.util.function.Consumer;
|
|
|
|
@ -33,6 +39,8 @@ public class ExtractTripleInfoServiceImpl implements ExtractTripleInfoService {
|
|
|
|
|
|
|
|
|
|
private final OllamaChatClient chatClient;
|
|
|
|
|
|
|
|
|
|
private final CasePersonService casePersonService;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private NoteRecordSplitService noteRecordSplitService;
|
|
|
|
|
|
|
|
|
@ -54,61 +62,65 @@ public class ExtractTripleInfoServiceImpl implements ExtractTripleInfoService {
|
|
|
|
|
|
|
|
|
|
List<NotePrompt> notePromptList = notePromptService.listPromptBySplitId(recordSplitId);
|
|
|
|
|
|
|
|
|
|
if (CollUtil.isEmpty(notePromptList)){
|
|
|
|
|
log.warn("extractTripleInfo:笔录片段:{},笔录分类:{} 不属于任何提示词,不进行后续操作...", recordSplit.getId(),recordSplit.getRecordType());
|
|
|
|
|
if (CollUtil.isEmpty(notePromptList)) {
|
|
|
|
|
log.warn("extractTripleInfo:笔录片段:{},笔录分类:{} 不属于任何提示词,不进行后续操作...", recordSplit.getId(), recordSplit.getRecordType());
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
QueryWrapper<CasePerson> wrapper = new QueryWrapper<>();
|
|
|
|
|
wrapper.eq("case_id", caseId);
|
|
|
|
|
wrapper.eq("case_actor_flag", 1);
|
|
|
|
|
CasePerson mainActor = casePersonService.getOne(wrapper);
|
|
|
|
|
|
|
|
|
|
List<TripleExtractTask> taskList = notePromptList.stream()
|
|
|
|
|
.filter(prompt -> StrUtil.isNotBlank(prompt.getPrompt()))
|
|
|
|
|
.peek(prompt -> {
|
|
|
|
|
caseTaskRecordService.taskCountIncrement(caseId, recordSplit.getNoteRecordId());
|
|
|
|
|
log.info("extractTripleInfo:三元组抽取任务数量加1,笔录片段id:{}",prompt.getId());
|
|
|
|
|
log.info("extractTripleInfo:三元组抽取任务数量加1,笔录片段id:{}", prompt.getId());
|
|
|
|
|
})
|
|
|
|
|
.map(prompt -> new TripleExtractTask(chatClient, prompt, recordSplit,postExtractTriple())).toList();
|
|
|
|
|
.map(prompt -> new TripleExtractTask(chatClient, prompt, recordSplit, postExtractTriple(), mainActor)).toList();
|
|
|
|
|
|
|
|
|
|
if (CollUtil.isEmpty(taskList)){
|
|
|
|
|
if (CollUtil.isEmpty(taskList)) {
|
|
|
|
|
log.info("extractTripleInfo:笔录片段:{} 没有可用的提示词,不提交任何任务...", recordSplit.getId());
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
List<TripleInfo> tripleInfos = new ArrayList<>();
|
|
|
|
|
try {
|
|
|
|
|
log.info("extractTripleInfo:笔录片段:{}抽取任务成功提交{}个任务....",recordSplitId,taskList.size());
|
|
|
|
|
log.info("extractTripleInfo:笔录片段:{}抽取任务成功提交{}个任务....", recordSplitId, taskList.size());
|
|
|
|
|
List<Future<TripleInfo>> futures = TripleExtractTaskPool.executor.invokeAll(taskList);
|
|
|
|
|
|
|
|
|
|
for (Future<TripleInfo> future : futures) {
|
|
|
|
|
try {
|
|
|
|
|
TripleInfo tripleInfo = future.get();
|
|
|
|
|
if (Objects.nonNull(tripleInfo)){
|
|
|
|
|
if (Objects.nonNull(tripleInfo)) {
|
|
|
|
|
tripleInfos.add(tripleInfo);
|
|
|
|
|
}
|
|
|
|
|
} catch (ExecutionException e) {
|
|
|
|
|
log.error("extractTripleInfo:笔录片段:{}三元组提取任务执行失败...",recordSplitId,e);
|
|
|
|
|
log.error("extractTripleInfo:笔录片段:{}三元组提取任务执行失败...", recordSplitId, e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
|
log.error("extractTripleInfo:笔录片段:{}三元组提取任务提交失败...",recordSplitId,e);
|
|
|
|
|
log.error("extractTripleInfo:笔录片段:{}三元组提取任务提交失败...", recordSplitId, e);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果有提取到三元组信息
|
|
|
|
|
if (CollUtil.isNotEmpty(tripleInfos)) {
|
|
|
|
|
for (TripleInfo tripleInfo : tripleInfos) {
|
|
|
|
|
log.info("extractTripleInfo:笔录片段:{}三元组提取任务执行结束...,三元组信息入库:{}", recordSplitId,JSONUtil.toJsonStr(tripleInfo));
|
|
|
|
|
log.info("extractTripleInfo:笔录片段:{}三元组提取任务执行结束...,三元组信息入库:{}", recordSplitId, JSONUtil.toJsonStr(tripleInfo));
|
|
|
|
|
tripleInfoService.save(tripleInfo);
|
|
|
|
|
}
|
|
|
|
|
}else {
|
|
|
|
|
} else {
|
|
|
|
|
log.info("extractTripleInfo:笔录片段:{}三元组提取任务执行结束...,未提取到任何三元组信息...", recordSplitId);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Consumer<NoteRecordSplit> postExtractTriple() {
|
|
|
|
|
return (recordSplit) -> {
|
|
|
|
|
try{
|
|
|
|
|
try {
|
|
|
|
|
caseTaskRecordService.finishCountIncrement(recordSplit.getCaseId(), recordSplit.getNoteRecordId());
|
|
|
|
|
log.info("postExtractTriple:抽取任务完成数量加1,笔录片段id:{}",recordSplit.getId());
|
|
|
|
|
}catch (Exception e){
|
|
|
|
|
log.error("postExtractTriple:笔录片段:{} 抽取任务执行后更新任务状态失败...",recordSplit.getId(),e);
|
|
|
|
|
log.info("postExtractTriple:抽取任务完成数量加1,笔录片段id:{}", recordSplit.getId());
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("postExtractTriple:笔录片段:{} 抽取任务执行后更新任务状态失败...", recordSplit.getId(), e);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|