Spaces:
Running
Running
File size: 5,361 Bytes
0e95308 bf8e143 da4b0c7 bf8e143 0e95308 bf8e143 0e95308 bf8e143 0e95308 bf8e143 3e83acd da4b0c7 bf8e143 0e95308 bf8e143 0e95308 da4b0c7 bf8e143 0e95308 bf8e143 0e95308 bf8e143 0e95308 bf8e143 0e95308 da4b0c7 04356f4 da4b0c7 cb720fe 0280e01 da4b0c7 0280e01 04356f4 bf8e143 04356f4 0280e01 da4b0c7 7b27360 2978c6a da4b0c7 04356f4 2978c6a da4b0c7 2978c6a da4b0c7 04356f4 2978c6a 04356f4 da4b0c7 04356f4 da4b0c7 2978c6a da4b0c7 |
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 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
import json
from sentence_transformers import SentenceTransformer, util
from groq import Groq
import datetime
import requests
from io import BytesIO
from PIL import Image, ImageDraw, ImageFont
import numpy as np
from dotenv import load_dotenv
from datasets import load_dataset, Dataset
import pandas as pd
import os
# Load environment variables
load_dotenv()
# Initialize Groq client
groq_client = Groq(api_key=os.getenv("GROQ_API_KEY"))
# Load models and dataset
similarity_model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
# Constants
HF_DATASET_REPO = "midrees2806/unmatched_queries"
HF_TOKEN = os.getenv("HF_TOKEN")
GREETINGS = [
"hi", "hello", "hey", "good morning", "good afternoon", "good evening",
"assalam o alaikum", "salam", "aoa", "hi there",
"hey there", "greetings"
]
# Load dataset
with open('dataset.json', 'r') as f:
dataset = json.load(f)
# Precompute embeddings
dataset_questions = [item.get("input", "").lower().strip() for item in dataset]
dataset_answers = [item.get("response", "") for item in dataset]
dataset_embeddings = similarity_model.encode(dataset_questions, convert_to_tensor=True)
# Save unmatched queries to Hugging Face
def manage_unmatched_queries(query: str):
try:
timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
try:
ds = load_dataset(HF_DATASET_REPO, token=HF_TOKEN)
df = ds["train"].to_pandas()
except:
df = pd.DataFrame(columns=["Query", "Timestamp", "Processed"])
if query not in df["Query"].values:
new_entry = {"Query": query, "Timestamp": timestamp, "Processed": False}
df = pd.concat([df, pd.DataFrame([new_entry])], ignore_index=True)
updated_ds = Dataset.from_pandas(df)
updated_ds.push_to_hub(HF_DATASET_REPO, token=HF_TOKEN)
except Exception as e:
print(f"Failed to save query: {e}")
# Query Groq LLM
def query_groq_llm(prompt, model_name="llama3-70b-8192"):
try:
chat_completion = groq_client.chat.completions.create(
messages=[{
"role": "user",
"content": prompt
}],
model=model_name,
temperature=0.7,
max_tokens=500
)
return chat_completion.choices[0].message.content.strip()
except Exception as e:
print(f"Error querying Groq API: {e}")
return ""
# Main logic function
def get_best_answer(user_input):
if not user_input.strip():
return "Please enter a valid question."
user_input_lower = user_input.lower().strip()
# π‘ Greet back if user greets
if any(greet in user_input_lower for greet in GREETINGS):
greeting_response = query_groq_llm(
f"You are an official assistant for University of Education Lahore. "
f"Respond to this greeting in a friendly and professional manner: {user_input}"
)
return greeting_response if greeting_response else "Hello! How can I assist you today?"
# π° Fee-specific shortcut
if any(keyword in user_input_lower for keyword in ["semester fee", "semester fees"]):
return (
"π° For complete and up-to-date fee details for this program, we recommend visiting the official University of Education fee structure page.\n"
"Youβll find comprehensive information regarding tuition, admission charges, and other applicable fees there.\n"
"π https://ue.edu.pk/allfeestructure.php"
)
# π Similarity-based matching
user_embedding = similarity_model.encode(user_input_lower, convert_to_tensor=True)
similarities = util.pytorch_cos_sim(user_embedding, dataset_embeddings)[0]
best_match_idx = similarities.argmax().item()
best_score = similarities[best_match_idx].item()
if best_score < 0.65:
manage_unmatched_queries(user_input)
# π§ Use original dataset answer if matched well
if best_score >= 0.65:
original_answer = dataset_answers[best_match_idx]
prompt = f"""Name is UOE AI Assistant! You are an official assistant for the University of Education Lahore.
Rephrase the following official answer clearly and professionally.
Use structured formatting (like headings, bullet points, or numbered lists) where appropriate.
DO NOT add any new or extra information. ONLY rephrase and improve the clarity and formatting of the original answer.
### Question:
{user_input}
### Original Answer:
{original_answer}
### Rephrased Answer:
"""
else:
prompt = f"""Name is UOE AI Assistant! As an official assistant for University of Education Lahore, provide a helpful response:
Include relevant details about university policies.
If unsure, direct to official channels.
### Question:
{user_input}
### Official Answer:
"""
llm_response = query_groq_llm(prompt)
if llm_response:
for marker in ["Improved Answer:", "Official Answer:", "Rephrased Answer:"]:
if marker in llm_response:
return llm_response.split(marker)[-1].strip()
return llm_response
else:
return dataset_answers[best_match_idx] if best_score >= 0.65 else (
"For official information:\n"
"π +92-42-99262231-33\n"
"βοΈ [email protected]\n"
"π https://ue.edu.pk"
)
|