|
|
@ -107,6 +107,7 @@ public class AskServiceImpl implements AskService {
|
|
|
|
// 如果不等于1,说明可能有不确定的节点,这时就要开始找节点
|
|
|
|
// 如果不等于1,说明可能有不确定的节点,这时就要开始找节点
|
|
|
|
Map<String, ItemLeaf> waitMatchItemLeafMap = allMatchLeafNode.stream().collect(Collectors.toMap(ItemLeaf::getVid, Function.identity(), (k1, k2) -> k1));
|
|
|
|
Map<String, ItemLeaf> waitMatchItemLeafMap = allMatchLeafNode.stream().collect(Collectors.toMap(ItemLeaf::getVid, Function.identity(), (k1, k2) -> k1));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 所有的实体类型以及出现次数计数
|
|
|
|
// 所有的实体类型以及出现次数计数
|
|
|
|
Map<String, Integer> entityCountMap = new HashMap<>();
|
|
|
|
Map<String, Integer> entityCountMap = new HashMap<>();
|
|
|
|
// 用来存放所有的节点以及节点路径(key是节点ID,value是节点路径)
|
|
|
|
// 用来存放所有的节点以及节点路径(key是节点ID,value是节点路径)
|
|
|
@ -134,8 +135,11 @@ public class AskServiceImpl implements AskService {
|
|
|
|
sessionParamDTO.setConditionPathMap(conditionPathMap);
|
|
|
|
sessionParamDTO.setConditionPathMap(conditionPathMap);
|
|
|
|
sessionParamDTO.setEntityCountMap(entityCountMap);
|
|
|
|
sessionParamDTO.setEntityCountMap(entityCountMap);
|
|
|
|
redisTemplate.opsForValue().set(SESSION_PARAM + sessionId, sessionParamDTO);
|
|
|
|
redisTemplate.opsForValue().set(SESSION_PARAM + sessionId, sessionParamDTO);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 多轮问答支持设置角色,如果设置角色了,在这里应该先根据角色来排除一遍路径
|
|
|
|
|
|
|
|
filterUserRoleSet(sessionParamDTO);
|
|
|
|
// 如果判断过实体,这时就要判断是否已经确认了节点,如果没有确认,在这里进行确认
|
|
|
|
// 如果判断过实体,这时就要判断是否已经确认了节点,如果没有确认,在这里进行确认
|
|
|
|
match:
|
|
|
|
match:
|
|
|
|
if (ObjectUtil.isEmpty(sessionParamDTO.getMatchItemLeaf())) {
|
|
|
|
if (ObjectUtil.isEmpty(sessionParamDTO.getMatchItemLeaf())) {
|
|
|
@ -147,7 +151,7 @@ public class AskServiceImpl implements AskService {
|
|
|
|
if (sessionParamDTO.getWaitMatchItemLeafMap().size() != 1) {
|
|
|
|
if (sessionParamDTO.getWaitMatchItemLeafMap().size() != 1) {
|
|
|
|
|
|
|
|
|
|
|
|
if (ObjectUtil.isNotEmpty(sessionParamDTO.getCurrentEntity())) {
|
|
|
|
if (ObjectUtil.isNotEmpty(sessionParamDTO.getCurrentEntity())) {
|
|
|
|
// 如果当前对话实体不为空,说明当前问答就是上一个问题的回复,这个时候,就去GPT中进行匹配并排除路径
|
|
|
|
// 如果当前对话实体不为空,说明当前问答就是上一个问题的回复,这个时候,就去大模型中进行匹配并排除路径
|
|
|
|
filterPath(sessionParamDTO, roundTalkReqVO.getUserTalk());
|
|
|
|
filterPath(sessionParamDTO, roundTalkReqVO.getUserTalk());
|
|
|
|
// 如果排除后只剩一个了,这时跳出多轮问答
|
|
|
|
// 如果排除后只剩一个了,这时跳出多轮问答
|
|
|
|
if (sessionParamDTO.getWaitMatchItemLeafMap().size() == 1) {
|
|
|
|
if (sessionParamDTO.getWaitMatchItemLeafMap().size() == 1) {
|
|
|
@ -361,16 +365,15 @@ public class AskServiceImpl implements AskService {
|
|
|
|
return SingleTalkResVO.builder().answerText(answer).build();
|
|
|
|
return SingleTalkResVO.builder().answerText(answer).build();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
/**
|
|
|
|
public RoundTalkResVO saveUserParam(RoleSetReqVO paramReqVO) {
|
|
|
|
* 对用户的角色设置路径进行排除
|
|
|
|
// 缓存到Redis中
|
|
|
|
*/
|
|
|
|
if (CollUtil.isNotEmpty(paramReqVO.getParamMap()) && StrUtil.isNotBlank(paramReqVO.getSessionId())) {
|
|
|
|
private void filterUserRoleSet(SessionParamDTO sessionParamDTO) {
|
|
|
|
redisTemplate.opsForValue().set(USER_PARAM + paramReqVO.getSessionId(), paramReqVO.getParamMap());
|
|
|
|
// 再获取用户填写的缓存
|
|
|
|
// 这里获取session进行筛选,将不匹配的路径移除掉
|
|
|
|
Object userParamObject = redisTemplate.opsForValue().get(USER_PARAM + sessionParamDTO.getSessionId());
|
|
|
|
Object cache = redisTemplate.opsForValue().get(SESSION_PARAM + paramReqVO.getSessionId());
|
|
|
|
if (ObjectUtil.isNotEmpty(userParamObject)) {
|
|
|
|
Optional.ofNullable(cache).orElseThrow(() -> new BusinessException("未找到的会话ID"));
|
|
|
|
Map<String, Object> stringObjectMap = BeanUtil.beanToMap(userParamObject, false, true);
|
|
|
|
SessionParamDTO sessionParamDTO = BeanUtil.toBean(cache, SessionParamDTO.class);
|
|
|
|
for (Map.Entry<String, Object> entry : stringObjectMap.entrySet()) {
|
|
|
|
for (Map.Entry<String, String> entry : paramReqVO.getParamMap().entrySet()) {
|
|
|
|
|
|
|
|
String key = entry.getKey();
|
|
|
|
String key = entry.getKey();
|
|
|
|
// 去枚举里面去找
|
|
|
|
// 去枚举里面去找
|
|
|
|
RetireRoleEnum roleEnum = Arrays.stream(RetireRoleEnum.values()).filter(e -> e.getCode().equals(key)).findFirst().orElseThrow(() -> new BusinessException("未找到的参数"));
|
|
|
|
RetireRoleEnum roleEnum = Arrays.stream(RetireRoleEnum.values()).filter(e -> e.getCode().equals(key)).findFirst().orElseThrow(() -> new BusinessException("未找到的参数"));
|
|
|
@ -379,19 +382,27 @@ public class AskServiceImpl implements AskService {
|
|
|
|
Map<String, Integer> entityCountMap = sessionParamDTO.getEntityCountMap();
|
|
|
|
Map<String, Integer> entityCountMap = sessionParamDTO.getEntityCountMap();
|
|
|
|
// 如果包含,就去尝试排除路径
|
|
|
|
// 如果包含,就去尝试排除路径
|
|
|
|
if (entityCountMap.containsKey(roleEnum.getEntityEnum().getEntityType())) {
|
|
|
|
if (entityCountMap.containsKey(roleEnum.getEntityEnum().getEntityType())) {
|
|
|
|
filterPath(sessionParamDTO, entry.getValue());
|
|
|
|
filterPath(sessionParamDTO, String.valueOf(entry.getValue()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 在这里,判断是不是只生一个匹配的了,如果只剩一个匹配的了,就直接回复了,不需要再问了
|
|
|
|
// 排除之后,再看看是不是确定了
|
|
|
|
// 如果排除后只剩一个了,这时跳出多轮问答
|
|
|
|
|
|
|
|
if (sessionParamDTO.getWaitMatchItemLeafMap().size() == 1) {
|
|
|
|
if (sessionParamDTO.getWaitMatchItemLeafMap().size() == 1) {
|
|
|
|
sessionParamDTO.setMatchItemLeaf(sessionParamDTO.getWaitMatchItemLeafMap().values().iterator().next());
|
|
|
|
sessionParamDTO.setMatchItemLeaf(sessionParamDTO.getWaitMatchItemLeafMap().values().iterator().next());
|
|
|
|
redisTemplate.opsForValue().set(SESSION_PARAM + paramReqVO.getSessionId(), sessionParamDTO);
|
|
|
|
|
|
|
|
return afterMatchReturnAnswer(sessionParamDTO);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 缓存到Redis中
|
|
|
|
|
|
|
|
redisTemplate.opsForValue().set(SESSION_PARAM + sessionParamDTO.getSessionId(), sessionParamDTO);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public void saveUserParam(RoleSetReqVO paramReqVO) {
|
|
|
|
|
|
|
|
// 缓存到Redis中
|
|
|
|
|
|
|
|
if (CollUtil.isNotEmpty(paramReqVO.getParamMap()) && StrUtil.isNotBlank(paramReqVO.getSessionId())) {
|
|
|
|
|
|
|
|
redisTemplate.opsForValue().set(USER_PARAM + paramReqVO.getSessionId(), paramReqVO.getParamMap());
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|