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

100 lines
3.9 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();
}
}