From 0aa11a5ec6dc526a5fbc9b6537e3f7b6f74b7efa Mon Sep 17 00:00:00 2001 From: wanghanlin <1533525126@qq.com> Date: Tue, 25 Aug 2026 17:52:09 +0800 Subject: [PATCH] =?UTF-8?q?fix(app):=20=E4=BF=AE=E5=A4=8D=E6=8E=A8?= =?UTF-8?q?=E8=8D=90=E9=97=AE=E9=A2=98=E6=98=BE=E7=A4=BA=E5=93=A8=E5=85=B5?= =?UTF-8?q?=E6=A0=87=E8=AE=B0=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SuggestionResponseParser 剥离旧版 ___SUGGESTIONS___ 哨兵标记,避免按行降级解析成垃圾条目;同步更新 suggestion_prompt 种子默认值,移除与新架构"只输出 JSON 数组"要求矛盾的哨兵文案 --- .../supportbot/app/SuggestionResponseParser.java | 9 +++++++++ .../wok/supportbot/config/DatabaseInitConfig.java | 14 +++----------- src/main/resources/init-database.sql | 12 +----------- 3 files changed, 13 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/wok/supportbot/app/SuggestionResponseParser.java b/src/main/java/com/wok/supportbot/app/SuggestionResponseParser.java index c9f4f01..dccae92 100644 --- a/src/main/java/com/wok/supportbot/app/SuggestionResponseParser.java +++ b/src/main/java/com/wok/supportbot/app/SuggestionResponseParser.java @@ -194,6 +194,15 @@ public final class SuggestionResponseParser { // 1. 尝试标准 JSON 解析 String trimmed = jsonPart.strip(); + // 剥离旧版哨兵标记(___SUGGESTIONS___ 及兼容大写变形),取哨兵后的 JSON 部分。 + // 旧版 suggestion_prompt 会要求模型输出哨兵,若未剥离会被按行降级解析成垃圾条目。 + int sentinelIdx = findSentinelIndex(trimmed); + if (sentinelIdx >= 0) { + int matchedLen = trimmed.startsWith(SENTINEL, sentinelIdx) + ? SENTINEL.length() + : LOOSE_SENTINEL.length(); + trimmed = trimmed.substring(sentinelIdx + matchedLen).strip(); + } // 去掉可能的 markdown 代码块包裹 trimmed = trimCodeBlock(trimmed); diff --git a/src/main/java/com/wok/supportbot/config/DatabaseInitConfig.java b/src/main/java/com/wok/supportbot/config/DatabaseInitConfig.java index 2cdde31..2f9122a 100644 --- a/src/main/java/com/wok/supportbot/config/DatabaseInitConfig.java +++ b/src/main/java/com/wok/supportbot/config/DatabaseInitConfig.java @@ -1384,18 +1384,10 @@ public class DatabaseInitConfig { """, "ai_system_prompt", "", "AI 对话全局系统提示词(为空则不注入;修改后即时生效,无需重启)"); // AI 推荐问题(suggest-message-list)种子数据 + // 格式要求由 SuggestionGenerator.buildPrompt 统一追加,此处仅提供基础文案, + // 不再要求模型输出 ___SUGGESTIONS___ 哨兵标记(避免与新架构"只输出 JSON 数组"要求矛盾)。 String defaultSuggestionPrompt = """ - 【推荐问题生成规则】 - 在回答正文结束后,请严格按以下格式生成 3 条用户可能继续追问的推荐问题: - - ___SUGGESTIONS___ - ["推荐问题1", "推荐问题2", "推荐问题3"] - - 要求: - 1. 推荐问题需与当前回答内容相关,覆盖用户可能关心的不同方面 - 2. 推荐问题是用户可直接点击发送的完整问题文本 - 3. 必须是合法的 JSON 字符串数组 - 4. ___SUGGESTIONS___ 是分隔标记,不要在回答正文中出现此标记 + 请根据历史对话,生成 3 条用户最可能继续提问的推荐问题。 """; jdbcTemplate.update(""" diff --git a/src/main/resources/init-database.sql b/src/main/resources/init-database.sql index 9a9fc2f..5ff61be 100644 --- a/src/main/resources/init-database.sql +++ b/src/main/resources/init-database.sql @@ -803,17 +803,7 @@ ON CONFLICT (config_key) DO NOTHING; INSERT INTO system_config (config_key, config_value, description) VALUES ('suggestion_prompt', - '【推荐问题生成规则】 -在回答正文结束后,请严格按以下格式生成 3 条用户可能继续追问的推荐问题: - -___SUGGESTIONS___ -["推荐问题1", "推荐问题2", "推荐问题3"] - -要求: -1. 推荐问题需与当前回答内容相关,覆盖用户可能关心的不同方面 -2. 推荐问题是用户可直接点击发送的完整问题文本 -3. 必须是合法的 JSON 字符串数组 -4. ___SUGGESTIONS___ 是分隔标记,不要在回答正文中出现此标记', + '请根据历史对话,生成 3 条用户最可能继续提问的推荐问题。', 'AI 推荐问题 Prompt 模板(仅在 suggestion_enabled=true 时生效)') ON CONFLICT (config_key) DO NOTHING;