ginnigarg's picture
Upload app.py with huggingface_hub
8613d07 verified
Raw
History Blame Contribute Delete
2.37 kB
import gradio as gr
from transformers import AutoTokenizer, AutoModel
from datasets import load_dataset
import pandas as pd
import torch
# ------------------------------
# Cache model & dataset
# ------------------------------
def load_model_and_tokenizer():
model_ckpt = "sentence-transformers/multi-qa-mpnet-base-dot-v1"
tokenizer = AutoTokenizer.from_pretrained(model_ckpt)
model = AutoModel.from_pretrained(model_ckpt)
return tokenizer, model
def load_embeddings_dataset():
dataset = load_dataset("ginnigarg/dataset-github-issues-embeddings", split="train")
dataset.add_faiss_index(column="embeddings")
return dataset
tokenizer, model = load_model_and_tokenizer()
embeddings_dataset = load_embeddings_dataset()
# ------------------------------
# Embedding helper
# ------------------------------
def cls_pooling(model_output):
return model_output.last_hidden_state[:, 0]
def get_embeddings(text_list):
encoded_input = tokenizer(text_list, padding=True, truncation=True, return_tensors="pt")
with torch.no_grad():
model_output = model(**encoded_input)
return cls_pooling(model_output)
# ------------------------------
# Search function for Gradio
# ------------------------------
def semantic_search(question):
question_embedding = get_embeddings([question]).cpu().detach().numpy()
scores, samples = embeddings_dataset.get_nearest_examples(
"embeddings", question_embedding, k=5
)
samples_df = pd.DataFrame.from_dict(samples)
samples_df["scores"] = scores
samples_df.sort_values("scores", ascending=False, inplace=True)
# Convert to displayable format
return samples_df[["title", "comments", "html_url", "scores"]]
# ------------------------------
# Gradio Interface
# ------------------------------
with gr.Blocks() as demo:
gr.Markdown("# GitHub Issues Semantic Search")
question_input = gr.Textbox(label="Enter your question", value="How can I load a dataset offline?")
output = gr.Dataframe(headers=["title", "comments", "html_url", "scores"], datatype=["str", "str", "str", "number"])
search_button = gr.Button("Search")
def on_click(question):
return semantic_search(question)
search_button.click(fn=on_click, inputs=[question_input], outputs=[output])
# Launch the Gradio app
if __name__ == "__main__":
demo.launch()