Μπορεί το Postgres να διαχειριστεί τη ροή RAG σας;

Δοκιμάσαμε την προσέγγιση του pgai με επίκεντρο τη βάση δεδομένων, για να δούμε πού απλοποιεί τις λειτουργίες RAG και πού οι σύνθετοι φόρτοι εργασίας εξακολουθούν να απαιτούν μεγαλύτερη ευελιξία.

Σύνοψη

  • Τα LLM μπορούν να «δουν» μόνο περιορισμένη ποσότητα κειμένου κάθε φορά (το θεματικό πλαίσιο). Αυτό λειτουργεί για μικρές εργασίες, αλλά παύει να αποδίδει όταν μια γνωσιακή βάση εκτείνεται σε χιλιάδες σελίδες. Ακόμη κι όταν το θεματικό πλαίσιο επαρκεί, η απόδοση μπορεί να υποβαθμιστεί λόγω του προβλήματος «βελόνα στα άχυρα».

  • Το RAG («παραγωγή επαυξημένη με ανάκτηση») έχει αναδειχθεί σε ένα πολύ διαδεδομένο μοτίβο: διατηρείτε μια γνωσιακή βάση (έγγραφα, wiki, πολιτικές, απομαγνητοφωνήσεις κ.λπ.), εκτελείτε σημασιολογική αναζήτηση στο ερώτημα ενός χρήστη για να ανακτήσετε τα πιο σχετικά αποσπάσματα μέσω embeddings και, στη συνέχεια, τροφοδοτείτε το LLM με αυτά τα τμήματα μαζί με την ερώτηση. Έτσι περιορίζεται το θεματικό πλαίσιο του μοντέλου και, όταν η διαδικασία γίνεται σωστά, μπορεί να βελτιωθεί η ποιότητα των απαντήσεων και να μειωθούν οι ψευδαισθήσεις.

  • Το pgai είναι μια επέκταση ανοικτού κώδικα για το Postgres (μαζί με συνοδευτικά εργαλεία), η οποία σας βοηθά να δημιουργείτε ροές εργασιών «ανάκτησης με AI» πάνω στην αξιόπιστη βάση δεδομένων ανοικτού κώδικα PostgreSQL.

  • Η βασική ιδέα είναι να μεταφερθεί μεγαλύτερο μέρος της τυπικής ροής RAG στο επίπεδο της βάσης δεδομένων (εισαγωγή → κατάτμηση → δημιουργία embeddings → διατήρηση του συγχρονισμού τους), αντί η βάση να αντιμετωπίζεται ως «απλός χώρος αποθήκευσης» για embeddings.

  • Η πρώτη μας εντύπωση είναι ότι πρόκειται για μια πολλά υποσχόμενη λύση, η οποία όμως παύει να είναι κατάλληλη μόλις η ροή RAG γίνει έστω και λίγο σύνθετη, ιδίως ως προς τις προσεγγίσεις κατάτμησης. Θα παρακολουθούμε, πάντως, στενά αυτό το έργο.

Το μοτίβο RAG

