|
|
@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
|
import cn.hutool.json.JSONUtil;
|
|
|
|
import cn.hutool.json.JSONUtil;
|
|
|
|
|
|
|
|
import com.supervision.police.domain.CasePerson;
|
|
|
|
import com.supervision.police.domain.NotePrompt;
|
|
|
|
import com.supervision.police.domain.NotePrompt;
|
|
|
|
import com.supervision.police.domain.NoteRecordSplit;
|
|
|
|
import com.supervision.police.domain.NoteRecordSplit;
|
|
|
|
import com.supervision.police.domain.TripleInfo;
|
|
|
|
import com.supervision.police.domain.TripleInfo;
|
|
|
@ -22,6 +23,7 @@ import java.util.function.Consumer;
|
|
|
|
|
|
|
|
|
|
|
|
@Slf4j
|
|
|
|
@Slf4j
|
|
|
|
public class TripleExtractTask implements Callable<TripleInfo> {
|
|
|
|
public class TripleExtractTask implements Callable<TripleInfo> {
|
|
|
|
|
|
|
|
private static final String HEAD_ENTITY_TYPE_ACTOR = "行为人";
|
|
|
|
|
|
|
|
|
|
|
|
private final OllamaChatClient chatClient;
|
|
|
|
private final OllamaChatClient chatClient;
|
|
|
|
|
|
|
|
|
|
|
@ -31,12 +33,15 @@ public class TripleExtractTask implements Callable<TripleInfo> {
|
|
|
|
|
|
|
|
|
|
|
|
private final Consumer<NoteRecordSplit> consumer;
|
|
|
|
private final Consumer<NoteRecordSplit> consumer;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final CasePerson mainActor;
|
|
|
|
|
|
|
|
|
|
|
|
public TripleExtractTask(OllamaChatClient chatClient, NotePrompt prompt, NoteRecordSplit noteRecordSplit, Consumer<NoteRecordSplit> consumer) {
|
|
|
|
|
|
|
|
|
|
|
|
public TripleExtractTask(OllamaChatClient chatClient, NotePrompt prompt, NoteRecordSplit noteRecordSplit, Consumer<NoteRecordSplit> consumer, CasePerson mainActor) {
|
|
|
|
this.chatClient = chatClient;
|
|
|
|
this.chatClient = chatClient;
|
|
|
|
this.noteRecordSplit = noteRecordSplit;
|
|
|
|
this.noteRecordSplit = noteRecordSplit;
|
|
|
|
this.prompt = prompt;
|
|
|
|
this.prompt = prompt;
|
|
|
|
this.consumer = consumer;
|
|
|
|
this.consumer = consumer;
|
|
|
|
|
|
|
|
this.mainActor = mainActor;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -48,7 +53,7 @@ public class TripleExtractTask implements Callable<TripleInfo> {
|
|
|
|
* 3. 尽量遵循常见的语义和逻辑规则,杜绝过度解读或不合理的关系推断。
|
|
|
|
* 3. 尽量遵循常见的语义和逻辑规则,杜绝过度解读或不合理的关系推断。
|
|
|
|
* 4. 不要提取例子中的实体和关系,提取的结果一定来自需要分析的文本内容!!
|
|
|
|
* 4. 不要提取例子中的实体和关系,提取的结果一定来自需要分析的文本内容!!
|
|
|
|
* 5. 提取之后,再检查一遍,提取的关系和实体是否与给定关系和实体类型对应
|
|
|
|
* 5. 提取之后,再检查一遍,提取的关系和实体是否与给定关系和实体类型对应
|
|
|
|
*
|
|
|
|
* <p>
|
|
|
|
* 给定的头实体类型为"{headEntityType}";给定的尾实体类型为"{tailEntityType}",给定的关系为"{relation}"。
|
|
|
|
* 给定的头实体类型为"{headEntityType}";给定的尾实体类型为"{tailEntityType}",给定的关系为"{relation}"。
|
|
|
|
* 请仔细分析以下的文本内容,精准找出符合给定关系且头尾实体类型相符的三元组,并进行提取。如果没有识别给定的三元组关系,请返回json:{"result":[]}。
|
|
|
|
* 请仔细分析以下的文本内容,精准找出符合给定关系且头尾实体类型相符的三元组,并进行提取。如果没有识别给定的三元组关系,请返回json:{"result":[]}。
|
|
|
|
* ---
|
|
|
|
* ---
|
|
|
@ -61,7 +66,7 @@ public class TripleExtractTask implements Callable<TripleInfo> {
|
|
|
|
* {question}
|
|
|
|
* {question}
|
|
|
|
* {answer}
|
|
|
|
* {answer}
|
|
|
|
* ---
|
|
|
|
* ---
|
|
|
|
*
|
|
|
|
* <p>
|
|
|
|
* 返回格式为必须为以下的json格式:
|
|
|
|
* 返回格式为必须为以下的json格式:
|
|
|
|
* {"result":[{"headEntity": {"type": "{headEntityType}","name":"提取到的头实体内容1"},"relation": "{relation}","tailEntity": {"type": "{tailEntityType}","name": "提取到的尾实体内容1"}}]}
|
|
|
|
* {"result":[{"headEntity": {"type": "{headEntityType}","name":"提取到的头实体内容1"},"relation": "{relation}","tailEntity": {"type": "{tailEntityType}","name": "提取到的尾实体内容1"}}]}
|
|
|
|
*/
|
|
|
|
*/
|
|
|
@ -116,6 +121,9 @@ public class TripleExtractTask implements Callable<TripleInfo> {
|
|
|
|
paramMap.put("tailEntityType", prompt.getEndEntityType());
|
|
|
|
paramMap.put("tailEntityType", prompt.getEndEntityType());
|
|
|
|
paramMap.put("question", noteRecordSplit.getQuestion());
|
|
|
|
paramMap.put("question", noteRecordSplit.getQuestion());
|
|
|
|
paramMap.put("answer", noteRecordSplit.getAnswer());
|
|
|
|
paramMap.put("answer", noteRecordSplit.getAnswer());
|
|
|
|
|
|
|
|
if (mainActor != null && HEAD_ENTITY_TYPE_ACTOR.equals(prompt.getStartEntityType())) {
|
|
|
|
|
|
|
|
paramMap.put("requirement", "当前案件的行为人是" + mainActor.getName() + ",只尝试提取" + mainActor.getName() + "为头结点的三元组。");
|
|
|
|
|
|
|
|
}
|
|
|
|
String format = StrUtil.format(prompt.getPrompt(), paramMap);
|
|
|
|
String format = StrUtil.format(prompt.getPrompt(), paramMap);
|
|
|
|
|
|
|
|
|
|
|
|
log.info("提示词内容:{}", format);
|
|
|
|
log.info("提示词内容:{}", format);
|
|
|
@ -127,7 +135,8 @@ public class TripleExtractTask implements Callable<TripleInfo> {
|
|
|
|
return new TripleRecord(format, content);
|
|
|
|
return new TripleRecord(format, content);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
record TripleRecord(String question, String answer){}
|
|
|
|
record TripleRecord(String question, String answer) {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Data
|
|
|
|
@Data
|
|
|
|
public static class TripleExtractResult {
|
|
|
|
public static class TripleExtractResult {
|
|
|
|