| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- 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()
|