import re from services.ai_service import ai_service from sklearn.metrics.pairwise import cosine_similarity class HybridRequestValidator: def __init__(self): # 规则1:检查是否包含模板设计相关词汇 self.template_patterns = [ r'.*模板.*', r'.*设计.*', r'.*推荐.*(样式|风格|主题)', r'.*(颜色|色彩|配色).*', r'.*(去掉|移除|删除|隐藏).*', r'.*(组件|元素|部件).*', r'.*(采用|使用|设置为).*' ] # 规则2:明显的非模板请求模式 self.reject_patterns = [ r'^告诉我.*', r'.*天气.*', r'.*时间.*', r'.*播放.*', r'.*新闻.*', r'^查询.*', r'^搜索.*' ] # 语义检查的参考语句 self.reference_phrases = [ "模板设计需求,包含样式和组件要求", "视觉设计请求,涉及颜色和布局调整", "UI模板定制,需要修改特定元素" ] self.ref_embeddings = ai_service.text_to_embedding(self.reference_phrases) def validate(self, user_input): # 1. 快速拒绝明显无关的请求 for pattern in self.reject_patterns: if re.search(pattern, user_input, re.IGNORECASE): return False # 2. 模式匹配检查 match_count = 0 for pattern in self.template_patterns: if re.search(pattern, user_input, re.IGNORECASE): match_count += 1 # 修改:只要包含关键词即可,不再强制要求多个关键词或语义验证 # >=1 只要包含1个关键词就通过验证 >=2 必须包含2个关键词 以此类推 if match_count >= 1: return True # 3. 语义验证(仅作为补充,用于没有任何关键词匹配但语义相关的情况) try: user_embedding = ai_service.text_to_embedding(user_input) # 确保维度匹配 if len(user_embedding.shape) == 1: user_embedding = user_embedding.reshape(1, -1) similarity = cosine_similarity( user_embedding, self.ref_embeddings ).max() if similarity > 0.4: #稍微提高阈值,因为没有关键词支撑 return True except Exception as e: print(f"语义验证出错: {e}") pass return False messageValidator = HybridRequestValidator()