Spaces:
Build error
Build error
| import faiss | |
| import pickle | |
| import numpy as np | |
| import re | |
| from sentence_transformers import SentenceTransformer | |
| from transformers import AutoTokenizer # Ajouté pour la gestion des tokens | |
| from huggingface_hub import InferenceClient | |
| # Chargement du modèle | |
| client = InferenceClient("mistralai/Mistral-7B-Instruct-v0.1", token=os.environ.get("edup2")) | |
| # Chargement du tokenizer (même base que Falcon) | |
| tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-Instruct-v0.1") | |
| def load_faiss_index(index_path="faiss_index/faiss_index.faiss", doc_path="faiss_index/documents.pkl"): | |
| index = faiss.read_index(index_path) | |
| with open(doc_path, "rb") as f: | |
| documents = pickle.load(f) | |
| return index, documents | |
| def get_embedding_model(): | |
| return SentenceTransformer("sentence-transformers/multi-qa-MiniLM-L6-cos-v1") | |
| def query_index(question, index, documents, model, k=3): | |
| question_embedding = model.encode([question]) | |
| _, indices = index.search(np.array(question_embedding).astype("float32"), k) | |
| return [documents[i] for i in indices[0]] | |
| def nettoyer_context(context): | |
| context = re.sub(r"\[\'(.*?)\'\]", r"\1", context) | |
| context = context.replace("None", "") | |
| return context | |
| def generate_answer(question, context): | |
| MAX_TOKENS_TOTAL = 2048 | |
| MAX_NEW_TOKENS = 300 | |
| MAX_PROMPT_TOKENS = MAX_TOKENS_TOTAL - MAX_NEW_TOKENS | |
| # Construction initiale du prompt | |
| base_prompt = f"""Voici des informations sur des établissements et formations : | |
| {context} | |
| Formule ta réponse comme un conseiller d’orientation bienveillant, de manière fluide et naturelle. | |
| Question : {question} | |
| Réponse :""" | |
| # Tronquer si le prompt est trop long | |
| tokens = tokenizer.encode(base_prompt) | |
| if len(tokens) > MAX_PROMPT_TOKENS: | |
| # Réduction progressive du contexte uniquement | |
| context_tokens = tokenizer.encode(context) | |
| keep_tokens = MAX_PROMPT_TOKENS - len(tokenizer.encode(base_prompt.replace(context, ""))) | |
| truncated_context = tokenizer.decode(context_tokens[:keep_tokens]) | |
| # Reconstruire le prompt avec contexte réduit | |
| base_prompt = f"""Voici des informations sur des établissements et formations : | |
| {truncated_context} | |
| Formule ta réponse comme un conseiller d’orientation bienveillant, de manière fluide et naturelle. | |
| Question : {question} | |
| Réponse :""" | |
| print("===== PROMPT ENVOYÉ =====") | |
| print(base_prompt) | |
| response = client.text_generation(prompt=base_prompt, max_new_tokens=MAX_NEW_TOKENS, timeout=30) | |
| print("===== RÉPONSE REÇUE =====") | |
| print(response) | |
| return response # selon format du retour | |