添加/app/chat/guest 接口去除思维链
This commit is contained in:
@@ -6,6 +6,7 @@ import com.alibaba.fastjson2.JSONObject;
|
|||||||
import com.ruoyi.cms.domain.ai.AiChatHistory;
|
import com.ruoyi.cms.domain.ai.AiChatHistory;
|
||||||
import com.ruoyi.cms.domain.chat.ChatRequest;
|
import com.ruoyi.cms.domain.chat.ChatRequest;
|
||||||
import com.ruoyi.cms.service.AiChatHistoryService;
|
import com.ruoyi.cms.service.AiChatHistoryService;
|
||||||
|
import com.ruoyi.cms.util.ChatTextCleanUtil;
|
||||||
import com.ruoyi.common.annotation.BussinessLog;
|
import com.ruoyi.common.annotation.BussinessLog;
|
||||||
import com.ruoyi.cms.config.ChatClient;
|
import com.ruoyi.cms.config.ChatClient;
|
||||||
import com.ruoyi.cms.config.ChatConfig;
|
import com.ruoyi.cms.config.ChatConfig;
|
||||||
@@ -177,6 +178,8 @@ public class ChatController extends BaseController {
|
|||||||
JSONArray array = aiChatHistoryService.getChatHistoryData(request.getSessionId());
|
JSONArray array = aiChatHistoryService.getChatHistoryData(request.getSessionId());
|
||||||
request.setMessages(array);
|
request.setMessages(array);
|
||||||
String result = chatClient.sendChatGuest(request);
|
String result = chatClient.sendChatGuest(request);
|
||||||
|
//去除思维链
|
||||||
|
result = ChatTextCleanUtil.removeThinkChain(result);
|
||||||
try {
|
try {
|
||||||
String[] strList = result.split("?");
|
String[] strList = result.split("?");
|
||||||
List<String> list = new ArrayList<>();
|
List<String> list = new ArrayList<>();
|
||||||
|
|||||||
@@ -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. 优先提取 <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();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user