import os import gradio as gr import numpy as np import pickle from sentence_transformers import SentenceTransformer from pypdf import PdfReader import re import google.generativeai as genai # Ρύθμιση του Gemini API genai.configure(api_key=os.environ["GEMINI_API_KEY"]) # Φόρτωση του SentenceTransformer st_model = SentenceTransformer('dimitriz/st-greek-media-bert-base-uncased') # Συνάρτηση για το cosine similarity def cosine_similarity(a, b): return np.dot(a, b.T) / (np.linalg.norm(a, axis=1)[:, np.newaxis] * np.linalg.norm(b, axis=1)) # Αντικατάσταση μοτίβων στο κείμενο def replace_pattern(text, pattern=r" ν\. (\d+)", replacement=r" ν.\1"): return re.sub(pattern, replacement, text) # Δημιουργία chunks και ενσωματώσεων if os.path.exists('embedded_data.pkl'): with open('embedded_data.pkl', 'rb') as file: chunks, embedded_data = pickle.load(file) else: chunks = [] for file in os.listdir("archive"): if file.endswith(".pdf"): reader = PdfReader(f'archive/{file}') text = "".join([page.extract_text() for page in reader.pages]) text = replace_pattern(text, pattern=r" ν\. (\d+)", replacement=r" ν.\1") chunks += text.split("\n") # Απλό splitting embedded_data = st_model.encode(chunks) with open('embedded_data.pkl', 'wb') as file: pickle.dump((chunks, embedded_data), file) # Συνάρτηση RAG για ερώτημα χρήστη def rag_response(query): embedded_query = st_model.encode(query) similarities = cosine_similarity(embedded_query[np.newaxis, :], embedded_data) top_indices = np.argsort(similarities[0])[::-1][:20] top_doct = [chunks[index] for index in top_indices] augmented_prompt = f"""Είσαι ένα σύστημα εμπειρογνώμονας και απαντάς ερωτήσεις. Θα σου δώσω μια ερώτηση και ένα πλαίσιο και θα επιστρέψεις την απάντηση. Ερώτηση : {query} Πλαίσιο : {top_doct}""" try: response = genai.generate_text( model="text-bison-001", # Επιβεβαίωσε ότι το μοντέλο είναι σωστό prompt=augmented_prompt ) return response.result # Εξαρτάται από τη δομή του αντικειμένου απάντησης except Exception as e: return f"Σφάλμα: {str(e)}" # Δημιουργία Gradio UI interface = gr.Interface( fn=rag_response, inputs=gr.Textbox(label="Η ερώτησή σας:", lines=2, placeholder="Πληκτρολογήστε την ερώτησή σας εδώ..."), outputs=gr.Textbox(label="Απάντηση από το Gemini:"), title="RAG Gemini Assistant", description="Χρησιμοποιεί RAG για να παρέχει ακριβείς και τεκμηριωμένες απαντήσεις." ) # Εκκίνηση της εφαρμογής if __name__ == "__main__": interface.launch(share=True)