|
|
|
@ -1,15 +1,14 @@
|
|
|
|
|
package com.supervision.util;
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
|
|
import com.supervision.domain.QaSimilarityQuestionAnswer;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.springframework.ai.document.Document;
|
|
|
|
|
import org.springframework.ai.vectorstore.RedisVectorStore;
|
|
|
|
|
import org.springframework.ai.vectorstore.SearchRequest;
|
|
|
|
|
import org.springframework.ai.vectorstore.filter.FilterExpressionBuilder;
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.Comparator;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Optional;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
|
|
@Slf4j
|
|
|
|
|
public class SimilarityUtil {
|
|
|
|
@ -28,18 +27,26 @@ public class SimilarityUtil {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 相似度比较,找出所有的
|
|
|
|
|
* 相似度比较,找到病历里面配置答案的问题
|
|
|
|
|
*
|
|
|
|
|
* @param question 问题
|
|
|
|
|
* @return 相似度最高的top10
|
|
|
|
|
* @param question 问题
|
|
|
|
|
* @param libraryQuestionIdList 配置答案的问题ID
|
|
|
|
|
* @return 匹配到的结果列表
|
|
|
|
|
*/
|
|
|
|
|
public static List<QaSimilarityQuestionAnswer> talkRedisVectorWithScore(String question) {
|
|
|
|
|
public static List<QaSimilarityQuestionAnswer> talkRedisVectorWithScore(String question, Collection<String> libraryQuestionIdList) {
|
|
|
|
|
log.info("开始调用talkQaSimilarity,问题:{}", question);
|
|
|
|
|
try {
|
|
|
|
|
// 走Redis向量库进行比较,找出最高的top10
|
|
|
|
|
List<Document> documents = redisVectorStore.similaritySearch(SearchRequest
|
|
|
|
|
|
|
|
|
|
SearchRequest searchRequest = SearchRequest
|
|
|
|
|
.query(question)
|
|
|
|
|
.withTopK(10));
|
|
|
|
|
.withTopK(10);
|
|
|
|
|
// 添加条件,只匹配对应标准问的问题
|
|
|
|
|
if (CollUtil.isNotEmpty(libraryQuestionIdList)) {
|
|
|
|
|
FilterExpressionBuilder b = new FilterExpressionBuilder();
|
|
|
|
|
searchRequest.withFilterExpression(b.in("libraryQuestionId", libraryQuestionIdList).build());
|
|
|
|
|
}
|
|
|
|
|
// 走Redis向量库进行比较,找出最高的top10
|
|
|
|
|
List<Document> documents = redisVectorStore.similaritySearch(searchRequest);
|
|
|
|
|
return documents.stream().map(document -> {
|
|
|
|
|
QaSimilarityQuestionAnswer qaSimilarityQuestionAnswer = new QaSimilarityQuestionAnswer();
|
|
|
|
|
qaSimilarityQuestionAnswer.setMatchQuestion(document.getContent());
|
|
|
|
@ -59,5 +66,15 @@ public class SimilarityUtil {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 相似度比较,找出所有的
|
|
|
|
|
*
|
|
|
|
|
* @param question 问题
|
|
|
|
|
* @return 相似度最高的top10
|
|
|
|
|
*/
|
|
|
|
|
public static List<QaSimilarityQuestionAnswer> talkRedisVectorWithScore(String question) {
|
|
|
|
|
return talkRedisVectorWithScore(question, null);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|