File size: 3,132 Bytes
6fb3032
2d2dc52
6fb3032
 
 
 
 
 
2d2dc52
6fb3032
63cc411
2d2dc52
6fb3032
 
2d2dc52
6fb3032
 
 
2d2dc52
6fb3032
 
 
2d2dc52
6fb3032
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2d2dc52
6fb3032
 
 
 
 
 
2d2dc52
6fb3032
 
 
2d2dc52
6fb3032
949cbd4
 
 
 
 
6fb3032
 
2d2dc52
6fb3032
 
 
 
 
 
 
2d2dc52
 
6fb3032
2d2dc52
6fb3032
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
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)