Files
ks/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/ChatTextCleanUtil.java

100 lines
3.9 KiB
Java
Raw Normal View History

package com.ruoyi.cms.util;
import org.springframework.util.StringUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 文本内容清理工具类移除思维链提取有效业务文本
* 核心能力
* 1. 优先提取 <file_upload> 标签内的有效文本自动剔除标签外的思维链
* 2. file_upload 标签时移除 标签及内部的思维链
* 3. 统一清理文本格式多余换行/空格末尾问号
*/
public class ChatTextCleanUtil {
// 正则常量:匹配 <file_upload> 标签及内部内容(提取标签内文本)
private static final String PATTERN_FILE_UPLOAD = "\\<file_upload\\>(.*?)\\</file_upload\\>";
// 正则常量:匹配 标签及内部的思维链内容
private static final String PATTERN_THINK_CHAIN = "\\<think\\>.*?\\</think\\>";
// 正则常量:匹配多个换行符
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);
}
/**
* 提取 <file_upload> 标签内的文本内容
*
* @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();
}
}