Spaces:
Runtime error
Runtime error
import gradio as gr | |
import copy | |
from llama_cpp import Llama | |
from huggingface_hub import hf_hub_download | |
import chromadb | |
from datasets import load_dataset | |
from sentence_transformers import SentenceTransformer | |
# Initialize the Llama model | |
llm = Llama( | |
# model_path=hf_hub_download( | |
# repo_id="microsoft/Phi-3-mini-4k-instruct-gguf", | |
# filename="Phi-3-mini-4k-instruct-q4.gguf", | |
# ), | |
# model_path=hf_hub_download( | |
# repo_id="Ankitajadhav/Phi-3-mini-4k-instruct-q4.gguf", | |
# filename="Phi-3-mini-4k-instruct-q4.gguf", | |
# ), | |
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, # Adjust based on your VRAM | |
) | |
# Initialize 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() | |
self.collection = self.chroma_client.create_collection(name=collection_name) | |
## entire dataset | |
# def populate_vectors(self, texts): | |
# embeddings = self.embedding_model.encode(texts, batch_size=32).tolist() | |
# for text, embedding in zip(texts, embeddings, ids): | |
# self.collection.add(embeddings=[embedding], documents=[text], ids=[doc_id]) | |
## subsetting | |
def populate_vectors(self, dataset): | |
# Select the text columns to concatenate | |
title = dataset['train']['title_cleaned'][:2000] # Limiting to 2000 examples for the demo | |
recipe = dataset['train']['recipe_new'][:2000] | |
allergy = dataset['train']['allergy_type'][:2000] | |
ingredients = dataset['train']['ingredients_alternatives'][:2000] | |
# Concatenate the text from both columns | |
texts = [f"{tit} {rep} {ingr} {alle}" for tit, rep, ingr,alle in zip(title, recipe, ingredients,allergy)] | |
for i, item in enumerate(texts): | |
embeddings = self.embedding_model.encode(item).tolist() | |
self.collection.add(embeddings=[embeddings], documents=[item], ids=[str(i)]) | |
## Method to populate the vector store with embeddings from a dataset | |
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'] | |
# Example initialization (assuming you've already populated the vector store) | |
dataset = load_dataset('Thefoodprocessor/recipe_new_with_features_full') | |
vector_store = VectorStore("embedding_vector") | |
vector_store.populate_vectors(dataset) | |
def generate_text(message, max_tokens, temperature, top_p): | |
# Retrieve context from vector store | |
context_results = vector_store.search_context(message, n_results=1) | |
context = context_results[0] if context_results else "" | |
# Create the prompt template | |
prompt_template = ( | |
f"SYSTEM: You are a recipe generating bot.\n" | |
f"SYSTEM: {context}\n" | |
f"USER: {message}\n" | |
f"ASSISTANT:\n" | |
) | |
# Generate text using the language model | |
output = llm( | |
prompt_template, | |
# max_new_tokens=256, | |
temperature=0.3, | |
top_p=0.95, | |
top_k=40, | |
repeat_penalty=1.1, | |
max_tokens=600, | |
# repetition_penalty=1.1 | |
) | |
# Process the output | |
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 | |
# Define the Gradio interface | |
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="Chatbot - Your Personal Culinary Advisor: Discover What to Cook Next!", | |
description="Running LLM with context retrieval from ChromaDB", | |
examples=[ | |
["I have leftover rice, what can I make out of it?"], | |
["I just have some milk and chocolate, what dessert can I make?"], | |
["I am allergic to coconut milk, what can I use instead in a Thai curry?"], | |
["Can you suggest a vegan breakfast recipe?"], | |
["How do I make a perfect scrambled egg?"], | |
["Can you guide me through making a soufflé?"], | |
], | |
cache_examples=False, | |
) | |
# Define a function to restart the interface | |
def restart_interface(): | |
# This function can include any logic needed to reset the app's state | |
return gr.update() | |
# Add a custom button to restart the interface | |
with gr.Blocks() as app: | |
with gr.Row(): | |
demo.render() | |
gr.Button("Restart Space").click(fn=restart_interface, inputs=[], outputs=[demo]) | |
if __name__ == "__main__": | |
demo.launch() | |