Photon: Κατασκευή μηχανής ανάκτησης και κατάταξης από την αρχή
Πώς οι εξειδικευμένες μορφές δεδομένων, οι αναγνώσεις σε παρτίδες και ο διαχωρισμός της κατασκευής δείκτη από την εξυπηρέτηση βελτιώνουν την αναζήτηση AI.
Εισαγωγή
Η στοίβα αναζήτησης με προτεραιότητα την τεχνητή νοημοσύνη της Perplexity ανακτά και κατατάσσει σελίδες υποψηφίων, φέρνοντας στην επιφάνεια το πιο σχετικό περιεχόμενο για να θεμελιώσει το μοντέλο τις απαντήσεις του. Αρχικά, αυτό το στάδιο εκτελούνταν σε μια μηχανή ανοιχτού κώδικα που προσαρμόσαμε στο σύστημά μας. Ωστόσο, καθώς ο δείκτης και οι φόρτους εργασίας μας αυξάνονταν, φτάσαμε σε σκληρά όρια στο κόστος, την καθυστέρηση ουράς και τον χρόνο ανάκαμψης κόμβων που δεν μπορούσαμε να επιλύσουμε εντός της υπάρχουσας πλατφόρμας τρίτων.
Για να ξεπεράσουμε αυτές τις προκλήσεις, κατασκευάσαμε το Photon, μια νέα εσωτερική μηχανή ανάκτησης και κατάταξης. Αυτό συνεχίζει την προσέγγισή μας να κατασκευάζουμε υποδομή αναζήτησης με προτεραιότητα την τεχνητή νοημοσύνη από την αρχή, όπως κάναμε με το CobbleDB, το κατανεμημένο μας κατάστημα κλειδιών-τιμών για την εξυπηρέτηση εγγραφών σελίδων, και το Search API μας.
Το Photon χρησιμοποιεί συμπαγή μορφότυπα δεδομένων για να διαβάζει και να αποκωδικοποιεί μόνο ό,τι χρειάζεται κάθε ερώτημα, με προσωρινή αποθήκευση ευαισθητοποιημένη στις παρτίδες και ασύγχρονες αναγνώσεις για τη μείωση της πρόσβασης στον δίσκο και την επικάλυψη των αναμονών. Η κατασκευή δεικτών εκτελείται χωριστά από την εξυπηρέτηση ερωτημάτων, ενημερώνοντας μία ομάδα εξυπηρέτησης τη φορά και προθερμαίνοντας τις κρυφές μνήμες της πριν δρομολογήσει ζωντανά ερωτήματα σε αυτήν.
Το Photon τροφοδοτεί πλέον τον αγωγό αναζήτησής μας και αποτελεί επίσης τη βάση μιας νέας γρήγορης προρύθμισης για το API αναζήτησής μας, με καθυστέρηση μίας κλήσης αναζήτησης 160 ms στο p50 και 230 ms στο p95. Σε έξι δημόσια πρότυπα αναφοράς, η γρήγορη προρύθμιση μείωσε το εκτιμώμενο κόστος μοντέλου συν αναζήτησης ανά εργασία κατά 68%, διατηρώντας παράλληλα συνολική ποιότητα εργασίας συγκρίσιμη με την προεπιλεγμένη ρύθμιση. Το κυκλοφορούμε σήμερα ώστε οι προγραμματιστές να μπορούν να έχουν πρόσβαση σε αυτές τις βελτιώσεις.
Τι απαιτεί η μηχανή ανάκτησης και κατάταξης
Για κάθε ερώτημα, η μηχανή ανάκτησης και κατάταξης αναζητά έναν μεγάλο, κατανεμημένο δείκτη για να επιλέξει και να ταξινομήσει ένα μικρό σύνολο σχετικών σελίδων εντός του προϋπολογισμού καθυστέρησης της στοίβας αναζήτησης. Το σύστημα πρέπει επίσης να διατηρεί τον δείκτη ενημερωμένο καθώς φτάνουν νέες σελίδες και υπάρχουσες σελίδες αλλάζουν, χωρίς να αφήνει αυτήν την εργασία να επιβραδύνει τα ζωντανά ερωτήματα.
Αξιολογήσαμε διάφορες επιλογές ανοιχτού κώδικα και επιλέξαμε μια ώριμη, γενικής χρήσης μηχανή ανάκτησης και κατάταξης που ικανοποιούσε τις αρχικές μας ανάγκες. Στη συνέχεια, την προσαρμόσαμε στην αρχιτεκτονική και τους φόρτους εργασίας μας, διατηρώντας σταθερή καθυστέρηση και απόδοση σε κλίμακα παραγωγής.
Πού υστέρησε το προηγούμενο σύστημά μας
Διατηρήσαμε το δικό μας fork για να προσαρμόσουμε τη μηχανή στον αυξανόμενο δείκτη μας, αλλά η αντιμετώπιση βασικών περιορισμών απαιτούσε ολοένα και περισσότερο τον επανασχεδιασμό μεγάλων τμημάτων της πλατφόρμας. Αρκετοί περιορισμοί αποδείχθηκαν δύσκολο να επιλυθούν χωρίς θεμελιώδεις αρχιτεκτονικές αλλαγές:
1. Κόστη κλιμάκωσης. Τόσο ο αριθμός των εγγράφων που αποθηκεύουμε όσο και η ποσότητα των δεδομένων ανά έγγραφο που πρέπει να ανακτήσουμε και να βαθμολογήσουμε έχουν αυξάνεται με τον χρόνο. Αυτή η κλιμάκωση άσκησε πίεση στο hardware μας, ειδικά στην ποσότητα RAM που είναι διαθέσιμη. Για να ελέγξουμε τα κόστη, χρειαζόμασταν πιο συμπαγείς αναπαραστάσεις δεδομένων και λεπτότερο έλεγχο στο τι παραμένει στη μνήμη και τι διαβάζεται από τον δίσκο κατ' απαίτηση.
2. Κακή καθυστέρηση ουράς. Στην κίνηση παραγωγής, ο χρόνος απόκρισης p99 του παλιού συστήματος ήταν περίπου 800 ms. Το σύνολο δεδομένων υπερέβαινε τη διαθέσιμη RAM, οπότε δεν μπορούσαμε να χρησιμοποιήσουμε το mlock για να το διατηρήσουμε εξ ολοκλήρου στη μνήμη. Η πρόσβαση σε δεδομένα εκτός μνήμης μπορούσε να προκαλέσει σημαντικά σφάλματα σελίδας, καθυστερώντας την εκτέλεση ερωτημάτων ενώ το λειτουργικό σύστημα διάβαζε από τον δίσκο.
Η μηχανή συγχώνευε επίσης περιοδικά τον κύριο δείκτη δίσκου της με μικρότερους δείκτες που ξεπλένονταν από τη μνήμη. Κατά τη διάρκεια αυτής της διαδικασίας σύντηξης δείκτη δίσκου, ο αριθμός των σφαλμάτων σελίδας αυξήθηκε ακόμη περισσότερο, με την καθυστέρηση p99 να φτάνει περίπου τα 1,2 s για 10–15 λεπτά. Καθώς οι κρυφές μνήμες ζεσταίνονταν, η συχνότητα των σφαλμάτων σελίδας και η καθυστέρηση μειώθηκαν, υποδηλώνοντας ότι οι κρύες αναγνώσεις ήταν βασικός συντελεστής στις αιχμές. Η προφόρτωση δεδομένων και η θέρμανση του δείκτη μείωσαν τις αιχμές αλλά δεν αντιμετώπισαν επαρκώς την υψηλή καθυστέρηση ουράς.
3. Μακροχρόνια ανάκαμψη και συγχρονισμός. Στο προηγούμενο σύστημα, η ανάπτυξη ενός επιπλέον συμπλέγματος και ο συγχρονισμός των δεδομένων του μπορούσε να διαρκέσει περισσότερο από μία εβδομάδα. Απαιτούταν επίσης συγχρονισμός κατά την προσθήκη ομάδων κόμβων για τη διατήρηση επιπλέον αντιγράφων δεδομένων ή την ανάκαμψη από αποτυχίες κόμβων. Κατά την ανάκαμψη, μεγαλύτερο μερίδιο των αποκρίσεων αναζήτησης ήταν μερικό, γεγονός που μείωνε τις βαθμολογίες ποιότητας τελικής απάντησης.
Τελικά, καταλήξαμε στο συμπέρασμα ότι θα ήταν απλούστερο και φθηνότερο να κατασκευάσουμε κάτι από την αρχή παρά να συνεχίσουμε να προσαρμόζουμε και να συντηρούμε το fork μας. Αξιοποιώντας την εμπειρία μας από τη λειτουργία του προηγούμενου συστήματος, μια μικρή ομάδα μηχανικών εργάστηκε δίπλα-δύο σε ένα σμήνος επιμένων πράκτορων κώδικα για να κατασκευάσει το Photon.
Πού ταιριάζει το Photon στη στοίβα αναζήτησης
Το Photon έχει σχεδιαστεί για δύο βασικές ροές εργασίας: την εξυπηρέτηση αιτημάτων αναζήτησης και την πρόσληψη ενημερώσεων από τον αγωγό επεξεργασίας.
Ένα αίτημα από την υπηρεσία αναζήτησης ανώτερου επιπέδου φτάνει στον broker του Photon μέσω ενός εξισορροπητή φορτίου. Ο broker επιλέγει μια ομάδα θραυσμάτων και προωθεί το αίτημα σε κάθε θραύσμα, παρακολουθώντας τα χρονικά όρια και εκδίδοντας πρόσθετα αιτήματα όταν χρειάζεται.
Κάθε θραύσμα εκτελεί ανάκτηση, αρχική κατάταξη και κατάταξη δεύτερου σταδίου, και στη συνέχεια επιστρέφει τους καλύτερους υποψηφίους του στον broker. Ο broker συνδυάζει αυτούς τους υποψηφίους σε μια ενιαία ταξινομημένη λίστα και ανακτά βασικά πεδία εγγράφων για τις επιλεγμένες σελίδες από τα σχετικά θραύσματα. Στη συνέχεια, επιστρέφει αυτά τα αποτελέσματα στην υπηρεσία αναζήτησης ανώτερου επιπέδου, η οποία συγκεντρώνει το περιεχόμενο σελίδας που απαιτείται για να δημιουργήσει ο πράκτορας μια θεμελιωμένη απάντηση.
Οι ενημερώσεις δεικτών ακολουθούν μια ξεχωριστή διαδρομή. Το Pillar, το στρώμα δημοσίευσής μας, προετοιμάζει τα δεδομένα και τα αποθηκεύει σε πίνακες YTsaurus. Οι indexers μετατρέπουν αυτούς τους πίνακες σε δομές δείκτη που τα θραύσματα μπορούν να φορτώσουν για αναζήτηση. Ο ελεγκτής συντονίζει την προετοιμασία δεδομένων, την κατασκευή δεικτών και την ανάπτυξη νέων εκδόσεων δείκτη σε ομάδες εξυπηρέτησης. Πριν χειριστεί ζωντανή κίνηση, κάθε θραύσμα επαναλαμβάνει πραγματικά ερωτήματα αναζήτησης για να προθερμάνει τις κρυφές μνήμες του.
Σχεδιασμός του Photon για τις ροές εργασίας μας
Τρεις σχεδιαστικές επιλογές καθιστούν το Photon κατάλληλο για το workload μας: συμπαγείς αναπαραστάσεις δεδομένων, caching και ασύγχρονες αναγνώσεις από δίσκο, και διαχωρισμός των ενημερώσεων του index από την εξυπηρέτηση των ερωτημάτων.
Αναπαραστάσεις δεδομένων για ανάκτηση και κατάταξη
Η ανάκτηση και η κατάταξη προσπελαύνουν τα δεδομένα εγγράφων με διαφορετικό τρόπο. Η λεξική ανάκτηση ξεκινά με όρους ερωτήματος και βρίσκει έγγραφα που τους περιέχουν. Στη συνέχεια, η κατάταξη χρειάζεται λεπτομερείς πληροφορίες σχετικά με κάθε επιλεγμένο έγγραφο, συμπεριλαμβανομένων συχνοτήτων όρων και θέσεων.
Το Photon χρησιμοποιεί δύο συμπληρωματικές αναπαραστάσεις για να υποστηρίξει αυτά τα μοτίβα πρόσβασης. Ένας ανεστραμμένος δείκτης αποθηκεύει μια λίστα ταιριαστών εγγράφων για κάθε όρο, που ονομάζεται λίστα δημοσίευσης, για να υποστηρίξει την επιλογή υποψηφίων. Ξεχωριστές εγγραφές ανά έγγραφο παρέχουν τα δεδομένα που απαιτούνται για την κατάταξη. Βελτιστοποιούμε επίσης τον τρόπο αποθήκευσης και διέλευσης των λιστών δημοσίευσης για να βελτιώσουμε την επιλογή εντός σταθερού προϋπολογισμού εργασίας.
Οι εξειδικευμένες αναπαραστάσεις δεδομένων μας επιτρέπουν να αποθηκεύουμε βασικά δεδομένα πιο αποτελεσματικά. Ένας πιο συμπαγής ανεστραμμένος δείκτης μειώνει την ποσότητα των δεδομένων που διαβάζονται ή μετακινούνται ανά ερώτημα, βελτιώνοντας την καθυστέρηση εξαλείφοντας περιττές λειτουργίες I/O. Αυτές οι μορφές καθιστούν επίσης δυνατό τον έλεγχο του κατά πόσον ένα έγγραφο εμφανίζεται σε μια λίστα χωρίς την πλήρη αποκωδικοποίησή του, μια ιδιότητα στην οποία βασίζεται η λογική διέλευσής μας για να ελέγχει πόση εργασία κάνει ένα ερώτημα υπό σταθερό προϋπολογισμό. Η βελτιστοποίηση των εγγραφών ανά έγγραφο επιτρέπει την αποθήκευση περισσότερων δεδομένων ανά έγγραφο για κατάταξη, μειώνοντας παράλληλα το κόστος κλιμάκωσης που σχετίζεται με το προηγούμενο σύστημά μας.
Ο ανεστραμμένος δείκτης
Για κάθε όρο, ο ανεστραμμένος δείκτης αποθηκεύει μια λίστα δημοσίευσης. Αυτές οι λίστες μπορεί να κυμαίνονται από μερικά έγγραφα έως εκατομμύρια, επομένως καμία ενιαία μορφή δεν λειτουργεί καλά για κάθε λίστα. Το Photon επιλέγει τη μορφή με βάση τον αριθμό των εγγράφων που περιέχουν τον όρο.
Οι σύντομες λίστες χρησιμοποιούν μια ενσωματωμένη αναπαράσταση που χωράει σε μία μόνο σελίδα και δεν απαιτεί πίνακα αποκλεισμού. Οι μεγαλύτερες λίστες που δεν ταιριάζουν στην ενσωματωμένη μορφή χωρίζονται σε μπλοκ που καλύπτουν σταθερά εύρη αναγνωριστικών εγγράφων. Η αναπαράσταση κάθε μπλοκ εξαρτάται από την πυκνότητά του: τα αραιά μπλοκ αποθηκεύουν ταξινομημένους πίνακες μετατοπίσεων αναγνωριστικού εγγράφου, ενώ τα πυκνά μπλοκ χρησιμοποιούν bitmap. Τα αραιά μπλοκ χρησιμοποιούν αναζήτηση galloping, η οποία προχωρά με ολοένα μεγαλύτερα βήματα για να παραλείψει περιοχές της λίστας. Τα πυκνά μπλοκ επιτρέπουν ελέγχους μέλους κοιτάζοντας το bit που αντιστοιχεί σε ένα έγγραφο.
Η συχνότητα με την οποία αναζητείται ένας όρος καθορίζει πού τοποθετείται στο δίσκο η posting list του. Οι λίστες που αναζητούνται συχνά αποθηκεύονται κοντά η μία στην άλλη, συγκεντρώνοντας τα hot data σε μια μικρότερη περιοχή αποθήκευσης. Μέσα σε κάθε λίστα, τα έγγραφα ταξινομούνται με βάση ένα ξεχωριστό σήμα χρησιμότητας, ώστε να συναντώνται νωρίτερα οι πιο υποσχόμενοι υποψήφιοι.
Διέλευση λιστών εντός προϋπολογισμού εργασίας
Η επιλογή υποψηφίων απαιτεί τη διέλευση λιστών δημοσίευσης για την εύρεση πιθανώς σχετικών εγγράφων. Η εξαντλητική σάρωση κάθε λίστας είναι ακριβή, επομένως το Photon χρησιμοποιεί έναν αλγόριθμο παρόμοιο με WAND που διασχίζει μόνο ορισμένες λίστες ενώ εξακολουθεί να λαμβάνει υπόψη ταιριάσματα στις άλλες.
Ο αλγόριθμος χωρίζει τις λίστες σε δύο ομάδες. Οι λίστες οδήγησης προάγουν τη διέλευση και προτείνουν έγγραφα υποψηφίων. Οι λίστες ανίχνευσης συνεισφέρουν στις βαθμολογίες αυτών των υποψηφίων αλλά δεν παράγουν υποψηφίους οι ίδιες.
Η βαθμολογία υποψηφίων συνδυάζει σταθμισμένη κάλυψη όρων ερωτήματος και συνεισφορά συχνότητας, με κανονικοποίηση μήκους εγγράφου και ανώτατο όριο στα κέρδη από επαναλαμβανόμενους όρους. Το Photon ελέγχει πρώτα την παρουσία όρων στους πίνακες και τα bitmap για να οριοθετήσει τη μέγιστη δυνατή βαθμολογία κάθε υποψηφίου. Διαβάζει ακριβείς συχνότητες όρων μόνο για υποψηφίους που θα μπορούσαν ακόμα να ικανοποιήσουν το όριο επιλογής.
Η επιλογή προχωρά στη συνέχεια σε τρία βήματα:
- Διέλευση: Ξεκινήστε με αυστηρή απαίτηση κάλυψης ερωτήματος. Εάν βρεθούν πολύ λίγοι υποψήφιοι, επαναλάβετε με χαλαρή απαίτηση.
- Διατήρηση: Οι υποψήφιοι διατηρούνται σε ένα οριοθετημένο σύνολο χρησιμοποιώντας μια βαθμολογία που συνδυάζει κάλυψη και συχνότητα. Καθώς οι συλλεγόμενοι κορυφαίοι υποψήφιοι βελτιώνονται, το όριο αποδοχής αυξάνεται.
- Τελική επιλογή: Τα τελικά αποτελέσματα για το πέρασμα επιλέγονται από το διατηρημένο σύνολο με βάση τις βαθμολογίες συχνότητας. Κάθε πεδίο εκτελεί το δικό του πέρασμα και τα αποτελέσματα συγχωνεύονται χρησιμοποιώντας βάρη πεδίων.
Ο αλγόριθμος παράγει ένα σύνολο υποψηφίων σχετικών εγγράφων που θα χρησιμοποιηθούν σε περαιτέρω κατάταξη.
Docblob
Αφού επιλεγούν οι σελίδες υποψηφίων, η φάση κατάταξης απαιτεί συχνότητες όρων, κάλυψη πεδίων και τις τοποθεσίες και την εγγύτητα των εμφανίσεων. Η λήψη αυτών των δεδομένων μέσω του ανεστραμμένου δείκτη θα απαιτούσε σκόρπιες προσπελάσεις σε πολλά ζεύγη όρου-εγγράφου. Στο Photon, αποθηκεύουμε μια συμπαγή εγγραφή ανά έγγραφο που ονομάζεται docblob και περιέχει συχνότητες όρων, σε ποια πεδία εμφανίστηκε ένας όρος και πού στο έγγραφο συνέβη. Ως αποτέλεσμα, η κατάταξη ενός υποψηφίου απαιτεί μόνο μία αναζήτηση ανά έγγραφο.
Η μορφή είναι κατασκευασμένη για να αποφεύγει την αποκωδικοποίηση περισσότερο από ό,τι είναι απαραίτητο. Εντός ενός docblob, τα πεδία ομαδοποιούνται ανά αναλυτή κειμένου. Κάθε ομάδα αποθηκεύει μια ταξινομημένη λίστα όρων κωδικοποιημένη με Elias-Fano, ώστε να είναι δυνατή η απευθείας αναζήτηση ενός όρου ερωτήματος χωρίς την προηγούμενη επέκταση ολόκληρης της λίστας. Μια μάσκα πεδίου σηματοδοτεί πού εμφανίστηκε ένας όρος, μια μέτρηση συχνότητας παρακολουθεί πόσο συχνά, και οι πραγματικές θέσεις βρίσκονται σε ξεχωριστά μπλοκ ανά ζεύγος όρου-πεδίου κωδικοποιημένα ως διαφορές θέσης. Μόνο τα μπλοκ για όρους που ταιριάζουν πραγματικά αποκωδικοποιούνται, ενώ οτιδήποτε άλλο στην εγγραφή παραμένει στη συμπιεσμένη μορφή.
Αυτή η επιλεκτική αποκωδικοποίηση επιτρέπει στο docblob να υποστηρίζει την αποθήκευση περισσότερων δεδομένων ανά έγγραφο χωρίς ανάλογη αύξηση του κόστους. Η αύξηση της εγγραφής δεν αναγκάζει σε περισσότερη εργασία ανά αναζήτηση, επειδή η κατάταξη αγγίζει πάντα μόνο τα κομμάτια που σχετίζονται με τους όρους που ταιριάζουν αντί για ολόκληρη την εγγραφή.
Αναγνώσεις σε παρτίδες και εργασία με τη μνήμη
Ακόμη και με τις πιο αποδοτικές αναπαραστάσεις δεδομένων, η RAM εξακολουθεί να εξαντλείται πριν από άλλους πόρους, επομένως συχνά πρέπει να προσπελάσουμε δεδομένα αποθηκευμένα στον δίσκο. Το Photon χρησιμοποιεί ασύγχρονες αναγνώσεις δίσκου και μια κρυφή μνήμη βελτιστοποιημένη για αναγνώσεις παρτίδων για να επιταχύνει αυτές τις προσπελάσεις, μειώνοντας τον χρόνο αναμονής ανά αίτημα. Αυτό συμβάλλει σε μια σημαντική βελτίωση στην καθυστέρηση ουράς σε σύγκριση με το προηγούμενο σύστημα.
Επικαλυπτόμενες αναμονές δίσκου
Η κατάταξη απαιτεί τη λήψη των χαρακτηριστικών εκατό εγγράφων που βρίσκονται σε διαφορετικά μέρη ενός αρχείου. Το προηγούμενο σύστημά μας χρησιμοποιούσε το mmap για να χαρτογραφήσει το αρχείο σε χώρο εικονικών διευθύνσεων ώστε να μπορεί να διαβαστεί μέσω δεικτών μνήμης. Ωστόσο, η πρόσβαση σε μια σελίδα που απουσίαζε από τη μνήμη απαιτούσε εξακολουθητικά ανάγνωση δίσκου. Το νήμα έπρεπε να περιμένει τα δεδομένα προτού συνεχίσει τον υπολογισμό, και αυτός ο χρόνος αναμονής συσσωρευόταν όταν η διεργασία χρειαζόταν να διαβάσει κρύες εγγραφές διαδοχικά.
Το Photon αξιοποιεί το γεγονός ότι οι μετατοπίσεις εγγραφών είναι γνωστές εκ των προτέρων, ώστε να μπορούμε να υποβάλουμε πολλές αναγνώσεις ταυτόχρονα. Αυτό το διαχειρίζεται ο reactor: ειδικά νήματα εργαζομένων υποβάλλουν παρτίδες μέσω του io_uring και περνούν τα δεδομένα που διαβάζουν στον κώδικα που τα καλεί. Κάθε νήμα διατηρεί το δικό του io_uring· οι παρτίδες αποστέλλονται στον reactor με το μικρότερο φορτίο. Οι προεγγεγραμμένοι περιγραφείς αρχείων και οι δεξαμενές buffers μειώνουν το κόστος επαναλαμβανόμενων αναγνώσεων. Αυτή η ασύγχρονη εκτέλεση επιτρέπει να επικαλύπτονται οι αναμονές για πολλές λειτουργίες, μειώνοντας την καθυστέρηση ουράς.
Μείωση του αριθμού προσπελάσεων μονάδας δίσκου
Πριν υποβάλλει αναγνώσεις, το Photon ελέγχει ολόκληρη την παρτίδα στην κρυφή μνήμη εντός μνήμης. Μόνο τα αιτήματα για εγγραφές που λείπουν πηγαίνουν στον δίσκο· τα δεδομένα που διαβάζονται γεμίζουν στη συνέχεια την κρυφή μνήμη.
Η κρυφή μνήμη έχει σχεδιαστεί για αναγνώσεις σε παρτίδες. Συγκεκριμένα:
- Δεν υπάρχει ξεχωριστή κατανομή σε μια επιτυχία. Αντίθετα, τα δεδομένα αντιγράφονται σε ένα buffer που προετοιμάζεται εκ των προτέρων από τον κώδικα κλήσης.
- Δεν υπάρχει απόκτηση κλειδώματος από τον αναγνώστη. Αντίθετα, ελέγχει την έκδοση δεδομένων και δοκιμάζει ξανά εάν υπάρχει διένεξη με μια εγγραφή.
- Χρησιμοποιεί εκδίωξη CLOCK, αντί να απαιτεί ενημερώσεις σε μια κοινόχρηστη λίστα LRU σε κάθε ανάγνωση.
- Χρησιμοποιεί προανάκτηση κρυφής μνήμης CPU, όπου τα μεταδεδομένα και τα δεδομένα για επερχόμενες εγγραφές ζητούνται εκ των προτέρων.
Αυτές οι βελτιστοποιήσεις μειώνουν την καθυστέρηση χωρίς να βλάπτουν την απόδοση στους φόρτους εργασίας που μας ενδιαφέρουν.
Κατασκευή και ενημέρωση του δείκτη χωριστά από την εξυπηρέτηση
Στο Photon, η κατασκευή δεικτών και η εξυπηρέτηση ερωτημάτων εκτελούνται σε διαφορετικούς κόμβους. Οι indexers μετατρέπουν τα δεδομένα σε έτοιμες δομές αποθήκευσης, ενώ οι κόμβοι εξυπηρέτησης τα διαβάζουν και εκτελούν ανάκτηση και κατάταξη. Ως αποτέλεσμα, η κατασκευή δεικτών δεν ανταγωνίζεται τα ερωτήματα αναζήτησης για CPU, και οι πόροι για αυτές τις εργασίες μπορούν να κλιμακωθούν ανεξάρτητα.
Αυτός ο διαχωρισμός αντιμετωπίζει τα σημεία συμφόρησης ανάκαμψης και συγχρονισμού που υπήρχαν στην προηγούμενη υλοποίηση. Επειδή η κατασκευή δεικτών εκτελούνταν μέσα στο ίδιο σύμπλεγμα που εξυπηρετούσε ερωτήματα, η ανάκαμψη ενός αποτυχημένου κόμβου ή η προσθήκη ενός νέου αντιγράφου των δεδομένων μπορούσε να σημαίνει επαναδείκτωση εγγράφων στη θέση τους, μια διαδικασία που διαρκούσε μέρες και αύξανε τις μερικώς αποκρίσεις κατά την ανάκαμψη. Το Photon αφαιρεί αυτή τη σύζευξη· οι indexers εκτελούνται ως κατανεμημένες εργασίες που παράγουν δομές δεικτών με εκδόσεις, έτοιμες προς εξυπηρέτηση ανεξάρτητα από τους κόμβους εξυπηρέτησης, οπότε η κατασκευή της επόμενης έκδοσης του δείκτη δεν ανταγωνίζεται πλέον τη ζωντανή κίνηση.
Προετοιμασία και κατανεμημένη κατασκευή
Μια κατασκευή ξεκινά με την επιλογή εγγράφων για τον ενεργό δείκτη και την παραγωγή της εξαγωγής πηγής. Ο ελεγκτής καταγράφει την έκδοση πηγής, τους πίνακες εισόδου και τον αναμενόμενο αριθμό θραυσμάτων. Οι εργασίες MapReduce στο YTsaurus προετοιμάζουν κείμενο, μεταδεδομένα, θραύσματα, χαρακτηριστικά και προϋπολογισμένες ενσωματώσεις σε πίνακες με εκδόσεις κατακερματισμένους ανά θραύσμα. Κάθε indexer μεταδίδει σε ροή τον προετοιμασμένο πίνακα, κατασκευάζει τις δομές για το θραύσμά του και συγχωνεύει τμήματα κειμένου. Ο έτοιμος δείκτης, μαζί με μια περιγραφή των στοιχείων του, μεταφορτώνεται στην αποθήκευση αντικειμένων.
Ο αριθμός θραυσμάτων και ο αριθμός των ταυτόχρονα εκτελούμενων indexers διαμορφώνονται ανεξάρτητα, επομένως μια κατασκευή μπορεί να εκτελεστεί σε διάφορα κύματα ή περισσότερα μηχανγάματα μπορούν να κατανεμηθούν για εργασία παράλληλα. Η κατανεμημένη προετοιμασία και οι παράλληλοι indexers επιτρέπουν την κατασκευή ολόκληρου του δείκτη ιστού σε μονοψήφιο αριθμό ωρών, μια σημαντική βελτίωση σε σχέση με το προηγούμενο σύστημα.
Ανάπτυξη μιας νέας έκδοσης
Πριν από την ανάπτυξη, ο ελεγκτής ελέγχει ότι ο νέος δείκτης είναι έτοιμος. Εάν τα δεδομένα είναι ελλιπή, η ανάπτυξη αποκλείεται αυτόματα.
Όταν υπάρχουν πολλαπλές ομάδες εξυπηρέτησης, ο ελεγκτής τις ενημερώνει μία κάθε φορά. Αρχικά αφαιρεί μια ομάδα από τη δρομολόγηση του broker και την ξεκινά στη νέα έκδοση δείκτη. Πριν εξυπηρετήσει αιτήματα, τα θραύσματα περνούν από ένα ξεχωριστό στάδιο προθέρμανσης με βάση τα αρχεία καταγραφής αναζήτησης, το οποίο προγεμίζει την αρχική κατάσταση και κάνει τη μετάβαση σε πραγματική κίνηση ομαλότερη. Μετά την προθέρμανση, ο ελεγκτής ελέγχει την κατάσταση του δείκτη και την ετοιμότητα, και στη συνέχεια επιστρέφει την ομάδα στη δρομολόγηση. Οι άλλες ομάδες συνεχίζουν να εξυπηρετούν αιτήματα κατά τη διάρκεια αυτού του χρόνου. Επειδή η κατάσταση λειτουργίας διατηρείται, μια επανεκκίνηση δεν αναγκάζει μια κατασκευή να ξεκινήσει από την αρχή· ο ελεγκτής μπορεί να επανασυνδεθεί στην προετοιμασία που βρίσκεται ήδη σε εξέλιξη, να επαναχρησιμοποιήσει ένα έτοιμο αποτέλεσμα ή να συνεχίσει μια διακοπείσα περιστροφή από το αποθηκευμένο βήμα.
Οι χρόνοι ενημέρωσης δεδομένων διαφέρουν μεταξύ των κάθετων αγορών αναζήτησης. Για κάθετες αγορές με υψηλές απαιτήσεις φρεσκάδας, η παράδοση εγγράφων διαρκεί μονοψήφιο αριθμό λεπτών. Ένα επιπλέον αντίγραφο των δεδομένων μπορεί να αναπτυχθεί σε περίπου μισή ώρα· οι έτοιμοι δείκτες φορτώνονται και προσαρτώνται σε θραύσματα χωρίς επαναδείκτωση των πηγαίων εγγράφων.
Μετανάστευση και επικύρωση εντός της στοίβας αναζήτησής μας
Ο πρώτος μας στόχος ήταν να αντικαταστήσουμε το παλιό σύστημα με μια μηχανή που διατήρησε τη λειτουργικότητα και την ποιότητα αναζήτησης μειώνοντας παράλληλα τους χρόνους απόκρισης. Επικυρώσαμε το Photon σε στάδια, ξεκινώντας με αναπαραγώγιμες δοκιμές φορτίου και αξιολογήσεις ποιότητας εκτός σύνδεσης προτού προχωρήσουμε σε ζωντανή κίνηση. Το Photon τροφοδοτεί πλέον την ανάκτηση και την κατάταξη στη στοίβα αναζήτησης παραγωγής μας, με σημαντικά χαμηλότερους χρόνους απόκρισης από το παλιό σύστημα.
Δοκιμές φορτίου και αξιολογήσεις
Για δοκιμές απόδοσης, κατασκευάσαμε ένα εργαλείο δοκιμών φορτίου που επαναλαμβάνει ερωτήματα από τα αρχεία καταγραφής αναζήτησής μας σε διαμορφώσιμους ρυθμούς άφιξης. Συγκρίνει αποτελέσματα σε όλες τις εκτελέσεις και εφαρμόζει στατιστικές δοκιμές για να αξιολογήσει εάν οι παρατηρούμενες διαφορές απόδοσης είναι συνεπείς. Χωριστά, αξιολογήσαμε το Photon και το παλιό σύστημα στα ίδια σύνολα δεδομένων στα εσωτερικά μας συστήματα εκτός σύνδεσης αξιολόγησης για να ελέγξουμε για υποβαθμίσεις ποιότητας.
Μετά από αυτούς τους ελέγχους, στείλαμε ζωντανά ερωτήματα και στις δύο μηχανές ταυτόχρονα χρησιμοποιώντας κίνηση σκιάς. Αυτό μας επέτρεψε να συγκρίνουμε την απόδοσή τους και τα αποτελέσματα σε φόρτους εργασίας παραγωγής πριν αλλάξουμε ποια μηχανή εξυπηρετούσε τους χρήστες. Στη συνέχεια, ενεργοποιήσαμε το Photon για μικρά υποσύνολα χρηστών και επεκτείναμε σταδιακά την κυκλοφορία, παρακολουθώντας την ποιότητα και την απόδοση σε όλη τη διάρκεια. Η πρώτη έκδοση πέρασε τις δοκιμές αποδοχής χωρίς υποβαθμίσεις ποιότητας και συνεχίσαμε την κυκλοφορία έως ότου το Photon εξυπηρέτησε όλη την κίνηση παραγωγής.
Μετρημένες βελτιώσεις στην παραγωγή
Στη ροή εργασίας παραγωγής μας, ο χρόνος απόκρισης p99 έπεσε από περίπου 800 ms στο παλιό σύστημα σε περίπου 65 ms στο Photon. Αυτή η μέτρηση καλύπτει όλα τα στάδια εντός του Photon, αλλά εξαιρεί τα μεταγενέστερα στάδια στη στοίβα αναζήτησης ανώτερου επιπέδου. Επίσης, δεν παρατηρούμε πλέον τις αιχμές καθυστέρησης που σχετίζονταν προηγουμένως με την εναλλαγή εκδόσεων δείκτη.
Το Photon χρησιμοποιεί περίπου 20% λιγότερα ισοδύναμα μηχανγάματα εξυπηρέτησης από τους κόμβους περιεχομένου του παλιού συστήματος, αποθηκεύοντας παράλληλα περίπου 2,5 φορές περισσότερα δεδομένα ανά έγγραφο. Μετά τη μετανάστευση, χρησιμοποιήσαμε αυτά τα πρόσθετα δεδομένα για να βελτιώσουμε την ποιότητα κατάταξης πέρα από εκείνη του παλιού συστήματος.
Το Photon μειώνει επίσης την ποσότητα των δεδομένων που πρέπει να παραμείνουν στη μνήμη. Η δέσμευση του ίδιου συνόλου δεδομένων Photon στη RAM με mlock θα απαιτούσε εκτιμώμενη μνήμη κατοικίας 4,6 φορές μεγαλύτερη από ό,τι χρησιμοποιεί επί του παρόντος το Photon.
Αξιολόγηση της γρήγορης προρύθμισης Search API
Χρησιμοποιήσαμε επίσης το Photon ως βάση για μια νέα γρήγορη προρύθμιση για το API Αναζήτησής μας, σχεδιασμένη για φόρτους εργασίας ευαίσθητους στην καθυστέρηση. Σύμφωνα με τις μετρήσεις μας, η καθυστέρηση μίας κλήσης αναζήτησης για τη γρήγορη προρύθμιση είναι 160 ms στο p50 και 230 ms στο p95, χαμηλότερη από ή συγκρίσιμη με τους αυτοαναφερόμενους αριθμούς άλλων παρόχων API Αναζήτησης, αν και τα αναφερόμενα ποσοστημόρια ουράς διαφέρουν.
Αξιολογήσαμε τη γρήγορη προρύθμιση σε έξι πρότυπα αναφοράς πράκτορα: WideSearch, BrowseComp, DSQA, FRAMES, SEAL-0 και SEAL-Hard. Σε αυτές τις αξιολογήσεις, είχε το χαμηλότερο εκτιμώμενο συνολικό κόστος μοντέλου συν αναζήτησης και την υψηλότερη συνολική βαθμολογία εργασίας μεταξύ των διαμορφώσεων που δοκιμάστηκαν.
Η γρήγορη προρύθμιση συνδυάζει το Photon με κατάταξη βελτιστοποιημένη για ροές εργασίας πράκτορα, αποδίδοντας συγκρίσιμη απόδοση με την προεπιλεγμένη προρύθμιση σε σημαντικά χαμηλότερο κόστος. Ωστόσο, συνοδεύεται από έναν συμβιβασμό στην ευρύτερη ποιότητα αναζήτησης. Η γρήγορη προρύθμιση χρησιμοποιεί λιγότερη υπολογιστική ισχύ για κατάταξη από την προεπιλεγμένη προρύθμιση. Σε εσωτερικά πρότυπα αναφοράς που καλύπτουν ερωτήματα μακράς ουράς, ευρεία κάλυψη και ποικιλομορφία αποτελεσμάτων, βαθμολογείται 0,24 μονάδες χαμηλότερα σε συνάφεια και περίπου 3 ποσοστιαίες μονάδες χαμηλότερα σε διαθεσιμότητα απάντησης. Πιστεύουμε ότι αυτός είναι ένας λογικός συμβιβασμός για ροές εργασίας πράκτορα, καθώς ο συλλογισμός και η γνώση του ίδιου του μοντέλου μπορούν να βοηθήσουν στην αντιστάθμιση της διαφοράς.
Συνιστούμε τη γρήγορη προρύθμιση για καθημερινές εργασίες πράκτορα. Για πιο δύσκολες ή αμφίσημες ερωτήσεις που είναι λιγότερο ευαίσθητες στον χρόνο, η προεπιλεγμένη ρύθμιση προσφέρει πιο στιβαρή ποιότητα, δικαιολογώντας την υψηλότερη καθυστέρηση και κόστος.
Συμπέρασμα
Μεταφέρουμε σταθερά τη στοίβα αναζήτησής μας σε εσωτερική υποδομή βασισμένη σε Rust. Η αντικατάσταση της μηχανής ανοιχτού κώδικα με το Photon, τη δική μας προσαρμοσμένη μηχανή ανάκτησης και κατάταξης, είναι το πιο πρόσφατο βήμα. Το Photon μάς δίνει πλήρη έλεγχο στις αναπαραστάσεις δεδομένων, στον τρόπο οργάνωσης των αναγνώσεων και στον τρόπο ανάπτυξης νέων δεικτών, επιτρέποντάς μας να βελτιστοποιήσουμε κάθε στρώμα για τους φόρτους εργασίας μας.
Το Photon έχει επιτρέψει ταχύτερη αναζήτηση στα προϊόντα της Perplexity και παρέχει τη βάση για τη νέα μας γρήγορη προρύθμιση στο API Αναζήτησης. Μετά τη μετανάστευση, η καθυστέρηση ανάκτησης-και-κατάταξης p99 έπεσε από περίπου 800 ms σε 65 ms. Τα συμπαγή μορφότυπα δεδομένων μας επιτρέπουν επίσης να αποθηκεύουμε 2,5 φορές περισσότερα δεδομένα ανά έγγραφο, δίνοντας στην ανάκτηση και την κατάταξη πρόσβαση σε πλουσιότερες πληροφορίες εγγράφων.
Η γρήγορη προρύθμιση προσφέρει καθυστέρηση μίας κλήσης αναζήτησης 160 ms στο p50 και 230 ms στο p95. Σε όλα τα έξι αξιολογημένα πρότυπα αναφοράς πράκτορα, μείωσε το εκτιμώμενο κόστος μοντέλου συν αναζήτησης ανά εργασία κατά 68% σε σχέση με την προεπιλεγμένη ρύθμιση, διατηρώντας παράλληλα συγκρίσιμη συνολική ποιότητα εργασίας. Αυτά τα αποτελέσματα αποδεικνύουν τα πρακτικά οφέλη υποδομής σχεδιασμένης γύρω από τους φόρτους εργασίας αναζήτησής μας, τόσο για τα προϊόντα της Perplexity όσο και για τους προγραμματιστές που χτίζουν με το API μας.
Συνεχίζουμε να βελτιώνουμε την απόδοση και την αποδοτικότητα αποθήκευσης του Photon. Στόχος μας είναι να υποστηρίξουμε μεγαλύτερο index και πλουσιότερα δεδομένα εγγράφων στο ίδιο hardware, διατηρώντας παράλληλα γρήγορη την αναζήτηση καθώς τα workloads μας αυξάνονται.
Παραπομπή
@online{perplexity2026Photon,
author = {{Perplexity} and Maksim Morozov and Bogdan Savko and Ruslan Kovalev and Aleksei Bykov and Artur Zayats and Denis Bykov and Nikita Kireev and Jarrod Bryan and Claire Beamer and Jeremy Yang},
title = {{Photon: Building a retrieval and ranking engine from scratch}},
date = {2026-09-24},
url = {https://perplexity.coolkeypoint.com/hub/blog/photon}
}