diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/ChatController.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/ChatController.java index 693f3cd..25273ad 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/ChatController.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/ChatController.java @@ -6,6 +6,7 @@ import com.alibaba.fastjson2.JSONObject; import com.ruoyi.cms.domain.ai.AiChatHistory; import com.ruoyi.cms.domain.chat.ChatRequest; import com.ruoyi.cms.service.AiChatHistoryService; +import com.ruoyi.cms.util.ChatTextCleanUtil; import com.ruoyi.common.annotation.BussinessLog; import com.ruoyi.cms.config.ChatClient; import com.ruoyi.cms.config.ChatConfig; @@ -177,6 +178,8 @@ public class ChatController extends BaseController { JSONArray array = aiChatHistoryService.getChatHistoryData(request.getSessionId()); request.setMessages(array); String result = chatClient.sendChatGuest(request); + //去除思维链 + result = ChatTextCleanUtil.removeThinkChain(result); try { String[] strList = result.split("?"); List list = new ArrayList<>(); diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/ChatTextCleanUtil.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/ChatTextCleanUtil.java new file mode 100644 index 0000000..26d7363 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/ChatTextCleanUtil.java @@ -0,0 +1,100 @@ +package com.ruoyi.cms.util; + +import org.springframework.util.StringUtils; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 文本内容清理工具类:移除思维链、提取有效业务文本 + * 核心能力: + * 1. 优先提取 标签内的有效文本(自动剔除标签外的思维链) + * 2. 无 file_upload 标签时,移除 标签及内部的思维链 + * 3. 统一清理文本格式(多余换行/空格、末尾问号) + */ +public class ChatTextCleanUtil { + + // 正则常量:匹配 标签及内部内容(提取标签内文本) + private static final String PATTERN_FILE_UPLOAD = "\\(.*?)\\"; + // 正则常量:匹配 标签及内部的思维链内容 + private static final String PATTERN_THINK_CHAIN = "\\.*?\\"; + // 正则常量:匹配多个换行符 + private static final String PATTERN_MULTI_NEWLINE = "\\n+"; + // 正则常量:匹配多个空白字符(空格/制表符等) + private static final String PATTERN_MULTI_SPACE = "\\s+"; + // 正则常量:匹配末尾的问号 + private static final String PATTERN_TRAILING_QUESTION = "\\?$"; + + /** + * 清理文本中的思维链,提取有效业务内容 + * + * @param content 原始文本内容(可能包含思维链、file_upload标签等) + * @return 清理后的纯业务文本,空值/空文本返回原内容 + */ + public static String removeThinkChain(String content) { + // 空值/空文本直接返回,避免后续处理 + if (!StringUtils.hasText(content)) { + return content; + } + + // 提取有效文本(优先处理file_upload标签) + String validContent = extractFileUploadContent(content); + // 若未提取到file_upload内容,移除think标签的思维链 + if (!StringUtils.hasText(validContent)) { + validContent = cleanThinkChainContent(content); + } + + // 统一格式化文本(清理多余换行/空格、末尾问号) + return formatText(validContent); + } + + /** + * 提取 标签内的文本内容 + * + * @param content 原始文本 + * @return 标签内的文本(无标签返回空字符串) + */ + private static String extractFileUploadContent(String content) { + Pattern pattern = Pattern.compile(PATTERN_FILE_UPLOAD, Pattern.DOTALL); + Matcher matcher = pattern.matcher(content); + if (matcher.find()) { + // 提取分组1的内容(标签内文本)并去除首尾空格 + return matcher.group(1).trim(); + } + return ""; + } + + /** + * 移除 标签及内部的思维链内容 + * + * @param content 原始文本 + * @return 移除思维链后的文本,空值返回空字符串 + */ + private static String cleanThinkChainContent(String content) { + if (!StringUtils.hasText(content)) { + return ""; + } + Pattern pattern = Pattern.compile(PATTERN_THINK_CHAIN, Pattern.DOTALL); + // 替换think标签及内容为空,再去除首尾空格 + return pattern.matcher(content).replaceAll("").trim(); + } + + /** + * 格式化文本:清理多余换行、空格,移除末尾问号 + * + * @param content 需要格式化的文本 + * @return 格式化后的文本,空值返回空字符串 + */ + private static String formatText(String content) { + if (!StringUtils.hasText(content)) { + return ""; + } + // 多个换行符替换为单个空格 + String formatted = content.replaceAll(PATTERN_MULTI_NEWLINE, " "); + //多个空白字符替换为单个空格 + formatted = formatted.replaceAll(PATTERN_MULTI_SPACE, " "); + //移除末尾的问号 + formatted = formatted.replaceAll(PATTERN_TRAILING_QUESTION, ""); + //最终再trim一次,确保无首尾空格 + return formatted.trim(); + } +} \ No newline at end of file