1. 添加单个提示词分析笔录功能

jinan_dev
xueqingkun 4 months ago
parent c388c1eaf5
commit 791e133780

@ -1,17 +1,19 @@
package com.supervision.job;
import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSON;
import com.supervision.neo4j.service.Neo4jService;
import com.supervision.police.domain.NotePrompt;
import com.supervision.police.domain.TaskCaseRecord;
import com.supervision.police.domain.TaskRecord;
import com.supervision.police.domain.TripleInfo;
import com.supervision.police.service.*;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import static com.supervision.common.constant.NotePromptConstants.TYPE_GRAPH_REASONING;
@ -22,11 +24,22 @@ import static com.supervision.common.constant.TaskRecordConstants.*;
@Component
@RequiredArgsConstructor
public class XxlJobTask {
private final CaseEvidenceService caseEvidenceService;
private final TaskRecordService taskRecordService;
private final TaskCaseRecordService taskCaseRecordService;
private TaskCaseRecordService taskCaseRecordService;
private final ModelCaseService modelCaseService;
private final NotePromptService notePromptService;
private final ExtractTripleInfoService extractTripleInfoService;
private final Neo4jService neo4jService;
private final TripleInfoService tripleInfoService;
/**
*
*/
@ -86,6 +99,14 @@ public class XxlJobTask {
}
switch (prompt.getType()) {
case TYPE_GRAPH_REASONING:
List<TripleInfo> tripleInfos = extractTripleInfoService.extractTripleInfo(prompt, caseId, map.get("executeId"));
for (TripleInfo tripleInfo : tripleInfos) {
neo4jService.saveTripleInfo(tripleInfo);
}
if (CollUtil.isNotEmpty(tripleInfos)){
tripleInfoService.updateNeo4jFlag(tripleInfos.stream().map(TripleInfo::getId).toList(), "1");
}
log.info("【图推理】任务开始。任务ID: 【{}】", taskId);
// TODO: 笔录处理
break;

@ -5,6 +5,7 @@ import com.supervision.common.domain.R;
import com.supervision.neo4j.domain.CaseNode;
import com.supervision.neo4j.domain.Rel;
import com.supervision.neo4j.dto.WebRelDTO;
import com.supervision.police.domain.TripleInfo;
import org.neo4j.driver.Record;
import com.supervision.police.vo.GraphReqVO;
@ -67,4 +68,6 @@ public interface Neo4jService {
void mockTestGraph(String path, String sheetName, String recordId, String recordSplitId, String caseId);
List<Record> executeCypher(String cypher, Map<String, Object> parameters);
TripleInfo saveTripleInfo(TripleInfo tripleInfo);
}

@ -10,6 +10,7 @@ import com.supervision.neo4j.domain.Rel;
import com.supervision.neo4j.dto.WebRelDTO;
import com.supervision.neo4j.service.Neo4jService;
import com.supervision.neo4j.utils.Neo4jUtils;
import com.supervision.police.domain.TripleInfo;
import com.supervision.police.vo.GraphReqVO;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@ -631,6 +632,39 @@ public class Neo4jServiceImpl implements Neo4jService {
@Override
public List<Record> executeCypher(String cypher, Map<String, Object> parameters) {
return this.driver.session().run(cypher, parameters).list();
try (Session session = this.driver.session()) {
return session.run(cypher, parameters).list();
}
}
@Override
public TripleInfo saveTripleInfo(TripleInfo tripleInfo) {
//开始节点
String start = tripleInfo.getStartNode();
// 首先看是否已经存在了,如果已经存在了,就不添加了
CaseNode startNode = this.findOneByName(tripleInfo.getCaseId(), tripleInfo.getRecordId(), tripleInfo.getStartNodeType(), start, "1");
if (startNode == null) {
startNode = new CaseNode(start, tripleInfo.getStartNodeType(), tripleInfo.getRecordSplitId(), tripleInfo.getRecordId(), tripleInfo.getCaseId(), "1");
CaseNode save = this.save(startNode);
startNode.setId(save.getId());
}
//结束节点
String end = tripleInfo.getEndNode();
CaseNode endNode = this.findOneByName(tripleInfo.getCaseId(), tripleInfo.getRecordId(), tripleInfo.getEndNodeType(), end, "1");
if (endNode == null) {
endNode = new CaseNode(end, tripleInfo.getEndNodeType(), tripleInfo.getRecordSplitId(), tripleInfo.getRecordId(), tripleInfo.getCaseId(), "1");
CaseNode save = this.save(endNode);
endNode.setId(save.getId());
}
//关系
Rel rel = new Rel(startNode.getId(), tripleInfo.getRelation(), endNode.getId());
Rel relation = this.findRelation(rel);
if (relation == null) {
relation = this.saveRelation(rel);
}
tripleInfo.setStartNodeGraphId(startNode.getId());
tripleInfo.setRelGraphId(relation.getId());
tripleInfo.setEndNodeGraphId(endNode.getId());
return tripleInfo;
}
}

@ -19,4 +19,7 @@ public interface CasePersonService extends IService<CasePerson> {
List<CasePerson> listByEvidenceId(String evidenceId);
CasePerson getMainActor(String caseId);
}

@ -1,6 +1,18 @@
package com.supervision.police.service;
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 java.util.List;
public interface ExtractTripleInfoService {
void extractTripleInfo(String caseId, String name, String recordSplitId);
List<TripleInfo> extractTripleInfo(NotePrompt notePrompt, CasePerson mainActor, List<NoteRecordSplit> noteRecordSplitList);
List<TripleInfo> extractTripleInfo(NotePrompt notePrompt, String caseId, String recordId);
}

@ -32,4 +32,7 @@ public interface NoteRecordSplitService extends IService<NoteRecordSplit> {
Map<String, Object> queryRecordList(NoteRecordReqVO noteRecord, Integer page, Integer size);
String redoExtract(NoteRecordReqVO records) throws IOException;
List<NoteRecordSplit> queryRecordSplitList(String recordId);
}

@ -3,5 +3,17 @@ package com.supervision.police.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.supervision.police.domain.TripleInfo;
import java.util.List;
public interface TripleInfoService extends IService<TripleInfo> {
/**
* id
* @param tripleInfo
* @return
*/
TripleInfo saveOrUpdateByBusiness(TripleInfo tripleInfo);
void updateNeo4jFlag(List<String> ids, String neo4jFlag);
}

@ -58,4 +58,9 @@ public class CasePersonServiceImpl extends ServiceImpl<CasePersonMapper, CasePer
return super.getBaseMapper().listByEvidenceId(evidenceId);
}
@Override
public CasePerson getMainActor(String caseId) {
return super.lambdaQuery().eq(CasePerson::getCaseId, caseId).eq(CasePerson::getCaseActorFlag, 1).one();
}
}

