Ένας ιστότοπος που μιλάει δεκάδες γλώσσες, χωρίς μεταφραστές
Αυτόματο μεταφρασμένο από τα ιταλικά · δείτε το πρωτότυπο
Πώς κατασκευάσαμε το σύστημα μετάφρασης που τρέχει σε αυτές τις σελίδες: AI όταν χρειάζεται, cache πάντα, μηδενική αντιλαμβανόμενη αναμονή.
Το πρόβλημα της παραδοσιακής i18n
Για χρόνια, η διεθνοποίηση ενός ιστότοπου ήταν μια μικρή οδύσσεια ροής εργασίας: αρχεία .po, ανθρώπινοι μεταφραστές, κλειδιά που ξεχνούνται, καθυστερημένες αναπτύξεις επειδή "η γερμανική γλώσσα λείπει ακόμα". Η προσθήκη μιας γλώσσας κόστιζε χρόνο και χρήμα. Η προσθήκη δέκα ήταν εκτός συζήτησης για οποιαδήποτε μικρή εταιρεία.
Με τα LLM τελευταίας γενιάς, η ποιότητα της αυτόματης μετάφρασης έχει φτάσει σε ένα σημείο όπου — για έναν εταιρικό ιστότοπο, όχι για τη λογοτεχνία — είναι επαρκής. Η ερώτηση δεν είναι πλέον "μπορούμε να το μεταφράσουμε αυτόματα", αλλά "πώς το ενσωματώνουμε χωρίς να χαλάσουμε την εμπειρία του χρήστη".
Η αρχιτεκτονική, εν συντομία
Ο ιστότοπος εξυπηρετείται στατικά στα ιταλικά. Όταν ένας χρήστης επιλέξει μια άλλη γλώσσα, τίθεται σε λειτουργία μια μικρή μηχανή σε τρεις συλλογές MongoDB:
i18n_base: τα αρχικά κείμενα στην επιλεγμένη γλώσσα (σήμερα ιταλικά), το καθένα με τη δήλωση της γλώσσας του, μια περιγραφή για το πού και γιατί εμφανίζεται στον ιστότοπο (απαραίτητο για την ποιότητα της μετάφρασης), τον τόνο και το όριο χαρακτήρων. Αυτή η περιγραφή γίνεται μέρος της προτροπής στο LLM, ώστε να γνωρίζει αν μεταφράζει ένα κουμπί ή μια παράγραφο.i18n_human: οι μεταφράσεις που έχουν επιμεληθεί χειροκίνητα, όταν για κάποια σελίδα θέλουμε επιμελητική ποιότητα αντί για την έξοδο του LLM. Έχουν προτεραιότητα στην αυτόματη προσωρινή μνήμη και "σημαίνονται" αυτόματα όταν αλλάζει το αρχικό κείμενο.i18n_cache: οι μεταφράσεις που έχουν ήδη δημιουργηθεί, ευρετηριασμένες κατά (πεδίο, γλώσσα). Κάθε καταχώρηση διατηρεί τη χρονική σήμανση του βασικού κειμένου τη στιγμή της δημιουργίας.articoli_i18n: ίδια λογική που εφαρμόζεται σε μεγαλύτερα περιεχόμενα, όπως αυτό το άρθρο.
Κατά την πρώτη πρόσβαση σε μια νέα γλώσσα, το σύστημα ζητά από το LLM μόνο τα πεδία που πραγματικά λείπουν, αποθηκεύει την απάντηση στην προσωρινή μνήμη και την επιστρέφει στον browser. Στις επόμενες επισκέψεις, η ίδια γλώσσα φτάνει άμεσα, χωρίς περαιτέρω κλήσεις AI.
Η ακύρωση που λειτουργεί
Η προσωρινή μνήμη είναι ένα οργανωμένο ψέμα: λέει "η αλήθεια μου είναι αυτή" μέχρι κάποιος να το διαψεύσει. Ο μηχανισμός διάψευσης εδώ είναι απλός: κάθε μεταφρασμένη προσωρινή μνήμη αποθηκεύει τη χρονική σήμανση του βασικού κειμένου που την δημιούργησε. Όταν τροποποιήσετε το ιταλικό κείμενο και αυξήσετε το updated_at, όλες οι μεταφράσεις αυτού του πεδίου σε όλες τις γλώσσες γίνονται αυτόματα άκυρες και αναδημιουργούνται όταν χρειαστεί. Μηδενικές χειροκίνητες διαδοχικές ενημερώσεις, καμία προσωρινή μνήμη για να αδειάσετε.
Ο χρήστης που δεν περιμένει
Το πιο ενδιαφέρον δεν είναι η μετάφραση — είναι πώς την εμφανίζουμε. Κατά την αλλαγή γλώσσας, ο browser έχει μπροστά του μια ιταλική σελίδα με μικρούς δείκτες φόρτωσης δίπλα σε κάθε μπλοκ κειμένου που πρέπει να ενημερωθεί. Ο πειρασμός είναι να κάνετε μια μόνο κλήση που μεταφράζει τα πάντα μαζί: απλό, καθαρό και καταδικάζει τον χρήστη να περιμένει μέχρι το LLM να τελειώσει τα πάντα πριν δει οποιαδήποτε αλλαγή.
Επιλέξαμε την αντίθετη κατεύθυνση. Τα κείμενα ομαδοποιούνται ανά ενότητα (navbar, σώμα, υποσέλιδο) και χωρίζονται σε μικρο-παρτίδες των τριών πεδίων η καθεμία. Οι κλήσεις ξεκινούν ακολουθικά: πρώτα τα λίγα πεδία της navbar, που εμφανίζονται σε δευτερόλεπτα — ο χρήστης βλέπει ότι κάτι συμβαίνει και αρχίζει να διαβάζει. Ενώ διαβάζει, φτάνει το πρώτο κομμάτι του σώματος, μετά το δεύτερο και τέλος το υποσέλιδο.
Η νυχτερινή εργασία
Μια προσωρινή μνήμη έχει έναν και μόνο αληθινό εχθρό: την πρώτη επίσκεψη. Ο πρώτος Γερμανός χρήστης πληρώνει το τίμημα όλων των μελλοντικών μεταφράσεων, και αυτή είναι η εμπειρία που μένει στο μυαλό του. Για να εξαλείψεις (ή σχεδόν) το πρόβλημα, μια εργασία στο παρασκήνιο ξυπνά κάθε λεπτό, επιλέγει τη γλώσσα που αναμένεται περισσότερο ανάμεσα σε αυτές που είναι ακόμα ημιτελείς, παίρνει ένα μη μεταφρασμένο κείμενο και το περνάει από το LLM. Στο επόμενο λεπτό, το επόμενο. Σε λίγες μέρες, οι πιο διαδεδομένες γλώσσες είναι ήδη ζεστές.
Η νυχτερινή εργασία κάνει επίσης μια δεύτερη δουλειά: επανεξετάζει αυτόματα τις μεταφράσεις αμφίβολης ποιότητας, προσπαθώντας ξανά με ένα διαφορετικό μοντέλο AI. Όταν η ευθυγράμμιση μεταξύ των γλωσσών είναι σημαντική, μια μέτρια μετάφραση δεν παραμένει τέτοια.
Αν είσαι ο πρώτος Γερμανός της ημέρας και φτάνεις ενώ το σύστημα ολοκληρώνει ακόμα την προσωρινή μνήμη, έχεις τουλάχιστον την σταδιακή φόρτωση να σε κρατήσει απασχολημένο. Αν είσαι ο δεύτερος, δεν το αντιλαμβάνεσαι καν.
Τι παίρνεις μαζί σου
Ένας πολύγλωσσος ιστότοπος χωρίς μεταφραστές, χωρίς αρχεία για διαχείριση, χωρίς ανάπτυξη για να προσθέσετε μια γλώσσα. Ο χρήστης πληκτρολογεί έναν κωδικό — ja, ca, eu, ό,τι θέλει — και η σελίδα μεταφράζεται. Τη δεύτερη φορά είναι άμεση. Την τρίτη, πολύ πιθανόν να έχουμε ήδη φτάσει εκεί, μεταφρασμένη στο σωστό λεπτό από μια εργασία που δεν κοιμάται ποτέ.
Αυτή η ίδια σελίδα, αν τη διαβάζετε στα γερμανικά, στα ισπανικά, στα κορεατικά, δεν έχει γραφτεί ποτέ από έναν μεταφραστή. Έχει μεταφραστεί μόνο μία φορά, από ένα LLM, και έκτοτε εξυπηρετείται από την cache. Το μόνο που έχει γραφτεί με το χέρι είναι αυτό που διαβάζετε τώρα αν είναι στα ιταλικά.
Ενδιαφέρεστε να μεταφέρετε αυτήν την αρχιτεκτονική στον ιστότοπό σας; Ας το συζητήσουμε.
Επικοινωνήστε μαζί μας
Έχετε μια παρατήρηση; Γράψτε μας
Το μήνυμα φτάνει μόνο σε εμάς. Αν το σχόλιό σας είναι ενδιαφέρον, μπορεί να δημοσιευτεί στο τέλος του άρθρου, μετά από αξιολόγηση.
Ενώ πληκτρολογείτε, ο browser σας επιλύει έναν μικρό υπολογισμό – αυτός είναι ο τρόπος μας να αποτρέψουμε τα αυτόματα μηνύματα χωρίς υπηρεσίες τρίτων ή αναγνώριση εικόνων. Δεν ζητείται τίποτα από εσάς και κανένα δεδομένο δεν εγκαταλείπει αυτήν την ιστοσελίδα.