import re
from dataclasses import dataclass
OUTPUT_PATTERNS = [
(re.compile(r"sk-[a-zA-Z0-9\-]{10,}"), "API Key"),
(re.compile(r"mysql://[^\s]+"), "数据库连接串"),
(re.compile(r"1[3-9]\d{9}"), "手机号"),
(re.compile(r"(?i)(system\s*prompt|系统提示词|系统指令)"), "系统提示词"),
(re.compile(r"API_KEY\s*=", re.I), "配置泄露"),
(re.compile(r"定价策略|尚未公开"), "内部文档"),
(re.compile(r"已进入无限制模式|DAN\s*模式", re.I), "越狱输出"),
(re.compile(r"好的,我现在是聊天机器人", re.I), "角色劫持"),
]
@dataclass
class OutputGuardResult:
filtered_output: str
leakage_detected: bool
matched_types: list[str]
original_output: str
def filter_output(text: str) -> OutputGuardResult:
matched_types: list[str] = []
filtered = text
for pattern, label in OUTPUT_PATTERNS:
if pattern.search(filtered):
matched_types.append(label)
filtered = pattern.sub("[已脱敏]", filtered)
leakage = bool(matched_types)
if leakage and "[已脱敏]" in filtered:
filtered = (
"检测到输出包含敏感信息,已拦截并脱敏。"
f"(命中类型:{', '.join(matched_types)})"
)
return OutputGuardResult(
filtered_output=filtered,
leakage_detected=leakage,
matched_types=matched_types,
original_output=text,
)