|
@@ -61,8 +61,7 @@ public class ChatController {
|
|
|
// 统一:LLM 回答 + 原文对照
|
|
// 统一:LLM 回答 + 原文对照
|
|
|
List<Map<String, String>> messages = promptService.buildPrompt(query, docs, intent);
|
|
List<Map<String, String>> messages = promptService.buildPrompt(query, docs, intent);
|
|
|
String llmAnswer = cleanAnswer(llmService.chat(messages));
|
|
String llmAnswer = cleanAnswer(llmService.chat(messages));
|
|
|
- String sourceText = buildSourceQuote(docs);
|
|
|
|
|
- String answer = llmAnswer + sourceText;
|
|
|
|
|
|
|
+ String answer = llmAnswer;
|
|
|
|
|
|
|
|
List<Map<String, Object>> sources = buildSources(docs);
|
|
List<Map<String, Object>> sources = buildSources(docs);
|
|
|
persistenceService.saveMessage(cid, "user", query, intent, null);
|
|
persistenceService.saveMessage(cid, "user", query, intent, null);
|
|
@@ -102,10 +101,6 @@ public class ChatController {
|
|
|
sink.tryEmitNext(ServerSentEvent.<String>builder().data(token).build());
|
|
sink.tryEmitNext(ServerSentEvent.<String>builder().data(token).build());
|
|
|
})
|
|
})
|
|
|
.doOnComplete(() -> {
|
|
.doOnComplete(() -> {
|
|
|
- // 附加原文参考
|
|
|
|
|
- String sourceQuote = buildSourceQuote(docs);
|
|
|
|
|
- sink.tryEmitNext(ServerSentEvent.<String>builder().data(sourceQuote).build());
|
|
|
|
|
-
|
|
|
|
|
final List<Map<String, Object>> sources = buildSources(docs);
|
|
final List<Map<String, Object>> sources = buildSources(docs);
|
|
|
try {
|
|
try {
|
|
|
String meta = new com.fasterxml.jackson.databind.ObjectMapper().writeValueAsString(Map.of(
|
|
String meta = new com.fasterxml.jackson.databind.ObjectMapper().writeValueAsString(Map.of(
|
|
@@ -116,7 +111,7 @@ public class ChatController {
|
|
|
sink.tryEmitNext(ServerSentEvent.<String>builder().event("meta").data(meta).build());
|
|
sink.tryEmitNext(ServerSentEvent.<String>builder().event("meta").data(meta).build());
|
|
|
} catch (Exception ignored) {}
|
|
} catch (Exception ignored) {}
|
|
|
|
|
|
|
|
- String finalAnswer = cleanAnswer(fullAnswer.toString()) + sourceQuote;
|
|
|
|
|
|
|
+ String finalAnswer = cleanAnswer(fullAnswer.toString());
|
|
|
persistenceService.saveMessage(cid, "user", query, intent, null);
|
|
persistenceService.saveMessage(cid, "user", query, intent, null);
|
|
|
persistenceService.saveMessage(cid, "assistant", finalAnswer, intent, sources);
|
|
persistenceService.saveMessage(cid, "assistant", finalAnswer, intent, sources);
|
|
|
sink.tryEmitComplete();
|
|
sink.tryEmitComplete();
|
|
@@ -160,8 +155,7 @@ public class ChatController {
|
|
|
messages.get(0).put("content", messages.get(0).get("content") + imageContext);
|
|
messages.get(0).put("content", messages.get(0).get("content") + imageContext);
|
|
|
|
|
|
|
|
String llmAnswer = cleanAnswer(llmService.chat(messages, true));
|
|
String llmAnswer = cleanAnswer(llmService.chat(messages, true));
|
|
|
- String sourceText = buildSourceQuote(docs);
|
|
|
|
|
- String answer = llmAnswer + sourceText;
|
|
|
|
|
|
|
+ String answer = llmAnswer;
|
|
|
|
|
|
|
|
List<Map<String, Object>> sources = buildSources(docs);
|
|
List<Map<String, Object>> sources = buildSources(docs);
|
|
|
persistenceService.saveMessage(cid, "user",
|
|
persistenceService.saveMessage(cid, "user",
|
|
@@ -220,9 +214,7 @@ public class ChatController {
|
|
|
sink.tryEmitNext(ServerSentEvent.<String>builder().data(token).build());
|
|
sink.tryEmitNext(ServerSentEvent.<String>builder().data(token).build());
|
|
|
})
|
|
})
|
|
|
.doOnComplete(() -> {
|
|
.doOnComplete(() -> {
|
|
|
- String sourceQuote = buildSourceQuote(docs);
|
|
|
|
|
- sink.tryEmitNext(ServerSentEvent.<String>builder().data(sourceQuote).build());
|
|
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
final List<Map<String, Object>> sources = buildSources(docs);
|
|
final List<Map<String, Object>> sources = buildSources(docs);
|
|
|
try {
|
|
try {
|
|
|
String meta = new com.fasterxml.jackson.databind.ObjectMapper().writeValueAsString(Map.of(
|
|
String meta = new com.fasterxml.jackson.databind.ObjectMapper().writeValueAsString(Map.of(
|
|
@@ -234,7 +226,7 @@ public class ChatController {
|
|
|
sink.tryEmitNext(ServerSentEvent.<String>builder().event("meta").data(meta).build());
|
|
sink.tryEmitNext(ServerSentEvent.<String>builder().event("meta").data(meta).build());
|
|
|
} catch (Exception ignored) {}
|
|
} catch (Exception ignored) {}
|
|
|
|
|
|
|
|
- String finalAnswer = cleanAnswer(fullAnswer.toString()) + sourceQuote;
|
|
|
|
|
|
|
+ String finalAnswer = cleanAnswer(fullAnswer.toString());
|
|
|
persistenceService.saveMessage(cid, "user",
|
|
persistenceService.saveMessage(cid, "user",
|
|
|
request.getMessage().isBlank() ? "[图片]" : "[图片] " + request.getMessage(),
|
|
request.getMessage().isBlank() ? "[图片]" : "[图片] " + request.getMessage(),
|
|
|
intent, null);
|
|
intent, null);
|
|
@@ -298,8 +290,7 @@ public class ChatController {
|
|
|
|
|
|
|
|
boolean enableSearch = !ocrText.isEmpty() || props.isEnableWebSearch();
|
|
boolean enableSearch = !ocrText.isEmpty() || props.isEnableWebSearch();
|
|
|
String llmAnswer = cleanAnswer(llmService.chat(messages, enableSearch));
|
|
String llmAnswer = cleanAnswer(llmService.chat(messages, enableSearch));
|
|
|
- String sourceText = buildSourceQuote(docs);
|
|
|
|
|
- String answer = llmAnswer + sourceText;
|
|
|
|
|
|
|
+ String answer = llmAnswer;
|
|
|
|
|
|
|
|
List<Map<String, Object>> sources = buildSources(docs);
|
|
List<Map<String, Object>> sources = buildSources(docs);
|
|
|
String userMsg = !request.getMessage().isBlank() ? request.getMessage()
|
|
String userMsg = !request.getMessage().isBlank() ? request.getMessage()
|
|
@@ -485,8 +476,6 @@ public class ChatController {
|
|
|
sink.tryEmitNext(ServerSentEvent.<String>builder().data(token).build());
|
|
sink.tryEmitNext(ServerSentEvent.<String>builder().data(token).build());
|
|
|
})
|
|
})
|
|
|
.doOnComplete(() -> {
|
|
.doOnComplete(() -> {
|
|
|
- String sourceQuote = buildSourceQuote(docs);
|
|
|
|
|
- sink.tryEmitNext(ServerSentEvent.<String>builder().data(sourceQuote).build());
|
|
|
|
|
final List<Map<String, Object>> sources = buildSources(docs);
|
|
final List<Map<String, Object>> sources = buildSources(docs);
|
|
|
try {
|
|
try {
|
|
|
String meta = new com.fasterxml.jackson.databind.ObjectMapper().writeValueAsString(Map.of(
|
|
String meta = new com.fasterxml.jackson.databind.ObjectMapper().writeValueAsString(Map.of(
|
|
@@ -494,7 +483,7 @@ public class ChatController {
|
|
|
"ocr_text", ocrText.length() > 200 ? ocrText.substring(0, 200) : ocrText));
|
|
"ocr_text", ocrText.length() > 200 ? ocrText.substring(0, 200) : ocrText));
|
|
|
sink.tryEmitNext(ServerSentEvent.<String>builder().event("meta").data(meta).build());
|
|
sink.tryEmitNext(ServerSentEvent.<String>builder().event("meta").data(meta).build());
|
|
|
} catch (Exception ignored) {}
|
|
} catch (Exception ignored) {}
|
|
|
- String finalAnswer = cleanAnswer(fullAnswer.toString()) + sourceQuote;
|
|
|
|
|
|
|
+ String finalAnswer = cleanAnswer(fullAnswer.toString());
|
|
|
String userMsg = !request.getMessage().isBlank() ? request.getMessage()
|
|
String userMsg = !request.getMessage().isBlank() ? request.getMessage()
|
|
|
: !ocrText.isEmpty() ? "[" + mediaLabel + "]" : "";
|
|
: !ocrText.isEmpty() ? "[" + mediaLabel + "]" : "";
|
|
|
persistenceService.saveMessage(cid, "user", userMsg, intent, null);
|
|
persistenceService.saveMessage(cid, "user", userMsg, intent, null);
|
|
@@ -613,28 +602,6 @@ public class ChatController {
|
|
|
.collect(Collectors.toList());
|
|
.collect(Collectors.toList());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /** 从检索结果提取精简原文,附在 LLM 回答后面作为验证 */
|
|
|
|
|
- private String buildSourceQuote(List<Map<String, Object>> docs) {
|
|
|
|
|
- StringBuilder sb = new StringBuilder();
|
|
|
|
|
- sb.append("\n\n\n——— 原文参考 ———\n");
|
|
|
|
|
- int count = 0;
|
|
|
|
|
- for (Map<String, Object> d : docs) {
|
|
|
|
|
- if (count >= 2) break;
|
|
|
|
|
- String content = (String) d.getOrDefault("content", "");
|
|
|
|
|
- if (content == null || content.isEmpty()) continue;
|
|
|
|
|
- // 精简:去来源行,截断到 200 字
|
|
|
|
|
- content = content.replaceAll("\\s*来源:.*$", "").trim();
|
|
|
|
|
- if (content.length() > 200) {
|
|
|
|
|
- int cut = content.lastIndexOf('。', 200);
|
|
|
|
|
- if (cut < 100) cut = 200;
|
|
|
|
|
- content = content.substring(0, cut + 1);
|
|
|
|
|
- }
|
|
|
|
|
- sb.append(content).append("\n");
|
|
|
|
|
- count++;
|
|
|
|
|
- }
|
|
|
|
|
- return sb.toString();
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
private String extractDrugName(String content) {
|
|
private String extractDrugName(String content) {
|
|
|
if (content == null) return "";
|
|
if (content == null) return "";
|
|
|
int start = content.indexOf("【");
|
|
int start = content.indexOf("【");
|