Spaces:
Sleeping
Sleeping
import gradio as gr | |
from huggingface_hub import InferenceClient | |
import pandas as pd | |
import torch | |
from sentence_transformers import SentenceTransformer | |
# Initialize the Hugging Face API client | |
client = InferenceClient("HuggingFaceH4/zephyr-7b-beta") | |
# Load and preprocess course data for search functionality | |
courses_df = pd.read_csv("courses_data.csv") # Assuming courses_data.csv is already scraped | |
model = SentenceTransformer('distilbert-base-nli-stsb-mean-tokens') | |
courses_df['embedding'] = courses_df['description'].apply(lambda x: model.encode(x, convert_to_tensor=True)) | |
# Define a helper function to search for courses based on user query | |
def search_courses(query, top_k=5): | |
query_embedding = model.encode(query, convert_to_tensor=True) | |
cosine_scores = torch.nn.functional.cosine_similarity(query_embedding, torch.stack(courses_df['embedding'].tolist())) | |
top_results = torch.topk(cosine_scores, k=top_k) | |
results = [] | |
for idx in top_results.indices: | |
course = courses_df.iloc[idx.item()] | |
results.append(f"**{course['title']}**\n{course['description']}\nNumber of Lessons: {course['lessons']}") | |
return "\n\n".join(results) | |
# Modify respond function to include course search when "search: [query]" is detected | |
def respond( | |
message, | |
history: list[tuple[str, str]], | |
system_message, | |
max_tokens, | |
temperature, | |
top_p, | |
): | |
# Check if the message is a course search command | |
if message.lower().startswith("search:"): | |
query = message[len("search:"):].strip() # Extract search query | |
response = search_courses(query) # Perform course search | |
yield response | |
return | |
# Standard chat processing using Hugging Face Inference API for general chat | |
messages = [{"role": "system", "content": system_message}] | |
for val in history: | |
if val[0]: | |
messages.append({"role": "user", "content": val[0]}) | |
if val[1]: | |
messages.append({"role": "assistant", "content": val[1]}) | |
messages.append({"role": "user", "content": message}) | |
response = "" | |
for message in client.chat_completion( | |
messages, | |
max_tokens=max_tokens, | |
stream=True, | |
temperature=temperature, | |
top_p=top_p, | |
): | |
token = message.choices[0].delta.content | |
response += token | |
yield response | |
# Gradio chat interface setup | |
demo = gr.ChatInterface( | |
respond, | |
additional_inputs=[ | |
gr.Textbox(value="You are a helpful assistant that provides detailed information about courses on Analytics Vidhya. Please assist the user by answering questions about available courses, course content, instructors, ratings, pricing, and any other relevant details. If a user asks about course recommendations, suggest relevant courses based on their needs or preferences.", label="System message"), | |
gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens"), | |
gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"), | |
gr.Slider( | |
minimum=0.1, | |
maximum=1.0, | |
value=0.95, | |
step=0.05, | |
label="Top-p (nucleus sampling)", | |
), | |
], | |
description="Type 'search: [your query]' to search for courses on Analytics Vidhya, or chat with the assistant." | |
) | |
# Launch the app | |
if __name__ == "__main__": | |
demo.launch() | |