From 081758128c34cc0edff61b41aa7101194aad808a Mon Sep 17 00:00:00 2001
From: wanghanlin <1533525126@qq.com>
Date: Wed, 26 Aug 2026 15:05:15 +0800
Subject: [PATCH] =?UTF-8?q?fix(app):=20=E4=BF=AE=E5=A4=8D=E5=88=87?=
=?UTF-8?q?=E6=8D=A2=E4=BC=9A=E8=AF=9D=E5=90=8E=E7=94=A8=E6=88=B7=E6=8F=90?=
=?UTF-8?q?=E9=97=AE=E8=A2=AB=E6=9F=A5=E8=AF=A2=E9=87=8D=E5=86=99=E7=BB=93?=
=?UTF-8?q?=E6=9E=9C=E8=A6=86=E7=9B=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
RAG 查询重写(REWRITE 等策略)的润色产物被当作用户消息落库到
chat_message 会话记忆表,导致 ChatSDK 切换角色/对话后前端拉取
历史显示的是润色版而非原始提问。
ChatPipeline 在 RAG 分支将 finalMessage 由 rag.rewrittenQuery()
改为 ctx.message(),使查询重写仅服务于检索,用户消息(传给模型、
落库、前端展示)统一为原始提问。
---
src/main/java/com/wok/supportbot/app/ChatPipeline.java | 6 +++---
src/main/java/com/wok/supportbot/app/ChatRequest.java | 2 +-
src/main/java/com/wok/supportbot/rag/RagContext.java | 4 ++--
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/main/java/com/wok/supportbot/app/ChatPipeline.java b/src/main/java/com/wok/supportbot/app/ChatPipeline.java
index cfdca77..9c7b792 100644
--- a/src/main/java/com/wok/supportbot/app/ChatPipeline.java
+++ b/src/main/java/com/wok/supportbot/app/ChatPipeline.java
@@ -66,7 +66,7 @@ public class ChatPipeline {
*
未启用 RAG(普通对话 / 严格隔离下 KB 拒绝)→ 用原始 message、基础 system
* 寒暄/闲聊(IntentRouter 或寒暄词命中)→ 同上,跳过 KB 检索
* FAQ 命中 → 直接返回标准答案,不调用 ChatClient
- * RAG 生成 → 资料块注入 system,重写后查询作为 user 消息
+ * RAG 生成 → 资料块注入 system,原始 message 作为 user 消息(重写查询仅用于检索)
*
*
* @param ctx 对话上下文
@@ -128,9 +128,9 @@ public class ChatPipeline {
globalPrompt, null, null, "FAQ", null, null, rag.faqMatchResult());
}
- // RAG 生成:资料块注入 system,重写后查询作为 user 消息
+ // RAG 生成:资料块注入 system,原始 message 作为 user 消息(重写查询仅用于检索)
String finalSystem = baseSystem + ragPipeline.buildRagContextBlock(rag.contextText());
- return new ChatRequest(ctx, rag.rewrittenQuery(), finalSystem, Optional.empty(),
+ return new ChatRequest(ctx, ctx.message(), finalSystem, Optional.empty(),
globalPrompt, rag.contextText(), rag.documents() != null ? rag.documents().size() : 0, "RAG",
rag.searchMode(), rag.documents(), null);
}
diff --git a/src/main/java/com/wok/supportbot/app/ChatRequest.java b/src/main/java/com/wok/supportbot/app/ChatRequest.java
index 14b3610..c83287e 100644
--- a/src/main/java/com/wok/supportbot/app/ChatRequest.java
+++ b/src/main/java/com/wok/supportbot/app/ChatRequest.java
@@ -15,7 +15,7 @@ import java.util.Optional;
* 字段含义:
*
* - {@link #faqAnswer()}:FAQ 命中时直接返回标准答案,跳过 ChatClient 调用
- * - {@link #finalMessage()}:传给模型的用户消息(RAG 场景为重写后的查询,否则为原始 message)
+ * - {@link #finalMessage()}:传给模型的用户消息(始终为原始 message,查询重写仅用于检索)
* - {@link #finalSystemPrompt()}:传给模型的系统提示词(角色人设 + RAG 资料块),可为空
* - {@link #globalPrompt()}:全局提示词快照(来自 system_config.ai_system_prompt),可为空
* - {@link #ragContextText()}:RAG 资料块文本(未注入时为空/null)
diff --git a/src/main/java/com/wok/supportbot/rag/RagContext.java b/src/main/java/com/wok/supportbot/rag/RagContext.java
index 5a982a2..c651287 100644
--- a/src/main/java/com/wok/supportbot/rag/RagContext.java
+++ b/src/main/java/com/wok/supportbot/rag/RagContext.java
@@ -13,13 +13,13 @@ import java.util.Optional;
*
* - {@link #faqAnswer()} 命中 → 直接返回标准答案,跳过生成
* - 未命中 → 用 {@link #documents()} 展示引用来源,用 {@link #contextText()} 注入系统提示词,
- * 用 {@link #rewrittenQuery()} 作为传给模型的用户消息
+ * {@link #rewrittenQuery()} 仅用于检索,不作为传给模型的用户消息
*
*
* @param faqAnswer FAQ 命中的标准答案;未命中为 {@link Optional#empty()}
* @param documents 检索命中的知识库片段(含 metadata),可为空
* @param contextText 拼接后的资料文本(用 {@code "\n\n---\n\n"} 分隔);无资料时为空串
- * @param rewrittenQuery 传给模型的用户消息:MULTI_QUERY 为原始 message,其余策略为重写后的查询
+ * @param rewrittenQuery 检索用的改写查询(MULTI_QUERY 为原始 message,其余策略为重写后的查询),仅用于检索,不作为用户消息
* @param searchMode 真实检索模式(VECTOR / KEYWORD / HYBRID),当前主管道固定为 VECTOR
* @param faqMatchResult FAQ 命中详情(含 matchType/score);未命中为 null
*/