作者 lixiang

智能助手bug修正

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
5 import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 5 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
6 import org.apache.ibatis.annotations.Mapper; 6 import org.apache.ibatis.annotations.Mapper;
7 import org.apache.ibatis.annotations.Param; 7 import org.apache.ibatis.annotations.Param;
  8 +import org.apache.ibatis.annotations.Select;
8 import org.jeecg.modules.airag.app.entity.QuestionEmbedding; 9 import org.jeecg.modules.airag.app.entity.QuestionEmbedding;
9 10
10 import java.util.List; 11 import java.util.List;
@@ -116,7 +116,9 @@ public class QuestionEmbeddingServiceImpl implements IQuestionEmbeddingService { @@ -116,7 +116,9 @@ public class QuestionEmbeddingServiceImpl implements IQuestionEmbeddingService {
116 @Override 116 @Override
117 public List<QuestionEmbedding> similaritySearchByQuestion(String question, int limit, Double minSimilarity, AiragChatsetting chatSetting) { 117 public List<QuestionEmbedding> similaritySearchByQuestion(String question, int limit, Double minSimilarity, AiragChatsetting chatSetting) {
118 Response<Embedding> embedding = aiModelUtils.getEmbedding(chatSetting.getEmbeddingId(), question); 118 Response<Embedding> embedding = aiModelUtils.getEmbedding(chatSetting.getEmbeddingId(), question);
119 - return questionEmbeddingMapper.similaritySearchByQuestion(embedding.content().vector(), limit, minSimilarity); 119 +
  120 +
  121 + return questionEmbeddingMapper.similaritySearchByQuestion(embedding.content().vector(), limit, 1-minSimilarity);
120 } 122 }
121 123
122 @Override 124 @Override
@@ -133,16 +133,24 @@ public class AiragResponseServiceImpl implements AiragResponseService { @@ -133,16 +133,24 @@ public class AiragResponseServiceImpl implements AiragResponseService {
133 * @param emitter 流式返回 133 * @param emitter 流式返回
134 * @param questionEmbedding 问题向量 134 * @param questionEmbedding 问题向量
135 */ 135 */
  136 + /**
  137 + * 发送token
  138 + * @param emitter 流式返回
  139 + * @param questionEmbedding 问题向量
  140 + */
136 private void sendQuestionEmbeddingResponse(SseEmitter emitter, QuestionEmbedding questionEmbedding) throws Exception { 141 private void sendQuestionEmbeddingResponse(SseEmitter emitter, QuestionEmbedding questionEmbedding) throws Exception {
137 ObjectMapper objectMapper = new ObjectMapper(); 142 ObjectMapper objectMapper = new ObjectMapper();
138 - 143 +
139 // 发送token 144 // 发送token
140 Map<String, String> data = new HashMap<>(); 145 Map<String, String> data = new HashMap<>();
141 data.put("token", questionEmbedding.getAnswer()); 146 data.put("token", questionEmbedding.getAnswer());
142 emitter.send(SseEmitter.event().data(objectMapper.writeValueAsString(data))); 147 emitter.send(SseEmitter.event().data(objectMapper.writeValueAsString(data)));
143 148
144 - // 发送END事件  
145 - Map<String, String> endData = createEndData(objectMapper.writeValueAsString(questionEmbedding.getMetadata()), String.valueOf(questionEmbedding.getSimilarity())); 149 + // 发送END事件(改为直接传Map)
  150 + Map<String, String> endData = createEndData(
  151 + questionEmbedding.getMetadata(),
  152 + String.valueOf(1 - questionEmbedding.getSimilarity())
  153 + );
146 emitter.send(SseEmitter.event().data(objectMapper.writeValueAsString(endData))); 154 emitter.send(SseEmitter.event().data(objectMapper.writeValueAsString(endData)));
147 emitter.complete(); 155 emitter.complete();
148 } 156 }
@@ -258,16 +266,34 @@ public class AiragResponseServiceImpl implements AiragResponseService { @@ -258,16 +266,34 @@ public class AiragResponseServiceImpl implements AiragResponseService {
258 * @param fileName 文件名称 266 * @param fileName 文件名称
259 * @param storedFileName 本地存储文件名称 267 * @param storedFileName 本地存储文件名称
260 */ 268 */
261 - private void processLLMResponse(SseEmitter emitter, AiragLog logRecord, String modelId,  
262 - String systemPrompt, String userPrompt,  
263 - Map<String, Object> firstMatch, String fileName, String storedFileName) { 269 + /**
  270 + * 对llm模型进行提问
  271 + * @param emitter 流式返回
  272 + * @param logRecord 日志对象
  273 + * @param modelId 模型id
  274 + * @param systemPrompt 系统提示词
  275 + * @param userPrompt 用户提示词
  276 + * @param firstMatch 最相似的数据
  277 + * @param fileName 文件名称
  278 + * @param storedFileName 本地存储文件名称
  279 + */
  280 + private void processLLMResponse(
  281 + SseEmitter emitter,
  282 + AiragLog logRecord,
  283 + String modelId,
  284 + String systemPrompt,
  285 + String userPrompt,
  286 + Map<String, Object> firstMatch,
  287 + String fileName,
  288 + String storedFileName
  289 + ) {
264 StringBuilder answerBuilder = new StringBuilder(); 290 StringBuilder answerBuilder = new StringBuilder();
265 List<ChatMessage> messages = new ArrayList<>(); 291 List<ChatMessage> messages = new ArrayList<>();
266 messages.add(new SystemMessage(systemPrompt)); 292 messages.add(new SystemMessage(systemPrompt));
267 messages.add(new UserMessage(userPrompt)); 293 messages.add(new UserMessage(userPrompt));
268 294
269 TokenStream tokenStream = aiChatHandler.chat(modelId, messages); 295 TokenStream tokenStream = aiChatHandler.chat(modelId, messages);
270 - 296 +
271 tokenStream.onNext(token -> { 297 tokenStream.onNext(token -> {
272 try { 298 try {
273 answerBuilder.append(token); 299 answerBuilder.append(token);
@@ -281,11 +307,17 @@ public class AiragResponseServiceImpl implements AiragResponseService { @@ -281,11 +307,17 @@ public class AiragResponseServiceImpl implements AiragResponseService {
281 307
282 tokenStream.onComplete(response -> { 308 tokenStream.onComplete(response -> {
283 try { 309 try {
284 - Map<String, String> endData = createEndData(firstMatch.get("metadata").toString(),  
285 - firstMatch.get("score").toString()); 310 + // 把metadata先转成Map
  311 + ObjectMapper objectMapper = new ObjectMapper();
  312 + Map<String, Object> metadata = objectMapper.readValue(firstMatch.get("metadata").toString(), Map.class);
  313 +
  314 + Map<String, String> endData = createEndData(
  315 + metadata,
  316 + firstMatch.get("score").toString()
  317 + );
286 endData.put("fileName", fileName); 318 endData.put("fileName", fileName);
287 endData.put("fileBase64", FileToBase64Util.fileToBase64(uploadPath + storedFileName)); 319 endData.put("fileBase64", FileToBase64Util.fileToBase64(uploadPath + storedFileName));
288 - 320 +
289 emitter.send(SseEmitter.event().data(new ObjectMapper().writeValueAsString(endData))); 321 emitter.send(SseEmitter.event().data(new ObjectMapper().writeValueAsString(endData)));
290 logRecord.setAnswer(answerBuilder.toString()).setAnswerType(2); 322 logRecord.setAnswer(answerBuilder.toString()).setAnswerType(2);
291 airagLogService.save(logRecord); 323 airagLogService.save(logRecord);
@@ -305,28 +337,32 @@ public class AiragResponseServiceImpl implements AiragResponseService { @@ -305,28 +337,32 @@ public class AiragResponseServiceImpl implements AiragResponseService {
305 tokenStream.start(); 337 tokenStream.start();
306 } 338 }
307 339
  340 +
308 /** 341 /**
309 * 创建结束标志,发送结束token 342 * 创建结束标志,发送结束token
310 * @param metadataJson 元数据 343 * @param metadataJson 元数据
311 * @param similarity 相似度 344 * @param similarity 相似度
312 */ 345 */
313 - private Map<String, String> createEndData(String metadataJson, String similarity) throws IOException { 346 + /**
  347 + * 创建结束标志,发送结束token
  348 + * @param metadata 元数据(直接Map)
  349 + * @param similarity 相似度
  350 + */
  351 + private Map<String, String> createEndData(Map<String, Object> metadata, String similarity) throws IOException {
314 Map<String, String> endData = new HashMap<>(); 352 Map<String, String> endData = new HashMap<>();
315 endData.put("event", "END"); 353 endData.put("event", "END");
316 endData.put("similarity", similarity); 354 endData.put("similarity", similarity);
317 -  
318 - if (StringUtils.isNotBlank(metadataJson)) {  
319 - ObjectMapper objectMapper = new ObjectMapper();  
320 - Map<String, String> metadata = objectMapper.readValue(metadataJson, Map.class);  
321 - String docName = metadata.get("docName"); 355 +
  356 + if (metadata != null && !metadata.isEmpty()) {
  357 + String docName = metadata.get("docName").toString();
322 endData.put("fileName", docName); 358 endData.put("fileName", docName);
323 -  
324 - String fileName = generateFilePath(metadataJson); 359 +
  360 + String fileName = metadata.get("storedFileName").toString();
325 if (StringUtils.isNotBlank(fileName)) { 361 if (StringUtils.isNotBlank(fileName)) {
326 endData.put("fileBase64", FileToBase64Util.fileToBase64(uploadPath + fileName)); 362 endData.put("fileBase64", FileToBase64Util.fileToBase64(uploadPath + fileName));
327 } 363 }
328 } 364 }
329 - 365 +
330 return endData; 366 return endData;
331 } 367 }
332 368