|
|
package com.supervision.handler.gpt;
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
import cn.hutool.json.JSONUtil;
|
|
|
import com.supervision.ai.AiUtil;
|
|
|
import com.supervision.ai.dto.MessageDTO;
|
|
|
import com.supervision.enums.IdentifyIntentEnum;
|
|
|
import com.supervision.exception.IdentifyIntentException;
|
|
|
import io.lettuce.core.dynamic.annotation.CommandNaming;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
|
|
|
/**
|
|
|
* 意图识别handler
|
|
|
*/
|
|
|
@Slf4j
|
|
|
@Component
|
|
|
public class IdentifyIntentHandler {
|
|
|
|
|
|
public String identifyIntent(String question) {
|
|
|
// 首先生成提示词
|
|
|
List<MessageDTO> messageList = new ArrayList<>();
|
|
|
messageList.add(new MessageDTO("system", "假设你是一个意图识别模型,且精通社会保险业务中的事务分类," +
|
|
|
"现在我会给你一个意图列表以及意图列表可能的一些典型问法,你首先要根据意图列表和典型问法进行学习(典型问法只是参考,并不一定局限于典型问法范围)," +
|
|
|
"然后我再给你一个句子,请帮我的要求识别出这个句子中的意图.除了匹配的意图之外,不要回答其他的内容!如果该句子中不含有意图列表中任意意图,你可以输出:未识别"));
|
|
|
messageList.add(new MessageDTO("assistant", "好的"));
|
|
|
// 构建学习案例
|
|
|
StringBuilder stringBuilder = new StringBuilder();
|
|
|
for (IdentifyIntentEnum value : IdentifyIntentEnum.values()) {
|
|
|
stringBuilder.append("意图:").append(value.getIntent()).append(";").append("典型问法:").append(CollUtil.join(value.getExplainList(), ",")).append("\n");
|
|
|
}
|
|
|
messageList.add(new MessageDTO("user", stringBuilder.toString()));
|
|
|
messageList.add(new MessageDTO("assistant", "已学习"));
|
|
|
// 构建问题
|
|
|
messageList.add(new MessageDTO("user", "问题是:" + question));
|
|
|
messageList.add(new MessageDTO("assistant", "好的"));
|
|
|
messageList.add(new MessageDTO("user", "现在你可以根据你学习到的意图列表,来输出根据提供的问题所识别到的意图了"));
|
|
|
log.info("identifyIntent开始识别意图:{}", JSONUtil.toJsonStr(messageList));
|
|
|
// 进行提问
|
|
|
String intent = AiUtil.chatByMessage(messageList);
|
|
|
log.info("identifyIntent意图识别结果为:{}", intent);
|
|
|
// 尝试转为JSON的形式
|
|
|
if (StrUtil.isBlank(intent) || StrUtil.equals("未识别", intent) || intent.contains("未识别")) {
|
|
|
throw new IdentifyIntentException("意图未识别");
|
|
|
}
|
|
|
for (IdentifyIntentEnum value : IdentifyIntentEnum.values()) {
|
|
|
if (intent.contains(value.getIntent())){
|
|
|
return value.getIntent();
|
|
|
}
|
|
|
}
|
|
|
throw new IdentifyIntentException("意图未识别");
|
|
|
}
|
|
|
}
|