优化得分项
parent
d7d7e2e5d3
commit
dfcd836ba5
@ -0,0 +1,22 @@
|
||||
package com.supervision.domain;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class QaSimilarityQuestionAnswer {
|
||||
|
||||
/**
|
||||
* 匹配到的问题
|
||||
*/
|
||||
private String matchQuestion;
|
||||
|
||||
/**
|
||||
* 匹配到的问题ID
|
||||
*/
|
||||
private String matchQuestionCode;
|
||||
|
||||
/**
|
||||
* cosine余弦得分,一般0.5以上匹配度就比较高了
|
||||
*/
|
||||
private Double matchScore;
|
||||
}
|
@ -0,0 +1,56 @@
|
||||
package com.supervision.util;
|
||||
|
||||
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 java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
@Slf4j
|
||||
public class SimilarityUtil {
|
||||
|
||||
private static final RedisVectorStore redisVectorStore = SpringBeanUtil.getBean(RedisVectorStore.class);
|
||||
|
||||
/**
|
||||
* 相似度比较,只找最高的
|
||||
*
|
||||
* @param question 问题
|
||||
* @return 最高的TOP
|
||||
*/
|
||||
public static Optional<QaSimilarityQuestionAnswer> talkRedisVectorWithScoreByFirst(String question) {
|
||||
List<QaSimilarityQuestionAnswer> qaSimilarityQuestionAnswers = talkRedisVectorWithScore(question);
|
||||
return qaSimilarityQuestionAnswers.stream().findFirst();
|
||||
}
|
||||
|
||||
/**
|
||||
* 相似度比较,找出所有的
|
||||
*
|
||||
* @param question 问题
|
||||
* @return 相似度最高的top10
|
||||
*/
|
||||
public static List<QaSimilarityQuestionAnswer> talkRedisVectorWithScore(String question) {
|
||||
log.info("开始调用talkQaSimilarity,问题:{}", question);
|
||||
try {
|
||||
// 走Redis向量库进行比较,找出最高的top10
|
||||
List<Document> documents = redisVectorStore.similaritySearch(SearchRequest
|
||||
.query(question)
|
||||
.withTopK(10));
|
||||
return documents.stream().map(document -> {
|
||||
QaSimilarityQuestionAnswer qaSimilarityQuestionAnswer = new QaSimilarityQuestionAnswer();
|
||||
qaSimilarityQuestionAnswer.setMatchQuestion(document.getContent());
|
||||
qaSimilarityQuestionAnswer.setMatchQuestionCode(String.valueOf(document.getMetadata().get("standardQuestionId")));
|
||||
qaSimilarityQuestionAnswer.setMatchScore(Double.parseDouble(String.valueOf(document.getMetadata().get("vector_score"))));
|
||||
return qaSimilarityQuestionAnswer;
|
||||
// 排序,降序,取最高的
|
||||
}).sorted(Comparator.comparing(QaSimilarityQuestionAnswer::getMatchScore).reversed()).toList();
|
||||
} catch (Exception e) {
|
||||
log.error("调用talkQaSimilarity error ", e);
|
||||
return new ArrayList<>();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
package com.supervision.pojo.qaSimilarity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class QaSimilarityQuestionAnswer {
|
||||
|
||||
private String matchQuestion;
|
||||
|
||||
private String matchQuestionCode;
|
||||
|
||||
private Double matchScore;
|
||||
}
|
Loading…
Reference in New Issue