Spaces:
Sleeping
Sleeping
| import os | |
| from huggingface_hub import login | |
| from datasets import load_dataset | |
| import gradio as gr | |
| from llama_cpp import Llama | |
| from huggingface_hub import hf_hub_download | |
| import chromadb | |
| from sentence_transformers import SentenceTransformer | |
| # Charger le token depuis les secrets | |
| hf_token = os.getenv("HF_TOKEN") # Assurez-vous que 'HF_TOKEN' est bien le nom du secret Hugging Face | |
| # Connecting à Hugging Face | |
| login(hf_token) | |
| # Charger le dataset | |
| dataset = load_dataset("Maryem2025/final_dataset") # Changez le nom si nécessaire | |
| # Initialisation du modèle Llama | |
| llm = Llama( | |
| model_path=hf_hub_download( | |
| repo_id="TheBloke/CapybaraHermes-2.5-Mistral-7B-GGUF", | |
| filename="capybarahermes-2.5-mistral-7b.Q2_K.gguf", | |
| ), | |
| n_ctx=2048, | |
| #n_gpu_layers=50, # Ajustez selon votre VRAM | |
| ) | |
| # Initialisation de ChromaDB Vector Store | |
| class VectorStore: | |
| def __init__(self, collection_name): | |
| self.embedding_model = SentenceTransformer('sentence-transformers/multi-qa-MiniLM-L6-cos-v1') | |
| self.chroma_client = chromadb.Client() | |
| # Supprimer la collection existante si elle existe | |
| if collection_name in self.chroma_client.list_collections(): | |
| self.chroma_client.delete_collection(collection_name) | |
| # Créer une nouvelle collection | |
| self.collection = self.chroma_client.create_collection(name=collection_name) | |
| def populate_vectors(self, dataset): | |
| # Sélectionner les colonnes pertinentes à concaténer | |
| titles = dataset['train']['title'][:2000] | |
| servings = dataset['train']['servings'][:2000] | |
| total_times = dataset['train']['total_time'][:2000] | |
| courses = dataset['train']['course'][:2000] | |
| sections = dataset['train']['sections'][:2000] | |
| instructions = dataset['train']['instructions'][:2000] | |
| cuisines = dataset['train']['cuisine'][:2000] | |
| calories = dataset['train']['calories'][:2000] | |
| # Concaténer les textes à partir des colonnes sélectionnées | |
| texts = [ | |
| f"Title: {title}. Servings: {serving}. Total Time: {total_time} minutes. " | |
| f"Course: {course}. Sections: {section}. Instructions: {instruction}. " | |
| f"Cuisine: {cuisine}. Calories: {calorie}." | |
| for title, serving, total_time, course, section, instruction, cuisine, calorie | |
| in zip(titles, servings, total_times, courses, sections, instructions, cuisines, calories) | |
| ] | |
| # Ajouter les embeddings au store de vecteurs | |
| for i, item in enumerate(texts): | |
| embeddings = self.embedding_model.encode(item).tolist() | |
| self.collection.add(embeddings=[embeddings], documents=[item], ids=[str(i)]) | |
| def search_context(self, query, n_results=1): | |
| query_embedding = self.embedding_model.encode([query]).tolist() | |
| results = self.collection.query(query_embeddings=query_embedding, n_results=n_results) | |
| return results['documents'] | |
| # Initialisation du store de vecteurs et peuplement | |
| dataset = load_dataset("Maryem2025/final_dataset") | |
| vector_store = VectorStore("embedding_vector") | |
| vector_store.populate_vectors(dataset) | |
| # Fonction pour générer du texte | |
| def generate_text(message, max_tokens, temperature, top_p): | |
| # Récupérer le contexte depuis le store de vecteurs | |
| context_results = vector_store.search_context(message, n_results=1) | |
| context = context_results[0] if context_results else "" | |
| # Créer le modèle de prompt | |
| prompt_template = ( | |
| f"SYSTEM: You are a recipe generating bot.\n" | |
| f"SYSTEM: {context}\n" | |
| f"USER: {message}\n" | |
| f"ASSISTANT:\n" | |
| ) | |
| # Générer le texte avec le modèle de langue | |
| output = llm( | |
| prompt_template, | |
| temperature=0.3, | |
| top_p=0.95, | |
| top_k=40, | |
| repeat_penalty=1.1, | |
| max_tokens=600, | |
| ) | |
| # Traiter la sortie | |
| input_string = output['choices'][0]['text'].strip() | |
| cleaned_text = input_string.strip("[]'").replace('\\n', '\n') | |
| continuous_text = '\n'.join(cleaned_text.split('\n')) | |
| return continuous_text | |
| # Définir l'interface Gradio | |
| demo = gr.Interface( | |
| fn=generate_text, | |
| inputs=[ | |
| gr.Textbox(lines=2, placeholder="Enter your message here...", label="Message"), | |
| ], | |
| outputs=gr.Textbox(label="Generated Text"), | |
| title="FALFOUL's Kitchen", | |
| description="Running LLM with context retrieval from ChromaDB", | |
| examples=[ | |
| ["I have rice, what can I make out of it?"], | |
| ["I just have some milk and chocolate, what dessert can I make?"], | |
| ["Can you suggest a vegan breakfast recipe?"], | |
| ["How do I make a perfect scrambled egg?"], | |
| ["Can you guide me through making a tajine?"], | |
| ], | |
| cache_examples=False, | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch() | |