File size: 4,703 Bytes
9cc7e25
f7c4af0
 
9cc7e25
 
 
 
 
 
1e8f246
22cfb6e
5d707d4
 
 
 
 
 
 
 
 
 
 
ae3604c
535f0de
22e97cf
f7c4af0
 
 
 
 
 
 
 
22cfb6e
9cc7e25
 
 
 
 
a623cc7
 
 
 
 
 
9cc7e25
 
 
 
5ecd97e
 
1289ea0
5ecd97e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9cc7e25
 
 
 
 
 
5ecd97e
9cc7e25
 
22cfb6e
 
1289ea0
 
 
 
 
1e8f246
 
ae3604c
5d707d4
22cfb6e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66a4894
bc9c343
22cfb6e
9cc7e25
 
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
# import packages
import shutil
import os
__import__('pysqlite3')
import sys
sys.modules['sqlite3'] = sys.modules.pop('pysqlite3')
from sentence_transformers import SentenceTransformer
import chromadb
from datasets import load_dataset
# from transformers import AutoModelForCausalLM, AutoTokenizer
import gradio as gr
from peft import PeftModel, PeftConfig
from transformers import AutoModelForCausalLM, AutoTokenizer



config = PeftConfig.from_pretrained("merve/Mistral-7B-Instruct-v0.2")
base_model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-v0.1")
model = PeftModel.from_pretrained(base_model, "merve/Mistral-7B-Instruct-v0.2")

tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-v0.1")




# Function to clear the cache
def clear_cache(model_name):
    cache_dir = os.path.expanduser(f'~/.cache/torch/sentence_transformers/{model_name.replace("/", "_")}')
    if os.path.exists(cache_dir):
        shutil.rmtree(cache_dir)
        print(f"Cleared cache directory: {cache_dir}")
    else:
        print(f"No cache directory found for: {cache_dir}")


# Embedding vector
class VectorStore:
    def __init__(self, collection_name):
       # Initialize the embedding model
         # Initialize the embedding model with try-except block for better error handling
        try:
            self.embedding_model = SentenceTransformer('sentence-transformers/multi-qa-MiniLM-L6-cos-v1')
        except Exception as e:
            print(f"Error loading model: {e}")
            raise
        self.chroma_client = chromadb.Client()
        self.collection = self.chroma_client.create_collection(name=collection_name)

    # Method to populate the vector store with embeddings from a dataset
    def populate_vectors(self, dataset, batch_size=100):
        # Use dataset streaming
        dataset = load_dataset('Thefoodprocessor/recipe_new_with_features_full', split='train[:1500]')

        # Process in batches
        texts = []
        for i, example in enumerate(dataset):
            title = example['title_cleaned']
            recipe = example['recipe_new']
            meal_type = example['meal_type']
            allergy = example['allergy_type']
            ingredients_alternative = example['ingredients_alternatives']

            # Concatenate the text from the columns
            text = f"{title} {recipe} {meal_type} {allergy} {ingredients_alternative}"
            texts.append(text)

            # Process the batch
            if (i + 1) % batch_size == 0:
                self._process_batch(texts, i)
                texts = []

        # Process the remaining texts
        if texts:
            self._process_batch(texts, i)

    def _process_batch(self, texts, batch_start_idx):
        embeddings = self.embedding_model.encode(texts, batch_size=len(texts)).tolist()
        for j, embedding in enumerate(embeddings):
            self.collection.add(embeddings=[embedding], documents=[texts[j]], ids=[str(batch_start_idx + j)])

    def search_context(self, query, n_results=1):
        query_embeddings = self.embedding_model.encode(query).tolist()
        return self.collection.query(query_embeddings=query_embeddings, n_results=n_results)

# create a vector embedding
vector_store = VectorStore("embedding_vector")
vector_store.populate_vectors(dataset=None)


# Load the model and tokenizer
# text generation model
# model_name = "meta-llama/Meta-Llama-3-8B"
# tokenizer = AutoTokenizer.from_pretrained(model_name)
# model = AutoModelForCausalLM.from_pretrained(model_name)

# load model orca-mini general purpose model
# tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-Instruct-v0.3")
# model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-Instruct-v0.3")



# Define the chatbot response function
def chatbot_response(user_input):
    global conversation_history
    results = vector_store.search_context(user_input, n_results=1)
    context = results['documents'][0] if results['documents'] else ""
    conversation_history.append(f"User: {user_input}\nContext: {context[:150]}\nBot:")
    inputs = tokenizer("\n".join(conversation_history), return_tensors="pt")
    outputs = model.generate(**inputs, max_length=150, do_sample=True, temperature=0.7)
    response = tokenizer.decode(outputs[0], skip_special_tokens=True)
    conversation_history.append(response)
    return response


# Gradio interface
def chat(user_input):
    response = chatbot_response(user_input)
    return response
css = ".gradio-container {background: url(https://upload.wikimedia.org/wikipedia/commons/f/f5/Spring_Kitchen_Line-Up_%28Unsplash%29.jpg)}"
iface = gr.Interface(fn=chat, inputs="text", outputs="text",css=css)
iface.launch()