@ -1,9 +1,9 @@
package com.supervision.police.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
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;
@ -31,8 +31,6 @@ import java.util.function.Consumer;
@RequiredArgsConstructor
public class ExtractTripleInfoServiceImpl implements ExtractTripleInfoService {
private final CaseTaskRecordService caseTaskRecordService;
private final NotePromptService notePromptService;
private final TripleInfoService tripleInfoService;
@ -66,10 +64,8 @@ public class ExtractTripleInfoServiceImpl implements ExtractTripleInfoService {
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);
CasePerson mainActor = casePersonService.getMainActor(caseId);
List<TripleExtractTask> taskList = notePromptList.stream()
.filter(prompt -> StrUtil.isNotBlank(prompt.getPrompt()))
@ -84,9 +80,15 @@ public class ExtractTripleInfoServiceImpl implements ExtractTripleInfoService {
return;
}
log.info("extractTripleInfo:笔录片段:{}开始提交三元组抽取任务,任务数量:{}", recordSplit.getId(),taskList.size());
List<TripleInfo> tripleInfos = doTripleExtractTask(taskList);
log.info("extractTripleInfo:笔录片段:{}三元组抽取任务提交结束,抽取三元组个数:{}...", recordSplit.getId(), tripleInfos.size());
}
private List<TripleInfo> doTripleExtractTask(List<TripleExtractTask> taskList) {
List<TripleInfo> tripleInfos = new ArrayList<>();
try {
log.info("extractTripleInfo:笔录片段:{}抽取任务成功提交{}个任务....", recordSplitId, taskList.size());
log.info("doTripleExtractTask:抽取任务成功提交{}个任务....", taskList.size());
List<Future<TripleInfo>> futures = TripleExtractTaskPool.executor.invokeAll(taskList);
for (Future<TripleInfo> future : futures) {
@ -96,22 +98,55 @@ public class ExtractTripleInfoServiceImpl implements ExtractTripleInfoService {
tripleInfos.add(tripleInfo);
}
} catch (ExecutionException e) {
log.error("extractTripleInfo:笔录片段:{}三元组提取任务执行失败...", recordSplitId, e);
log.error("doTripleExtractTask:三元组提取任务执行失败...", e);
}
}
} catch (InterruptedException e) {
log.error("extractTripleInfo:笔录片段:{}三元组提取任务提交失败...", recordSplitId, e);
log.error("doTripleExtractTask:三元组提取任务提交失败...", e);
}
// 如果有提取到三元组信息
if (CollUtil.isNotEmpty(tripleInfos)) {
for (TripleInfo tripleInfo : tripleInfos) {
log.info("extractTripleInfo:笔录片段:{}三元组提取任务执行结束...,三元组信息入库:{}", recordSplitId, JSONUtil.toJsonStr(tripleInfo));
tripleInfoService.save(tripleInfo);
log.info("doTripleExtractTask:笔录片段:{}三元组提取任务执行结束...,三元组信息入库:{}",tripleInfo.getRecordSplitId(), JSONUtil.toJsonStr(tripleInfo));
tripleInfoService.saveOrUpdateByBusiness(tripleInfo);
}
} else {
log.info("extractTripleInfo:笔录片段:{}三元组提取任务执行结束...,未提取到任何三元组信息...", recordSplitId);
}
return tripleInfos;
}
@Override
public List<TripleInfo> extractTripleInfo(NotePrompt notePrompt,CasePerson mainActor,List<NoteRecordSplit> noteRecordSplitList) {
Assert.notEmpty(noteRecordSplitList, "noteRecordSplitList不能为空");
Assert.notNull(notePrompt, "notePrompt不能为空");
List<TripleExtractTask> taskList = noteRecordSplitList.stream().map(
noteRecordSplit ->
new TripleExtractTask(chatClient, notePrompt, noteRecordSplit, postExtractTriple(), mainActor)
).toList();
if (CollUtil.isEmpty(taskList)){
return new ArrayList<>();
}
log.info("extractTripleInfo:提示词:{}开始提交三元组抽取任务,任务数量:{}", notePrompt.getName(),taskList.size());
List<TripleInfo> tripleInfos = doTripleExtractTask(taskList);
log.info("extractTripleInfo:提示词:{}三元组抽取任务提交结束,抽取三元组个数:{}...", notePrompt.getName(), tripleInfos.size());
return tripleInfos;
}
@Override
public List<TripleInfo> extractTripleInfo(NotePrompt notePrompt, String caseId, String recordId) {
Assert.notNull(notePrompt, "notePrompt不能为空");
Assert.notEmpty(recordId, "recordId不能为空");
Assert.notEmpty(caseId, "caseId不能为空");
CasePerson mainActor = casePersonService.getMainActor(caseId);
List<NoteRecordSplit> noteRecordSplits = noteRecordSplitService.queryRecordSplitList(recordId);
return extractTripleInfo(notePrompt, mainActor, noteRecordSplits);
}
private Consumer<NoteRecordSplit> postExtractTriple() {

@ -336,36 +336,8 @@ public class ModelRecordTypeServiceImpl extends ServiceImpl<ModelRecordTypeMappe
List<TripleInfo> tripleInfos = tripleInfoService.listByIds(ids);
for (TripleInfo tripleInfo : tripleInfos) {
try {
//开始节点
String start = tripleInfo.getStartNode();
// 首先看是否已经存在了,如果已经存在了,就不添加了
CaseNode startNode = neo4jService.findOneByName(tripleInfo.getCaseId(), tripleInfo.getRecordId(), tripleInfo.getStartNodeType(), start, "1");
if (startNode == null) {
startNode = new CaseNode(start, tripleInfo.getStartNodeType(), tripleInfo.getRecordSplitId(), tripleInfo.getRecordId(), tripleInfo.getCaseId(), "1");
CaseNode save = neo4jService.save(startNode);
startNode.setId(save.getId());
}
//结束节点
String end = tripleInfo.getEndNode();
CaseNode endNode = neo4jService.findOneByName(tripleInfo.getCaseId(), tripleInfo.getRecordId(), tripleInfo.getEndNodeType(), end, "1");
if (endNode == null) {
endNode = new CaseNode(end, tripleInfo.getEndNodeType(), tripleInfo.getRecordSplitId(), tripleInfo.getRecordId(), tripleInfo.getCaseId(), "1");
CaseNode save = neo4jService.save(endNode);
endNode.setId(save.getId());
}
//关系
Rel rel = new Rel(startNode.getId(), tripleInfo.getRelation(), endNode.getId());
Rel relation = neo4jService.findRelation(rel);
if (relation == null) {
relation = neo4jService.saveRelation(rel);
}
tripleInfo.setAddNeo4j("1");
tripleInfo.setStartNodeGraphId(startNode.getId());
tripleInfo.setRelGraphId(relation.getId());
tripleInfo.setEndNodeGraphId(endNode.getId());
boolean updateResult = tripleInfoService.updateById(tripleInfo);
if (updateResult) {
}
TripleInfo neo4jTripleInfo = neo4jService.saveTripleInfo(tripleInfo);
tripleInfoService.updateNeo4jFlag(List.of(neo4jTripleInfo.getId()), "1");
} catch (Exception e) {
log.error(e.getMessage(), e);
}

@ -384,6 +384,11 @@ public class NoteRecordSplitServiceImpl extends ServiceImpl<NoteRecordSplitMappe
return uploadRecords(records, true);
}
@Override
public List<NoteRecordSplit> queryRecordSplitList(String recordId) {
return super.lambdaQuery().eq(NoteRecordSplit::getNoteRecordId, recordId).list();
}
private void setRecordDetailSerialNumber(List<NoteRecordDetailDTO> noteRecordDetailDTOList) {
List<Pair<String, Integer>> pairs = new ArrayList<>();

@ -1,12 +1,53 @@
package com.supervision.police.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.supervision.police.domain.TripleInfo;
import com.supervision.police.mapper.TripleInfoMapper;
import com.supervision.police.service.TripleInfoService;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class TripleInfoServiceImpl extends ServiceImpl<TripleInfoMapper, TripleInfo> implements TripleInfoService {
@Override
public TripleInfo saveOrUpdateByBusiness(TripleInfo tripleInfo) {
if (StrUtil.isNotEmpty(tripleInfo.getId())) {
TripleInfo dbTripleInfo = super.getById(tripleInfo.getId());
if (null != dbTripleInfo) {
super.updateById(tripleInfo);
} else {
super.save(tripleInfo);
}
}
if (StrUtil.isEmpty(tripleInfo.getId())) {
TripleInfo one = super.lambdaQuery()
.eq(TripleInfo::getStartNode, tripleInfo.getStartNode())
.eq(TripleInfo::getEndNode, tripleInfo.getEndNode())
.eq(TripleInfo::getRelation, tripleInfo.getRelation())
.eq(TripleInfo::getCaseId, tripleInfo.getCaseId())
.eq(TripleInfo::getStartNodeType, tripleInfo.getStartNodeType())
.eq(TripleInfo::getEndNodeType, tripleInfo.getEndNodeType())
.eq(TripleInfo::getRecordSplitId, tripleInfo.getRecordSplitId()).one();
if (null != one) {
tripleInfo.setId(one.getId());
super.updateById(tripleInfo);
} else {
super.save(tripleInfo);
}
}
return tripleInfo;
}
@Override
public void updateNeo4jFlag(List<String> ids, String neo4jFlag) {
if (CollUtil.isEmpty(ids)){
return;
}
super.lambdaUpdate().in(TripleInfo::getId, ids).set(TripleInfo::getAddNeo4j, neo4jFlag).update();
}
}

Loading…
Cancel
Save