132 lines
4.2 KiB
Python
132 lines
4.2 KiB
Python
"""
|
||
测试正则系统集成到聊天流程
|
||
"""
|
||
import asyncio
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
# 添加 backend 目录到路径
|
||
backend_path = Path(__file__).parent / "backend"
|
||
sys.path.insert(0, str(backend_path))
|
||
|
||
from services.regex_service import regex_service
|
||
from models.regex_rules import RegexRule, RegexPlacement, SubstituteMode
|
||
|
||
|
||
async def test_regex_integration():
|
||
"""测试正则规则在聊天流程中的应用"""
|
||
|
||
print("=" * 80)
|
||
print("测试1: 用户输入正则处理")
|
||
print("=" * 80)
|
||
|
||
# 创建一条测试规则:将 [思考] 标签替换为空(仅用于LLM)
|
||
test_rule = RegexRule(
|
||
id="test-hide-thinking",
|
||
scriptName="隐藏思考标签",
|
||
findRegex=r"\[思考\][\s\S]*?\[/思考\]",
|
||
replaceString="",
|
||
placement=[RegexPlacement.USER_INPUT],
|
||
promptOnly=True, # ✅ 只影响发送给LLM的内容
|
||
markdownOnly=False,
|
||
substituteRegex=SubstituteMode.REPLACE_ALL,
|
||
disabled=False
|
||
)
|
||
|
||
# 手动应用规则(不通过服务)
|
||
import re
|
||
user_input = "你好![思考]这是一个内部想法,不应该被看到[/思考] 请问天气如何?"
|
||
|
||
print(f"\n原始输入:\n{user_input}\n")
|
||
|
||
# 模拟 promptOnly=True 的逻辑
|
||
pattern = test_rule.findRegex
|
||
processed_for_llm = re.sub(pattern, test_rule.replaceString, user_input)
|
||
|
||
print(f"处理后(发送给LLM - promptOnly=True):\n{processed_for_llm}\n")
|
||
|
||
# 模拟 promptOnly=False 的情况(不应用规则)
|
||
processed_for_display = user_input
|
||
|
||
print(f"处理后(显示给用户 - promptOnly=False跳过):\n{processed_for_display}\n")
|
||
|
||
print("\n" + "=" * 80)
|
||
print("测试2: AI输出正则处理")
|
||
print("=" * 80)
|
||
|
||
# 模拟AI输出
|
||
ai_output = "这是AI的回复。<thinking>我在思考...</thinking> 天气很好!"
|
||
|
||
print(f"\n原始输出:\n{ai_output}\n")
|
||
|
||
# 创建一条规则:移除 <thinking> 标签
|
||
thinking_rule = RegexRule(
|
||
id="test-remove-thinking",
|
||
scriptName="移除思考标签",
|
||
findRegex=r"<thinking>[\s\S]*?</thinking>",
|
||
replaceString="",
|
||
placement=[RegexPlacement.AI_OUTPUT],
|
||
promptOnly=True, # ✅ 只影响发送给LLM的内容(实际是保存时)
|
||
markdownOnly=False,
|
||
substituteRegex=SubstituteMode.REPLACE_ALL
|
||
)
|
||
|
||
# 应用正则
|
||
processed_output = regex_service.apply_rules_by_placement(
|
||
text=ai_output,
|
||
placement=RegexPlacement.AI_OUTPUT.value,
|
||
is_for_llm=False,
|
||
is_markdown_rendered=False
|
||
)
|
||
|
||
print(f"处理后:\n{processed_output}\n")
|
||
|
||
print("\n" + "=" * 80)
|
||
print("测试3: Markdown渲染规则")
|
||
print("=" * 80)
|
||
|
||
# 模拟包含 TIPS_DESIGN 标记的文本
|
||
tips_text = "TIPS_DESIGN[世界知识] 这是一些说明文字"
|
||
|
||
print(f"\n原始文本:\n{tips_text}\n")
|
||
|
||
# 创建规则:将 TIPS_DESIGN 转换为 HTML details
|
||
tips_rule = RegexRule(
|
||
id="test-tips-design",
|
||
scriptName="美化TIPS显示",
|
||
findRegex=r"TIPS_DESIGN\[([^\]]+)\]",
|
||
replaceString=r'<details><summary>\1</summary>点击查看详细说明</details>',
|
||
placement=[RegexPlacement.AI_OUTPUT],
|
||
promptOnly=False, # ✅ 影响显示
|
||
markdownOnly=True, # ✅ 只在Markdown渲染后应用
|
||
substituteRegex=SubstituteMode.REPLACE_ALL
|
||
)
|
||
|
||
# 应用正则(未渲染)
|
||
processed_unrendered = regex_service.apply_rules_by_placement(
|
||
text=tips_text,
|
||
placement=RegexPlacement.AI_OUTPUT.value,
|
||
is_for_llm=False,
|
||
is_markdown_rendered=False # ❌ 未渲染,不应应用
|
||
)
|
||
|
||
print(f"处理后(未渲染):\n{processed_unrendered}\n")
|
||
|
||
# 应用正则(已渲染)
|
||
processed_rendered = regex_service.apply_rules_by_placement(
|
||
text=tips_text,
|
||
placement=RegexPlacement.AI_OUTPUT.value,
|
||
is_for_llm=False,
|
||
is_markdown_rendered=True # ✅ 已渲染,应该应用
|
||
)
|
||
|
||
print(f"处理后(已渲染):\n{processed_rendered}\n")
|
||
|
||
print("\n" + "=" * 80)
|
||
print("✅ 所有测试完成!")
|
||
print("=" * 80)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
asyncio.run(test_regex_integration())
|