Τα LLM μπορούν να «δουν» μόνο περιορισμένη ποσότητα κειμένου κάθε φορά (το θεματικό πλαίσιο). Αυτό λειτουργεί για μικρές εργασίες, αλλά παύει να αποδίδει όταν μια γνωσιακή βάση εκτείνεται σε χιλιάδες σελίδες. Ακόμη κι όταν το θεματικό πλαίσιο επαρκεί, η απόδοση μπορεί να υποβαθμιστεί λόγω του προβλήματος «βελόνα στα άχυρα».
Το RAG («παραγωγή επαυξημένη με ανάκτηση») έχει αναδειχθεί σε ένα πολύ διαδεδομένο μοτίβο: διατηρείτε μια γνωσιακή βάση (έγγραφα, wiki, πολιτικές, απομαγνητοφωνήσεις κ.λπ.), εκτελείτε σημασιολογική αναζήτηση στο ερώτημα ενός χρήστη για να ανακτήσετε τα πιο σχετικά αποσπάσματα μέσω embeddings και, στη συνέχεια, τροφοδοτείτε το LLM με αυτά τα τμήματα μαζί με την ερώτηση. Έτσι περιορίζεται το θεματικό πλαίσιο του μοντέλου και, όταν η διαδικασία γίνεται σωστά, μπορεί να βελτιωθεί η ποιότητα των απαντήσεων και να μειωθούν οι ψευδαισθήσεις.
Το pgai είναι μια επέκταση ανοικτού κώδικα για το Postgres (μαζί με συνοδευτικά εργαλεία), η οποία σας βοηθά να δημιουργείτε ροές εργασιών «ανάκτησης με AI» πάνω στην αξιόπιστη βάση δεδομένων ανοικτού κώδικα PostgreSQL.
Η βασική ιδέα είναι να μεταφερθεί μεγαλύτερο μέρος της τυπικής ροής RAG στο επίπεδο της βάσης δεδομένων (εισαγωγή → κατάτμηση → δημιουργία embeddings → διατήρηση του συγχρονισμού τους), αντί η βάση να αντιμετωπίζεται ως «απλός χώρος αποθήκευσης» για embeddings.
Η πρώτη μας εντύπωση είναι ότι πρόκειται για μια πολλά υποσχόμενη λύση, η οποία όμως παύει να είναι κατάλληλη μόλις η ροή RAG γίνει έστω και λίγο σύνθετη, ιδίως ως προς τις προσεγγίσεις κατάτμησης. Θα παρακολουθούμε, πάντως, στενά αυτό το έργο.
Υπάρχουν πολλοί τρόποι να δημιουργήσετε ένα σύστημα RAG. Για μια πιο εκτενή ανάλυση των διαφορετικών προσεγγίσεων, διαβάστε το άρθρο Πρακτικά παραδείγματα προσαρμοσμένων λύσεων RAG. Οι σχεδιαστικές επιλογές αποκτούν εντυπωσιακό βάθος όταν σας ενδιαφέρει η ποιότητα, ενώ η συνηθισμένη «προεπιλεγμένη» προσέγγιση έχει γενικά την εξής μορφή:
Συγκεντρώστε ένα σύνολο εγγράφων.
Χωρίστε τα σε τμήματα. Υπάρχουν πολλές διαφορετικές μέθοδοι για να το κάνετε αυτό (π.χ. ανά παράγραφο ή σημασιολογική ομάδα).
Μετατρέψτε κάθε τμήμα σε embedding.
Αποθηκεύστε τα embeddings σε μια διανυσματική βάση δεδομένων (Pinecone, Milvus κ.λπ.) ή στο Postgres μέσω του pgvector.
Κατά την υποβολή του ερωτήματος, αναζητήστε τα πλησιέστερα τμήματα `και περάστε τα στο LLM (και πάλι... υπάρχουν πολλοί τρόποι να γίνει και αυτό).
Σε πολλές στοίβες τεχνολογιών, τα βήματα (1)–(3) εκτελούνται εκτός βάσης δεδομένων, στον κώδικα της εφαρμογής ή σε μια ροή δεδομένων, και η βάση χρησιμοποιείται κυρίως για:
αποθήκευση embeddings
αναζήτηση embeddings
Το pgai είναι μια επέκταση ανοικτού κώδικα για το Postgres, η οποία αναπτύχθηκε από την Timescale και επιχειρεί να αμβλύνει αυτή τη διάκριση.
Αντί να αντιμετωπίζει τα embeddings ως κάτι που διαχειρίζεται χειροκίνητα η εφαρμογή σας, το pgai τα καθιστά λειτουργία της βάσης δεδομένων:
Ορίζετε ποιον πίνακα ή ποια έγγραφα θέλετε να μετατρέψετε σε embeddings.
Καθορίζετε το μοντέλο embedding και μια στρατηγική κατάτμησης.
Το pgai διαχειρίζεται τα υπόλοιπα, διατηρώντας μεταξύ άλλων ενημερωμένα τα embeddings καθώς αλλάζουν τα δεδομένα προέλευσης.
Η υπόσχεση είναι ελκυστική:
Λιγότερος προσαρμοσμένος συνδετικός κώδικας που χρειάζεται συντήρηση.
Θα πρέπει να είναι ευκολότερο να παραμένουν τα embeddings «ενημερωμένα» καθώς αλλάζουν τα έγγραφα προέλευσης.
Το Postgres/pgai διαχειρίζεται τις επαναλήψεις, τα όρια ρυθμού, τις αποτυχημένες εργασίες κ.λπ.
Σημείωση για τον αναγνώστη: Το pgai περιλαμβάνει το pgvector, μια ακόμη πολύ δημοφιλή επέκταση RAG για το Postgres. Το pgvector προσθέτει διανυσματική αποθήκευση και αναζήτηση ομοιότητας στο Postgres, ενώ το pgai βασίζεται σε αυτό για να αυτοματοποιεί βήματα της ροής RAG, όπως η κατάτμηση, η δημιουργία embeddings και η διατήρησή τους ενημερωμένων.
1) Τίθεται εύκολα σε λειτουργία.
Η ιδανική ροή είναι αρκετά απλή:
Κατεβάστε τα Docker images της Timescale (βάση δεδομένων + worker).
Δώστε το κλειδί API του παρόχου embeddings.
Εκτελέστε λίγο κώδικα SQL για να δηλώσετε το vectoriser (ουσιαστικά: τι θα μετατραπεί σε embedding, πώς θα κατατμηθεί και ποιο μοντέλο θα χρησιμοποιηθεί).
Στη συνέχεια, το pgai ρυθμίζει έναν worker του vectoriser ώστε να εκτελείται ως ξεχωριστή διεργασία και να δημιουργεί embeddings ασύγχρονα (π.χ. κάθε 5 λεπτά ή με όποια συχνότητα θέλετε).
2) Είναι βολικό να εκτελείται ολόκληρη η ροή «κοντά» στη βάση δεδομένων.
Το pgai μπορεί να εισάγει περιεχόμενο από πίνακες, αλλά και να φορτώνει έγγραφα από τοποθεσίες όπως το S3 και στη συνέχεια να τα αναλύει, να τα χωρίζει σε τμήματα και να δημιουργεί embeddings. Μπορεί επίσης να χειριστεί διαφορετικές μορφές εγγράφων κειμένου, όπως PDF, Markdown κ.λπ.
1) Χάνετε μεγάλο μέρος του ελέγχου (και το RAG μερικές φορές απαιτεί έλεγχο).
Τα συστήματα RAG υψηλής απόδοσης, με κριτήριο την ποιότητα των απαντήσεων, απαιτούν συχνά εξειδικευμένες ροές, όπως:
προσαρμοσμένους κανόνες κατάτμησης (ανά επικεφαλίδα, σελίδα, εναλλαγή ομιλητή κ.λπ.)
κατάτμηση που λαμβάνει υπόψη τα μεταδεδομένα (διατήρηση τίτλων ενοτήτων, χρονικών σημάνσεων, συντακτών και τύπου εγγράφου)
διαφορετικές στρατηγικές embedding ανά τύπο εγγράφου
Το pgai προσφέρει μικρότερη ευελιξία στα παραπάνω.
Προς το παρόν υπάρχουν δύο βασικές στρατηγικές κατάτμησης: διαχωρισμός κειμένου βάσει χαρακτήρων και αναδρομικός διαχωρισμός κειμένου βάσει χαρακτήρων, καθώς και η επιλογή χωρίς κατάτμηση. Αυτό μπορεί να αρκεί για ορισμένες περιπτώσεις χρήσης, όμως πολλά συστήματα RAG παραγωγής απαιτούν περισσότερη προσαρμογή.
Θα ήταν εξαιρετικό αν η Timescale μπορούσε να ενσωματώσει ορισμένες από τις πιο προηγμένες στρατηγικές κατάτμησης που συναντάμε σε βιβλιοθήκες όπως η Chonkie και να υποστηρίξει αντίστοιχα προηγμένες προσεγγίσεις, όπως η ανάκτηση βάσει συμφραζομένων της Anthropic.
2) Πρώτα το κείμενο, όχι η πολυτροπικότητα.
Πολλά ενδιαφέροντα προβλήματα RAG δεν αφορούν πλέον αποκλειστικά κείμενο:
PDF με διαγράμματα
στιγμιότυπα οθόνης / εικόνες
ηχογραφήσεις
αποσπάσματα βίντεο
Ακόμη κι αν μπορείτε να «εξαγάγετε κείμενο» από αυτές τις πηγές, αυτό δεν ισοδυναμεί με μια πραγματικά πολυτροπική ροή δημιουργίας embeddings.
Αν το pgai υποστηρίξει τελικά πολυτροπικά μοντέλα από άκρο σε άκρο (φόρτωση → κατάτμηση → δημιουργία embeddings για μεγάλες εικόνες, αρχεία ήχου και βίντεο αποθηκευμένα στο S3, με αξιόπιστο συγχρονισμό), θα είναι ιδιαίτερα ελκυστικό. Σήμερα, όμως, αποτελεί μια ροή δημιουργίας embeddings κειμένου.
3) Αν χρειάζεστε μόνο embeddings, ίσως να μη χρειάζεστε το pgai.
Αν η ροή εισαγωγής σας είναι ήδη προσαρμοσμένη —ή πρέπει να είναι— τότε η «δημιουργία embeddings από τμήματα κειμένου» δεν είναι το δυσκολότερο μέρος του RAG. Σε αυτή την περίπτωση, το pgai λύνει το ευκολότερο μέρος του προβλήματος.
Επίσης, αν η γνωσιακή βάση σας ενημερώνεται σπάνια, η αξία του αυτόματου συγχρονισμού των embeddings είναι μικρότερη.
Ένας ιδιαίτερα καλός τρόπος χρήσης του pgai θα ήταν η ανάπτυξη μιας διεπαφής text-to-SQL πάνω από τις βάσεις δεδομένων σας. Αυτό επιτυγχάνεται αρκετά εύκολα με τη μονάδα semantic_catalog που προσφέρει το pgai. Απλώς ρυθμίστε το ως εξής:
Bash
και χρησιμοποιήστε τον σημασιολογικό κατάλογο για να σαρώσετε τα λεξικά δεδομένων σας με την εντολή pgai semantic-catalog create. Έτσι δημιουργείται θεματικό πλαίσιο από τον χώρο αποθήκευσης δεδομένων σας, το οποίο μοιάζει κάπως έτσι:
Plain Text
Αυτό το θεματικό πλαίσιο είναι πλέον διαθέσιμο στο pgai με διάφορους τρόπους:
Μέσω σημασιολογικής αναζήτησης:
Αυτό το ερώτημα θα επιστρέψει τους πίνακες, τις συναρτήσεις και τα άλλα αντικείμενα που ενδέχεται να σχετίζονται με το ερώτημά σας σε φυσική γλώσσα:
Bash
Λήψη ανεπεξέργαστου θεματικού πλαισίου:
Αυτό θα εμφανίσει το ανεπεξέργαστο θεματικό πλαίσιο YAML που σχετίζεται με το ερώτημά σας σε φυσική γλώσσα:
Bash
Δημιουργία SQL:
Εναλλακτικά, μπορείτε να δημιουργήσετε απευθείας τον ανεπεξέργαστο κώδικα SQL που απαιτείται για να απαντηθεί το ερώτημά σας. Το θεματικό πλαίσιο από το προηγούμενο βήμα αποστέλλεται σε ένα LLM και δημιουργείται η απάντηση:
Bash
Αν δημιουργείτε ένα σχετικά απλό σύστημα RAG, αξίζει να δοκιμάσετε το pgai εφόσον θέλετε:
το Postgres ως επίσημη πηγή δεδομένων,
ελάχιστο συνδετικό κώδικα,
embeddings που παραμένουν αυτόματα συγχρονισμένα,
έναν γρήγορο τρόπο να εφαρμόσετε text-to-SQL στις βάσεις δεδομένων σας,
να πειραματιστείτε με νέα εργαλεία RAG και επεκτάσεις του Postgres.
Μάλλον αξίζει να περιμένετε πριν χρησιμοποιήσετε το pgai, αν η ροή RAG σας χρειάζεται κάποιο από τα εξής:
εκτεταμένη προσαρμοσμένη λογική εισαγωγής ή κατάτμησης
πολλούς τύπους εγγράφων με διαφορετικές απαιτήσεις ανάλυσης
πολυτροπικά embeddings
Τέλος, ενώ είναι σαφές ότι το pgvector έχει γνωρίσει ευρεία υιοθέτηση, δεν είναι ξεκάθαρο αν το pgai θα προσελκύσει το ίδιο ενδιαφέρον και, κατά συνέπεια, την ίδια υποστήριξη — αν και κυκλοφορεί μόλις εδώ και περίπου 18 μήνες.


Το pgai αποτελεί μια ενδιαφέρουσα προσέγγιση στο RAG, καθώς επιτρέπει στις βάσεις δεδομένων να αναλαμβάνουν περισσότερες από τις συνήθεις λειτουργικές εργασίες, ώστε ο κώδικας της εφαρμογής σας να παραμένει απλούστερος.
Αυτή τη στιγμή είναι:
χρηστικό και πραγματικά ευχάριστο για απλές υλοποιήσεις RAG
όχι αρκετά ευέλικτο για πιο εξειδικευμένες ροές, ιδίως πολυτροπικές
Είναι πολλά υποσχόμενο και σίγουρα αξίζει να παρακολουθήσουμε την εξέλιξή του.