File size: 4,864 Bytes
78000ff 23bdbfd 7e887c6 23bdbfd 3b3e30d 23bdbfd 78000ff 23bdbfd 7e887c6 37c3e84 23bdbfd 7e887c6 23bdbfd f53a293 dea83b3 23bdbfd 7e887c6 23bdbfd 3fdff67 7e887c6 23bdbfd 3fdff67 78000ff c56bbc4 23bdbfd 7e887c6 23bdbfd 7e887c6 23bdbfd 7e887c6 3fdff67 23bdbfd 7e887c6 23bdbfd 7e887c6 23bdbfd 1b3ebad 23bdbfd 59c5c4e 23bdbfd 78000ff 23bdbfd 59c5c4e 7e887c6 23bdbfd 1b3ebad |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
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()
|