Υπάρχουν πολλοί τρόποι να δημιουργήσετε ένα σύστημα RAG. Για μια πιο εκτενή ανάλυση των διαφορετικών προσεγγίσεων, διαβάστε το άρθρο Πρακτικά παραδείγματα προσαρμοσμένων λύσεων RAG. Οι σχεδιαστικές επιλογές αποκτούν εντυπωσιακό βάθος όταν σας ενδιαφέρει η ποιότητα, ενώ η συνηθισμένη «προεπιλεγμένη» προσέγγιση έχει γενικά την εξής μορφή:

  1. Συγκεντρώστε ένα σύνολο εγγράφων.

  2. Χωρίστε τα σε τμήματα. Υπάρχουν πολλές διαφορετικές μέθοδοι για να το κάνετε αυτό (π.χ. ανά παράγραφο ή σημασιολογική ομάδα).

  3. Μετατρέψτε κάθε τμήμα σε embedding.

  4. Αποθηκεύστε τα embeddings σε μια διανυσματική βάση δεδομένων (Pinecone, Milvus κ.λπ.) ή στο Postgres μέσω του pgvector.

  5. Κατά την υποβολή του ερωτήματος, αναζητήστε τα πλησιέστερα τμήματα `και περάστε τα στο LLM (και πάλι... υπάρχουν πολλοί τρόποι να γίνει και αυτό).

Σε πολλές στοίβες τεχνολογιών, τα βήματα (1)–(3) εκτελούνται εκτός βάσης δεδομένων, στον κώδικα της εφαρμογής ή σε μια ροή δεδομένων, και η βάση χρησιμοποιείται κυρίως για:

  • αποθήκευση embeddings

  • αναζήτηση embeddings

Ο σκοπός του pgai

Το pgai είναι μια επέκταση ανοικτού κώδικα για το Postgres, η οποία αναπτύχθηκε από την Timescale και επιχειρεί να αμβλύνει αυτή τη διάκριση.

Αντί να αντιμετωπίζει τα embeddings ως κάτι που διαχειρίζεται χειροκίνητα η εφαρμογή σας, το pgai τα καθιστά λειτουργία της βάσης δεδομένων:

  • Ορίζετε ποιον πίνακα ή ποια έγγραφα θέλετε να μετατρέψετε σε embeddings.

  • Καθορίζετε το μοντέλο embedding και μια στρατηγική κατάτμησης.

  • Το pgai διαχειρίζεται τα υπόλοιπα, διατηρώντας μεταξύ άλλων ενημερωμένα τα embeddings καθώς αλλάζουν τα δεδομένα προέλευσης.

Η υπόσχεση είναι ελκυστική:

  • Λιγότερος προσαρμοσμένος συνδετικός κώδικας που χρειάζεται συντήρηση.

  • Θα πρέπει να είναι ευκολότερο να παραμένουν τα embeddings «ενημερωμένα» καθώς αλλάζουν τα έγγραφα προέλευσης.

  • Το Postgres/pgai διαχειρίζεται τις επαναλήψεις, τα όρια ρυθμού, τις αποτυχημένες εργασίες κ.λπ.

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

Πρώτες εντυπώσεις από το pgai

Τι μας άρεσε

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 είναι μικρότερη.

Επίπεδο text-to-SQL

Ένας ιδιαίτερα καλός τρόπος χρήσης του pgai θα ήταν η ανάπτυξη μιας διεπαφής text-to-SQL πάνω από τις βάσεις δεδομένων σας. Αυτό επιτυγχάνεται αρκετά εύκολα με τη μονάδα semantic_catalog που προσφέρει το pgai. Απλώς ρυθμίστε το ως εξής:

Bash

OPENAI_API_KEY="your-OpenAPI-key-goes-here"TARGET_DB="postgres://user:password@host:port/database"CATALOG_DB="postgres://user:password@host:port/database"

και χρησιμοποιήστε τον σημασιολογικό κατάλογο για να σαρώσετε τα λεξικά δεδομένων σας με την εντολή pgai semantic-catalog create. Έτσι δημιουργείται θεματικό πλαίσιο από τον χώρο αποθήκευσης δεδομένων σας, το οποίο μοιάζει κάπως έτσι:

Plain Text

---schema: postgres_airname: aircrafttype: tabledescription: Lists aircraft models with performance characteristics and unique codes.columns:- name: model  description: Commercial name of the aircraft model.- name: range  description: Maximum flight range in kilometers.- name: class  description: Airframe class category or configuration indicator.- name: velocity  description: Cruising speed of the aircraft.- name: code  description: Three-character aircraft code serving as the primary key....

Αυτό το θεματικό πλαίσιο είναι πλέον διαθέσιμο στο pgai με διάφορους τρόπους:

Μέσω σημασιολογικής αναζήτησης:

Αυτό το ερώτημα θα επιστρέψει τους πίνακες, τις συναρτήσεις και τα άλλα αντικείμενα που ενδέχεται να σχετίζονται με το ερώτημά σας σε φυσική γλώσσα:

Bash

pgai semantic-catalog search -p "Your natural language question goes here!"

Λήψη ανεπεξέργαστου θεματικού πλαισίου:

Αυτό θα εμφανίσει το ανεπεξέργαστο θεματικό πλαίσιο YAML που σχετίζεται με το ερώτημά σας σε φυσική γλώσσα:

Bash

pgai semantic-catalog search -p "Your natural language question goes here!" --render

Δημιουργία SQL:

Εναλλακτικά, μπορείτε να δημιουργήσετε απευθείας τον ανεπεξέργαστο κώδικα SQL που απαιτείται για να απαντηθεί το ερώτημά σας. Το θεματικό πλαίσιο από το προηγούμενο βήμα αποστέλλεται σε ένα LLM και δημιουργείται η απάντηση:

Bash

pgai semantic-catalog generate-sql -p "Your natural language question goes here!"

Πώς μπορείτε να χρησιμοποιήσετε το pgai σήμερα

Αν δημιουργείτε ένα σχετικά απλό σύστημα RAG, αξίζει να δοκιμάσετε το pgai εφόσον θέλετε:

  • το Postgres ως επίσημη πηγή δεδομένων,

  • ελάχιστο συνδετικό κώδικα,

  • embeddings που παραμένουν αυτόματα συγχρονισμένα,

  • έναν γρήγορο τρόπο να εφαρμόσετε text-to-SQL στις βάσεις δεδομένων σας,

  • να πειραματιστείτε με νέα εργαλεία RAG και επεκτάσεις του Postgres.

Πού θα ήμασταν επιφυλακτικοί

Μάλλον αξίζει να περιμένετε πριν χρησιμοποιήσετε το pgai, αν η ροή RAG σας χρειάζεται κάποιο από τα εξής:

  • εκτεταμένη προσαρμοσμένη λογική εισαγωγής ή κατάτμησης

  • πολλούς τύπους εγγράφων με διαφορετικές απαιτήσεις ανάλυσης

  • πολυτροπικά embeddings

Τέλος, ενώ είναι σαφές ότι το pgvector έχει γνωρίσει ευρεία υιοθέτηση, δεν είναι ξεκάθαρο αν το pgai θα προσελκύσει το ίδιο ενδιαφέρον και, κατά συνέπεια, την ίδια υποστήριξη — αν και κυκλοφορεί μόλις εδώ και περίπου 18 μήνες.

Γράφημα ιστορικού αστεριών στο GitHub που δείχνει την υιοθέτηση του pgai της Timescale με την πάροδο του χρόνου.

Σύνοψη

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

Αυτή τη στιγμή είναι:

  • χρηστικό και πραγματικά ευχάριστο για απλές υλοποιήσεις RAG

  • όχι αρκετά ευέλικτο για πιο εξειδικευμένες ροές, ιδίως πολυτροπικές

Είναι πολλά υποσχόμενο και σίγουρα αξίζει να παρακολουθήσουμε την εξέλιξή του.

Συντάκτης

Andrew Liubinas