作者 lixiang

智能助手bug修正

... ... @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.jeecg.modules.airag.app.entity.QuestionEmbedding;
import java.util.List;
... ...
... ... @@ -116,7 +116,9 @@ public class QuestionEmbeddingServiceImpl implements IQuestionEmbeddingService {
@Override
public List<QuestionEmbedding> similaritySearchByQuestion(String question, int limit, Double minSimilarity, AiragChatsetting chatSetting) {
Response<Embedding> embedding = aiModelUtils.getEmbedding(chatSetting.getEmbeddingId(), question);
return questionEmbeddingMapper.similaritySearchByQuestion(embedding.content().vector(), limit, minSimilarity);
return questionEmbeddingMapper.similaritySearchByQuestion(embedding.content().vector(), limit, 1-minSimilarity);
}
@Override
... ...
... ... @@ -133,16 +133,24 @@ public class AiragResponseServiceImpl implements AiragResponseService {
* @param emitter 流式返回
* @param questionEmbedding 问题向量
*/
/**
* 发送token
* @param emitter 流式返回
* @param questionEmbedding 问题向量
*/
private void sendQuestionEmbeddingResponse(SseEmitter emitter, QuestionEmbedding questionEmbedding) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
// 发送token
Map<String, String> data = new HashMap<>();
data.put("token", questionEmbedding.getAnswer());
emitter.send(SseEmitter.event().data(objectMapper.writeValueAsString(data)));
// 发送END事件
Map<String, String> endData = createEndData(objectMapper.writeValueAsString(questionEmbedding.getMetadata()), String.valueOf(questionEmbedding.getSimilarity()));
// 发送END事件(改为直接传Map)
Map<String, String> endData = createEndData(
questionEmbedding.getMetadata(),
String.valueOf(1 - questionEmbedding.getSimilarity())
);
emitter.send(SseEmitter.event().data(objectMapper.writeValueAsString(endData)));
emitter.complete();
}
... ... @@ -258,16 +266,34 @@ public class AiragResponseServiceImpl implements AiragResponseService {
* @param fileName 文件名称
* @param storedFileName 本地存储文件名称
*/
private void processLLMResponse(SseEmitter emitter, AiragLog logRecord, String modelId,
String systemPrompt, String userPrompt,
Map<String, Object> firstMatch, String fileName, String storedFileName) {
/**
* 对llm模型进行提问
* @param emitter 流式返回
* @param logRecord 日志对象
* @param modelId 模型id
* @param systemPrompt 系统提示词
* @param userPrompt 用户提示词
* @param firstMatch 最相似的数据
* @param fileName 文件名称
* @param storedFileName 本地存储文件名称
*/
private void processLLMResponse(
SseEmitter emitter,
AiragLog logRecord,
String modelId,
String systemPrompt,
String userPrompt,
Map<String, Object> firstMatch,
String fileName,
String storedFileName
) {
StringBuilder answerBuilder = new StringBuilder();
List<ChatMessage> messages = new ArrayList<>();
messages.add(new SystemMessage(systemPrompt));
messages.add(new UserMessage(userPrompt));
TokenStream tokenStream = aiChatHandler.chat(modelId, messages);
tokenStream.onNext(token -> {
try {
answerBuilder.append(token);
... ... @@ -281,11 +307,17 @@ public class AiragResponseServiceImpl implements AiragResponseService {
tokenStream.onComplete(response -> {
try {
Map<String, String> endData = createEndData(firstMatch.get("metadata").toString(),
firstMatch.get("score").toString());
// 把metadata先转成Map
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> metadata = objectMapper.readValue(firstMatch.get("metadata").toString(), Map.class);
Map<String, String> endData = createEndData(
metadata,
firstMatch.get("score").toString()
);
endData.put("fileName", fileName);
endData.put("fileBase64", FileToBase64Util.fileToBase64(uploadPath + storedFileName));
emitter.send(SseEmitter.event().data(new ObjectMapper().writeValueAsString(endData)));
logRecord.setAnswer(answerBuilder.toString()).setAnswerType(2);
airagLogService.save(logRecord);
... ... @@ -305,28 +337,32 @@ public class AiragResponseServiceImpl implements AiragResponseService {
tokenStream.start();
}
/**
* 创建结束标志,发送结束token
* @param metadataJson 元数据
* @param similarity 相似度
*/
private Map<String, String> createEndData(String metadataJson, String similarity) throws IOException {
/**
* 创建结束标志,发送结束token
* @param metadata 元数据(直接Map)
* @param similarity 相似度
*/
private Map<String, String> createEndData(Map<String, Object> metadata, String similarity) throws IOException {
Map<String, String> endData = new HashMap<>();
endData.put("event", "END");
endData.put("similarity", similarity);
if (StringUtils.isNotBlank(metadataJson)) {
ObjectMapper objectMapper = new ObjectMapper();
Map<String, String> metadata = objectMapper.readValue(metadataJson, Map.class);
String docName = metadata.get("docName");
if (metadata != null && !metadata.isEmpty()) {
String docName = metadata.get("docName").toString();
endData.put("fileName", docName);
String fileName = generateFilePath(metadataJson);
String fileName = metadata.get("storedFileName").toString();
if (StringUtils.isNotBlank(fileName)) {
endData.put("fileBase64", FileToBase64Util.fileToBase64(uploadPath + fileName));
}
}
return endData;
}
... ...