import os import pandas as pd import numpy as np from supabase import create_client from sentence_transformers import SentenceTransformer import faiss import gradio as gr # Configura Supabase SUPABASE_URL = os.getenv("SUPABASE_URL") SUPABASE_KEY = os.getenv("SUPABASE_KEY") EMBEDDING_MODEL = "all-MiniLM-L6-v2" # Crea client per Supabase supabase = create_client(SUPABASE_URL, SUPABASE_KEY) # Carica il modello per gli embedding model = SentenceTransformer(EMBEDDING_MODEL) # Funzione per caricare i dati da Supabase def load_database(supabase_client): # Recupera gli articoli da Supabase (assumiamo che la tabella si chiami 'papers') response = supabase_client.table("papers").select("*").execute() data = response.data # Converti i dati in un DataFrame df = pd.DataFrame(data) return df # Funzione per creare l'indice FAISS def create_faiss_index(embeddings): dimension = len(embeddings[0]) # La dimensione degli embedding index = faiss.IndexFlatL2(dimension) # Crea un indice per la ricerca basato sulla distanza L2 index.add(np.array(embeddings, dtype=np.float32)) # Aggiungi gli embedding all'indice return index # Funzione per eseguire la ricerca def search_papers(query, supabase_client): # Carica i dati e l'indice FAISS df = load_database(supabase_client) index = create_faiss_index(df["embedding"].tolist()) # Calcola l'embedding della query query_embedding = model.encode(query).reshape(1, -1).astype(np.float32) distances, indices = index.search(query_embedding, 3) # Cerca i top 2 articoli più simili results = df.iloc[indices[0]] # Recupera i risultati corrispondenti return [(res["title"], res["url"]) for _, res in results.iterrows()] # Funzione per generare l'interfaccia Gradio def gradio_interface(query): results = search_papers(query, supabase) html_output = "" return html_output # Interfaccia Gradio iface = gr.Interface( fn=gradio_interface, inputs=gr.Textbox(label="Inserisci la tua query di ricerca", placeholder="Es. 'Deep Learning for NLP'", lines=1), outputs=gr.HTML(label="Articoli correlati", elem_id="output-section"), live=True, title="Ricerca articoli arXiv", description="Inserisci una query per trovare articoli correlati.", ) # Avvia l'interfaccia if __name__ == "__main__": iface.launch()