|
|
@@ -98,15 +98,23 @@ public class ChatController {
|
|
|
}
|
|
|
|
|
|
String intent = retrieverService.classifyIntent(query);
|
|
|
- List<Map<String, Object>> docs = retrieverService.search(query, intent, 20);
|
|
|
- docs = rerankerService.rerank(docs, query, 5);
|
|
|
+ List<Map<String, Object>> docs;
|
|
|
+ String llmAnswer;
|
|
|
+ List<Map<String, Object>> sources;
|
|
|
+ try {
|
|
|
+ docs = retrieverService.search(query, intent, 20);
|
|
|
+ docs = rerankerService.rerank(docs, query, 5);
|
|
|
|
|
|
- // 统一:LLM 回答 + 原文对照
|
|
|
- List<Map<String, String>> messages = promptService.buildPrompt(query, docs, intent);
|
|
|
- String llmAnswer = cleanAnswer(llmService.chat(messages));
|
|
|
+ // 统一:LLM 回答 + 原文对照
|
|
|
+ List<Map<String, String>> messages = promptService.buildPrompt(query, docs, intent);
|
|
|
+ llmAnswer = cleanAnswer(llmService.chat(messages));
|
|
|
+ sources = buildSources(docs);
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 异常时清除 PENDING 标记,避免后续同问题请求被锁死
|
|
|
+ qaCache.removePending(normalized);
|
|
|
+ throw e;
|
|
|
+ }
|
|
|
String answer = llmAnswer;
|
|
|
-
|
|
|
- List<Map<String, Object>> sources = buildSources(docs);
|
|
|
persistenceService.saveMessage(userKey, cid, "user", query, intent, null);
|
|
|
persistenceService.saveMessage(userKey, cid, "assistant", answer, intent, sources);
|
|
|
|
|
|
@@ -178,12 +186,16 @@ public class ChatController {
|
|
|
persistenceService.saveMessage(userKey, cid, "user", query, intent, null);
|
|
|
persistenceService.saveMessage(userKey, cid, "assistant", finalAnswer, intent, sources);
|
|
|
|
|
|
- // 写入全局缓存
|
|
|
+ // 写入全局缓存 + 清除 PENDING 标记
|
|
|
qaCache.put(normalized, finalAnswer, intent, sources);
|
|
|
|
|
|
sink.tryEmitComplete();
|
|
|
})
|
|
|
- .doOnError(sink::tryEmitError)
|
|
|
+ .doOnError(e -> {
|
|
|
+ // 异常时清除 PENDING 标记,避免后续同问题请求被锁死
|
|
|
+ qaCache.removePending(normalized);
|
|
|
+ sink.tryEmitError(e);
|
|
|
+ })
|
|
|
.subscribe();
|
|
|
|
|
|
return sink.asFlux();
|