|
|
|
@ -52,25 +52,27 @@ public class TripleExtractThread implements Callable<TripleInfo> {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 三元组提取任务:从给定对话中根据给定实体类型和关系提取对应关系的三元组。
|
|
|
|
|
* 信息抽取任务:从给定对话中根据给定实体类型和关系提取对应关系的三元组。
|
|
|
|
|
* 在提取三元组时,请务必严格遵循以下要求:
|
|
|
|
|
* 1. 精准理解需要分析的文本内容,确保提取的信息准确无误、合理恰当。
|
|
|
|
|
* 2. 只提取给定的实体类型和关系,不要提取给定关系和实体之外的三元组。
|
|
|
|
|
* 3. 尽量遵循常见的语义和逻辑规则,杜绝过度解读或不合理的关系推断。
|
|
|
|
|
* 4. 不要提取例子中的实体和关系,提取的结果一定来自需要分析的文本内容!!
|
|
|
|
|
* 5. 提取之后,再检查一遍,提取的关系和实体是否与给定关系和实体类型对应
|
|
|
|
|
*
|
|
|
|
|
* 给定的头实体类型为"{headEntityType}";给定的尾实体类型为"{tailEntityType}",给定的关系为"{relation}"。
|
|
|
|
|
* 请仔细分析以下的文本内容,精准找出符合给定关系且头尾实体类型相符的三元组,并进行提取。如果没有识别给定的三元组关系,请返回json:{"result":[]}。
|
|
|
|
|
* ---
|
|
|
|
|
* 为您提供一个示例供学习:
|
|
|
|
|
* 给定三元组类型为:头实体类型:"行为人"关系:"伪造",尾实体类型:"合同"
|
|
|
|
|
* 办案警官问:描述一下事情的经过。 行为人小明答:我做了一份假的购房合同。
|
|
|
|
|
* 本示例中应提取给定关系为"伪造"的三元组,则最终应提取的三元组为{"result":[{"headEntity": {"type": "行为人","name":"小明"},"relation": "伪造","tailEntity": {"type": "合同","name": "假的购房合同"}}]}。
|
|
|
|
|
* example:
|
|
|
|
|
* 需要分析提取的文本内容如下:
|
|
|
|
|
* 办案警官问:描述一下事情的经过。 行为人小明答:我用合同款给我老婆买了法国的高档化妆品。
|
|
|
|
|
* 返回结果:{"result":[{"headEntity": {"type": "{headEntityType}","name":"小明"},"relation": "{relation}","tailEntity": {"type": "{tailEntityType}","name": "法国的高档化妆品"}}]}。
|
|
|
|
|
* ---
|
|
|
|
|
* 需要分析提取的QA对如下:
|
|
|
|
|
* 需要分析提取文本内容如下:
|
|
|
|
|
* {question}
|
|
|
|
|
* {answer}
|
|
|
|
|
* ---
|
|
|
|
|
* 在提取三元组时,请务必严格遵循以下要求:
|
|
|
|
|
* 1. 精准理解需要分析的QA文本的含义,确保提取的信息准确无误、合理恰当。
|
|
|
|
|
* 2. 只提取给定的实体类型和关系,不要提取给定关系和实体之外的三元组。
|
|
|
|
|
* 3. 尽量遵循常见的语义和逻辑规则,杜绝过度解读或不合理的关系推断。
|
|
|
|
|
* 4. 例子仅供参考,不要简单地返回示例中的结果。
|
|
|
|
|
* 5. 提取之后,再检查一遍,提取的关系和实体是否与给定关系和实体类型对应
|
|
|
|
|
*
|
|
|
|
|
* 返回格式为必须为以下的json格式:
|
|
|
|
|
* {"result":[{"headEntity": {"type": "{headEntityType}","name":"提取到的头实体内容1"},"relation": "{relation}","tailEntity": {"type": "{tailEntityType}","name": "提取到的尾实体内容1"}}]}
|
|
|
|
|
*/
|
|
|
|
@ -87,19 +89,20 @@ public class TripleExtractThread implements Callable<TripleInfo> {
|
|
|
|
|
paramMap.put("question", question);
|
|
|
|
|
paramMap.put("answer", answer);
|
|
|
|
|
String format = StrUtil.format(prompt.getPrompt(), paramMap);
|
|
|
|
|
// 对format进行切分,把前面两个---作为systemPrompt
|
|
|
|
|
String[] split = format.split("---");
|
|
|
|
|
SystemMessage systemMessage = new SystemMessage(split[0]);
|
|
|
|
|
UserMessage userMessage = new UserMessage(split[1]);
|
|
|
|
|
Prompt ask = new Prompt(List.of(systemMessage, userMessage));
|
|
|
|
|
ChatResponse call = chatClient.call(ask);
|
|
|
|
|
// // 对format进行切分,把前面两个---作为systemPrompt
|
|
|
|
|
// String[] split = format.split("---");
|
|
|
|
|
// SystemMessage systemMessage = new SystemMessage(split[0]);
|
|
|
|
|
// UserMessage userMessage = new UserMessage(split[1]);
|
|
|
|
|
// Prompt ask = new Prompt(List.of(systemMessage, userMessage));
|
|
|
|
|
// ChatResponse call = chatClient.call(ask);
|
|
|
|
|
ChatResponse call = chatClient.call(new Prompt(new UserMessage(format)));
|
|
|
|
|
stopWatch.stop();
|
|
|
|
|
String content = call.getResult().getOutput().getContent();
|
|
|
|
|
log.info("耗时:{},分析的结果是:{}", stopWatch.getTotalTimeSeconds(), content);
|
|
|
|
|
// 获取从提示词中提取到的三元组信息
|
|
|
|
|
TripleExtractResult extractResult = JSONUtil.toBean(content, TripleExtractResult.class);
|
|
|
|
|
if (ObjectUtil.isEmpty(extractResult) || CollUtil.isEmpty(extractResult.getResult())) {
|
|
|
|
|
log.info("提取三元组信息为空,忽略.提取的内容为:{}",content);
|
|
|
|
|
log.info("提取三元组信息为空,忽略.提取的内容为:{}", content);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
for (TripleExtractNode tripleExtractNode : extractResult.getResult()) {
|
|
|
|
@ -118,6 +121,7 @@ public class TripleExtractThread implements Callable<TripleInfo> {
|
|
|
|
|
tripleInfo.setCaseId(caseId);
|
|
|
|
|
tripleInfo.setRecordId(recordId);
|
|
|
|
|
tripleInfo.setRecordSplitId(recordSplitId);
|
|
|
|
|
tripleInfo.setSubmitPrompt(format);
|
|
|
|
|
tripleInfo.setStartNodeType(prompt.getStartEntityType());
|
|
|
|
|
tripleInfo.setEndNodeType(prompt.getEndEntityType());
|
|
|
|
|
return tripleInfo;
|
|
|
|
|