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