Mikeplockhart's picture
Update app.py
f2cd66b verified
import gradio as gr
import os
from langchain_community.document_loaders import JSONLoader
from langchain_community.vectorstores import Qdrant
from qdrant_client.http import models as rest
from qdrant_client import QdrantClient, models
from langchain_community.embeddings import HuggingFaceEmbeddings, HuggingFaceBgeEmbeddings
from sentence_transformers.cross_encoder import CrossEncoder
from groq import Groq
client = Groq(
api_key=os.environ.get("GROQ_API"),
)
# loading data
json_path = "format_food.json"
def metadata_func(record: dict, metadata: dict) -> dict:
metadata["title"] = record.get("title")
metadata["cuisine"] = record.get("cuisine")
metadata["time"] = record.get("time")
metadata["instructions"] = record.get("instructions")
return metadata
def reranking_results(query, top_k_results, rerank_model):
# Load the model, here we use our base sized model
top_results_formatted = [f"{item.metadata['title']}, {item.page_content}" for item in top_k_results]
reranked_results = rerank_model.rank(query, top_results_formatted, return_documents=True)
return reranked_results
loader = JSONLoader(
file_path=json_path,
jq_schema='.dishes[].dish',
text_content=False,
content_key='doc',
metadata_func=metadata_func
)
data = loader.load()
country_list = list(set([item.metadata['cuisine'] for item in data]))
# Models
# model_name = "Snowflake/snowflake-arctic-embed-xs"
# rerank_model = CrossEncoder("mixedbread-ai/mxbai-rerank-xsmall-v1")
# Embedding
# model_kwargs = {"device": "cpu"}
# encode_kwargs = {"normalize_embeddings": True}
# hf_embedding = HuggingFaceEmbeddings(
# model_name=model_name,
# encode_kwargs=encode_kwargs,
# model_kwargs=model_kwargs,
# show_progress=True
# )
model_name = "BAAI/bge-small-en"
model_kwargs = {"device": "cpu"}
encode_kwargs = {"normalize_embeddings": True}
hf_embedding = HuggingFaceBgeEmbeddings(
model_name=model_name,
model_kwargs=model_kwargs,
encode_kwargs=encode_kwargs
)
qdrant = Qdrant.from_documents(
data,
hf_embedding,
location=":memory:", # Local mode with in-memory storage only
collection_name="my_documents",
)
def format_to_markdown(response_list):
response_list[0] = "- " + response_list[0]
temp_string = "\n- ".join(response_list)
return temp_string
def run_query(query: str, groq: bool, countries: str = "None"):
print("Running Query")
if countries != "None":
countries_select = models.Filter(
must=[
models.FieldCondition(
key="metadata.cuisine", # Adjust key based on your data structure
match=models.MatchValue(value=countries),
)
]
)
else:
countries_select = None
answer = qdrant.similarity_search(
query=query,
k=10,
filter=countries_select
)
title_and_description = f"# Best Choice:\nA {answer[0].metadata['title']}: {answer[0].page_content}"
instructions = format_to_markdown(answer[0].metadata['instructions'])
recipe = f"# Standard Method\n## Cooking time:\n{answer[0].metadata['time']}\n\n## Recipe:\n{instructions}"
print("Returning query")
if groq:
chat_completion = client.chat.completions.create(
messages=[
{
"role": "user",
"content": f"please write a more detailed recipe for the following recipe:\n{recipe}\n\n please return it in the same format.",
}
],
model="Llama3-70b-8192",
)
groq_update = "# Groq Update\n"+chat_completion.choices[0].message.content
else:
groq_update = "# Groq Update \nPlease select the tick box if you need more information."
return title_and_description, recipe, groq_update
with gr.Blocks() as demo:
gr.Markdown("Start typing below and then click **Run** to see the output.")
inp = gr.Textbox(placeholder="What sort of meal are you after?")
dropdown = gr.Dropdown(['None'] + country_list, label='Filter on countries', value='None')
groq_button = gr.Checkbox(value=False, label="Use Llama for a better recipe?")
title_output = gr.Markdown(label="Title and description")
instructions_output = gr.Markdown(label="Recipe")
updated_recipe = gr.Markdown(label="Updated Recipe")
btn = gr.Button("Run")
btn.click(fn=run_query, inputs=[inp, groq_button, dropdown], outputs=[title_output, instructions_output, updated_recipe])
demo.launch()