chatbot_2 / main.py
Mohammedelhakim's picture
Update main.py
0b96936 verified
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import requests as req
import pandas as pd
import chromadb
from sentence_transformers import SentenceTransformer
from huggingface_hub import snapshot_download , login
import os
from dotenv import load_dotenv
import os
HF_TOKEN = os.getenv("HF_TOKEN")
login(token=HF_TOKEN)
GROQ_API_KEY = os.getenv("GROQ_API_KEY")
GROQ_URL = "https://api.groq.com/openai/v1/chat/completions"
GROQ_MODEL = "llama-3.1-8b-instant"
CHROMA_DIR = "chroma_db/chroma_db"
HF_DATASET_ID = "Mohammedelhakim/parenting-qa-vectordb"
NUM_RESULTS = 3
if not os.path.exists(CHROMA_DIR):
print("Downloading vector database from Hugging Face Hub...")
snapshot_download(
repo_id="Mohammedelhakim/parenting-qa-vectordb",
repo_type="dataset",
local_dir="chroma_db",
token=HF_TOKEN
)
print("Vector database downloaded!")
else:
print("Vector database found locally, loading...")
print("Loading embedding model...")
embedder = SentenceTransformer("all-MiniLM-L6-v2")
chroma_client = chromadb.PersistentClient(path=CHROMA_DIR)
print(chroma_client.list_collections())
collection = chroma_client.get_collection("parenting_qa")
print("Ready!")
app = FastAPI()
@app.get("/")
def root():
return {"status": "ok"}
class ChatRequest(BaseModel):
message: str
@app.post("/chat")
def chat(request: ChatRequest):
# 1. Embed the user question
query_embedding = embedder.encode(request.message).tolist()
# 2. Retrieve most similar Q&As
results = collection.query(
query_embeddings=[query_embedding],
n_results=NUM_RESULTS,
)
# 3. Build context
context = ""
for doc, meta in zip(results["documents"][0], results["metadatas"][0]):
context += f"Q: {doc}\nA: {meta['answer']}\n\n"
# 4. Call Groq
messages = [
{"role": "system", "content": (
"You are a helpful and caring parenting assistant. "
"You answer questions from parents about their babies and children, "
"such as health, development, feeding, sleep, and behavior. "
"Give clear, reassuring, and practical answers. "
"If something sounds medically serious, always advise the parent to consult a doctor. "
"Use the following similar Q&A examples to guide your answer:\n\n"
+ context
)},
{"role": "user", "content": request.message},
]
response = req.post(
GROQ_URL,
headers={
"Authorization": f"Bearer {GROQ_API_KEY}",
"Content-Type": "application/json",
},
json={"model": GROQ_MODEL, "messages": messages},
timeout=30,
)
result = response.json()
if "choices" not in result:
raise HTTPException(status_code=500, detail=f"Groq API error: {result}")
return {"response": result["choices"][0]["message"]["content"]}