gracie07's picture
Update app.py
a70746e verified
Raw
History Blame Contribute Delete
3.38 kB
import gradio as gr
import torch
from huggingface_hub import InferenceClient
from sentence_transformers import SentenceTransformer, util
client = InferenceClient("Qwen/Qwen2.5-7B-Instruct")
embedder = SentenceTransformer('all-MiniLM-L6-v2')
# add knowledge
facts = [
"Iron absorption: Non-heme iron (plant-based) is better absorbed when paired with Vitamin C (ascorbic acid).",
"Iron inhibitors: Phytic acid (in whole grains), polyphenols (in tea/coffee), and calcium can decrease iron absorption.",
"Calcium sources: Dairy, fortified plant milks, sardines, and leafy greens like kale or bok choy are high in calcium.",
"Vitamin D: Essential for calcium absorption; found in fatty fish, egg yolks, and produced via sunlight exposure.",
"Protein Synthesis: Consuming protein with a complete amino acid profile (like quinoa or soy) is vital for muscle repair.",
"Antioxidants: Berries and dark chocolate contain flavonoids that help reduce oxidative stress in cells.",
"Electrolytes: Sodium, potassium, and magnesium are critical for hydration and nerve function, especially after exercise.",
"Healthy Fats: Avocados and walnuts provide omega-3 and omega-6 fatty acids, which support brain health.",
"Meal Prep Safety: Cooked poultry should be refrigerated within 2 hours and consumed within 3 to 4 days.",
"Fiber: Soluble fiber (oats, beans) helps lower cholesterol, while insoluble fiber (whole wheat) aids digestion.",
"Zinc: Found in oysters, red meat, and pumpkin seeds; it plays a key role in immune function and wound healing.",
"B12 Deficiency: Common in vegan diets; B12 is mainly found in animal products or fortified nutritional yeast.",
"Potassium/Sodium Balance: High potassium intake (bananas, potatoes) can help offset the blood pressure effects of sodium.",
"Magnesium: Found in pumpkin seeds, spinach, and almonds; it supports over 300 biochemical reactions in the body."
]
# Pre-compute embeddings for the knowledge base
fact_embeddings = embedder.encode(facts, convert_to_tensor=True)
# RAG
def retrieve_relevant_info(query, top_k=2):
"""Finds the most relevant facts based on semantic similarity."""
query_embedding = embedder.encode(query, convert_to_tensor=True)
hits = util.semantic_search(query_embedding, fact_embeddings, top_k=top_k)
relevant_facts = [facts[hit['corpus_id']] for hit in hits[0]]
return " ".join(relevant_facts)
def respond(message, history):
context = retrieve_relevant_info(message)
# Initialize messages with System Prompt and RAG context
messages = [{
"role": "system",
"content": (
"You are a nutrition expert. You know about nutrients and meal prep. "
"Use the following context to help answer the user, but do not mention "
"that you are reading from a list. Context: " + context
)
}]
# Append conversation history
if history:
for turn in history:
messages.append(turn)
# Add the current user message
messages.append({"role": "user", "content": message})
# Generate response from Inference Client
response = client.chat_completion(messages, max_tokens=600)
return response.choices[0].message.content
# Launch interface
chatbot = gr.ChatInterface(respond)
if __name__ == "__main__":
chatbot.launch()