# utils/fallback_suggester.py import json from sentence_transformers import SentenceTransformer, util # 🔍 Load pre-trained semantic similarity model model = SentenceTransformer("sentence-transformers/paraphrase-mpnet-base-v2") # 📚 Load fallback clause database with open("fallback_clauses.json", "r", encoding="utf-8") as f: clause_bank = json.load(f) # 🔑 Extract clause labels and text clause_labels = list(clause_bank.keys()) clause_texts = list(clause_bank.values()) clause_embeddings = model.encode(clause_texts, convert_to_tensor=True) def suggest_fallback(input_clause: str, top_k: int = 3): """ Suggest top-k fallback clauses based on semantic similarity. Args: input_clause (str): The clause to analyze. top_k (int): Number of fallback suggestions to return. Returns: str: Formatted fallback suggestions. """ if not input_clause or len(input_clause.strip()) == 0: return "⚠️ No input clause provided." input_embedding = model.encode(input_clause, convert_to_tensor=True) scores = util.cos_sim(input_embedding, clause_embeddings)[0] top_indices = scores.topk(k=min(top_k, len(clause_labels))).indices.tolist() results = [] for idx in top_indices: label = clause_labels[idx] suggestion = clause_texts[idx] results.append(f"🔹 {label}:\n{suggestion}") return "\n\n".join(results)