Lulucat

Πώς το Kimi K3 ανέπτυξε μόνο του μια ψηφιακή πινελιά με πένα

Gaoge ZhangGaoge Zhang

Θέλαμε την κατευθυντική πένα του Freeform στο Lulucat Notes. Η προδιαγραφή ήταν ένα στιγμιότυπο χειρογράφου. Μετά από δύο μοντέλα, μία διαχωριστική ερώτηση και μια ελλειπτική μύτη, το στυλό νερού γράφει όπως πρέπει. Το Kimi K3 ανέλαβε την έρευνα, τον κώδικα και την επικύρωση στο Fireworks.

Ενημερώθηκε

Χειρόγραφη αγγλική καλλιγραφία που γράφει «fountain pen» πάνω από μια γραμμή κινεζικής καλλιγραφίας, σχεδιασμένη με πένα ελλειπτικής μύτης πάνω σε κρεμ χαρτί: παχιά στις κάθετες και λεπτή στις οριζόντιες διαδρομές.

Αποδόθηκε από το Metal pipeline του Lulucat Notes, για το οποίο μιλά αυτή η δημοσίευση.

Το Lulucat Notes έχει ένα απλό στυλό και έναν μαρκαδόρο επισήμανσης. Το επόμενο εργαλείο στον χάρτη πορείας ήταν ένα στυλό νερού — η κατευθυντική πένα που γνωρίζετε από το Apple Notes και το Freeform, όπου οι κάθετες διαδρομές βγαίνουν παχιές και οι οριζόντιες λεπτές. Η προδιαγραφή αυτού του εργαλείου δεν ήταν έγγραφο. Ήταν ένα στιγμιότυπο: τρεις γραμμές χειρογράφου, οι λέξεις «pencilkit», «无边记» και «这种有方向的水笔能力» — αυτή η κατευθυντική ικανότητα του στυλό νερού.

Όπως και στο προηγούμενο Metal pipeline, τη δουλειά την έκανε το Kimi K3, το ανοιχτό μοντέλο της Moonshot που τρέχει στο Fireworks: μέτρηση, μοντελοποίηση, κώδικας και επικύρωση. Ο άνθρωπος έδωσε το στιγμιότυπο, απάντησε σε μία ερώτηση και έκρινε την αίσθηση σε ένα πραγματικό iPad.

Η προδιαγραφή είναι ένα στιγμιότυπο

Μια στατική εικόνα δεν μπορεί να σας πει γιατί μια διαδρομή είναι λεπτή. Μπορεί να σας πει μόνο πόσο λεπτή είναι και πού βρίσκεται. Έτσι, το πρώτο βήμα ήταν η μέτρηση. Σαρώσαμε το στιγμιότυπο γραμμή προς γραμμή και στήλη προς στήλη, παρακολουθώντας την απόκλιση της κεντρικής γραμμής κάθε διαδρομής για να βρούμε την κατεύθυνσή της, και έπειτα μετατρέψαμε το πλάτος της σάρωσης σε πραγματικό πλάτος με το ημίτονο αυτής της γωνίας:

ΔιαδρομήΚατεύθυνσηΠραγματικό πλάτος
Ανερχόμενο τμήμα του «l», «pencilkit»≈ 78°27.3 px
Κορμός του «k», «pencilkit»≈ 90°28 px
Αριστερό κατερχόμενο πέρασμα του 力≈ 66°25.7 px
Συνδέσεις καλλιγραφίας≈ 8°11 px
Κινεζικές οριζόντιες (横)≈ 0°6–11 px

Ο λόγος παχιού προς λεπτό είναι ≈ 2.5. Η προσαρμογή του στο σημείο των 66° δίνει — σχεδόν γραμμική ως προς , με κορύφωση στον κατακόρυφο άξονα. Στην πράξη, πρόκειται για πλάγια μύτη: μια οριζόντια σχισμή που η οριζόντια γραφή δεν ανοίγει ποτέ.

Πρώτη έκδοση: πλάτος από την κατεύθυνση

Το πρώτο μοντέλο ήταν το προφανές. Υπολογίζουμε μια κατεύθυνση για κάθε σημείο εισόδου, αντιστοιχίζουμε την κατεύθυνση σε πλάτος μέσω της προσαρμοσμένης καμπύλης και ενσωματώνουμε το αποτέλεσμα στην ακτίνα του σημείου κατά τη σύλληψη. Η κατεύθυνση εκτιμούνταν αιτιακά — ένας εκθετικά φθίνων σταθμισμένος μέσος όρος των τελευταίων λίγων σημείων του τόξου, υπολογισμένος στον χώρο διπλασιασμένης γωνίας, ώστε μια αντιστροφή της κίνησης να μην ακυρώνει την εκτίμηση. Χρησιμοποιούνται μόνο προηγούμενα σημεία, οπότε η ζωντανή και η δεσμευμένη διαδρομή συμφωνούν byte προς byte.

Ο builder πέρασε τον unit check του: συνθετικές οριζόντιες, κάθετες, 45° και διαδρομές αντιστροφής ενσωμάτωσαν όλες τα θεωρητικά πλάτη — 0.99, 2.52, 2.00 και 0.99 σημεία. Η απόδοση δεν χρειάστηκε καθόλου νέο κώδικα: μια διαδρομή με ενσωματωμένη ακτίνα είναι απλώς μια αλυσίδα στρογγυλών σφραγίδων, και το point-sprite pipeline μας τις σχεδίαζε ήδη.

Στο iPad, ο άνθρωπος χρειάστηκε περίπου δέκα δευτερόλεπτα για να την απορρίψει: «αυτό είναι καλλιτεχνικό στυλό, όχι το στυλό νερού».

Δύο εξηγήσεις για μία εικόνα

Γιατί έδινε λάθος αίσθηση; Υπήρχαν δύο πιθανές εξηγήσεις και το στιγμιότυπο δεν μπορούσε να τις ξεχωρίσει:

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

Και οι δύο εξηγήσεις παράγουν ένα στιγμιότυπο με λεπτές οριζόντιες και παχιές κάθετες. Η διαφορά φαίνεται όταν πιέζετε δυνατά μια οριζόντια διαδρομή. Η πρώτη έκδοση την κρατά λεπτή. Ένα στυλό που ανταποκρίνεται στην πίεση την κάνει παχιά. Έτσι θέσαμε στον άνθρωπο μία ερώτηση: πρέπει μια οριζόντια διαδρομή που πιέζεται δυνατά να γίνει παχύτερη;

«Όχι. Οι οριζόντιες παραμένουν λεπτές.»

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

Η απάντηση ήταν στα άκρα των διαδρομών

Το επόμενο στοιχείο βρισκόταν στην κορυφή των ανερχόμενων τμημάτων. Η μεγέθυνση στους κορμούς των «l» και «k» του δείγματος έδειξε δύο πράγματα: μια ευθεία διαδρομή κρατά ένα πλάτος από την αρχή ως το τέλος και τα άκρα των διαδρομών είναι επίπεδες διαγώνιες κοπές — το σχήμα μιας πένας-σμίλης που σηκώνεται. Όχι στρογγυλές τελείες. Όχι στενέματα από την πίεση.

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

Αυτό σήμαινε πραγματικά η «αίσθηση καλλιτεχνικού στυλό». Η πρώτη έκδοση μοντελοποίησε την εμφάνιση του δείγματος — το πλάτος ως συνάρτηση της εκτιμώμενης κατεύθυνσης — αλλά όχι το στυλό. Ένας εκτιμητής κατεύθυνσης είναι αισθητήρας: τρέμει με θορυβώδη είσοδο, καθυστερεί στις γωνίες και στρογγυλεύει κάθε άκρο διαδρομής σε κύκλο. Μια πραγματική μύτη δεν έχει κανένα από αυτά τα προβλήματα, επειδή δεν υπολογίζει τίποτα. Το πλάτος είναι γεωμετρία.

Δεύτερη έκδοση: μια ελλειπτική μύτη

Το τελικό μοντέλο δεν έχει καθόλου εκτιμητή κατεύθυνσης. Η μύτη είναι μια προσανατολισμένη έλλειψη: ο μεγάλος άξονας είναι οριζόντιος και ο μικρός σταθερός. Σφραγίδες αυτής της έλλειψης τοποθετούνται πυκνά κατά μήκος της διαδρομής, και όλα τα υπόλοιπα προκύπτουν από τη γεωμετρία:

  • Μια οριζόντια διαδρομή κινείται κατά μήκος της ανοιχτής ακμής, οπότε βγαίνει πάντα με πλάτος — μια σταθερά λεπτή γραμμή, σε οποιαδήποτε πίεση. Ακριβώς η επιβεβαιωμένη προδιαγραφή.

  • Μια κάθετη διαδρομή διασχίζει ολόκληρο τον μεγάλο άξονα: , το παχύ άκρο.

  • Μια διαγώνια διαδρομή παίρνει το πλάτος της χορδής της έλλειψης κάθετα προς την κίνηση,

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

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

Από τις μετρήσεις του δείγματος κρατήσαμε pt και pt, με τον ίδιο λόγο 2.5. Οι σφραγίδες απέχουν 0.5 σημεία κατά μήκος του τόξου· με μικρή ακτίνα 0.55 σημείου, ο κυματισμός της ακμής στη χειρότερη περίπτωση είναι περίπου ένα δέκατο του pixel.

Η απόδοση χρειάστηκε έναν νέο fragment shader και τίποτε άλλο. Η μορφή vertex — θέση, διάμετρος, χρώμα — περιείχε ήδη τα πάντα: η διάμετρος είναι ο μεγάλος άξονας και ο μικρός άξονας είναι ένα uniform ανά πέρασμα. Ο shader αξιολογεί ένα SDF έλλειψης με την ίδια ράμπα κάλυψης μισού pixel που χρησιμοποιούν οι στρογγυλές σφραγίδες μας, ώστε να παραμένει συγκρίσιμο σε επίπεδο pixel με την υλοποίηση αναφοράς του Core Graphics (fillEllipse ανά σφραγίδα). Η επικύρωση πέρασε από τη συνηθισμένη πύλη: ένα συνθετικό corpus με δύο διαδρομές πένας, αποδοσμένο και με τους δύο τρόπους και συγκρίθηκε pixel προς pixel — μηδενικές δομικές διαφορές, ενώ μια οριζόντια διαδρομή που ελέγχθηκε δειγματοληπτικά μέτρησε 12 px και στους δύο renderers.

Δύο αποδόσεις της ίδιας χειρόγραφης λέξης «fountain» δίπλα δίπλα: η αριστερή σχεδιασμένη με στρογγυλές σφραγίδες διαμέτρου κλιμακωμένης κατά κατεύθυνση, με στρογγυλεμένα άκρα, και η δεξιά με σφραγίδες έλλειψης, με επίπεδα άκρα κομμένα σαν μύτη και πιο σταθερό πλάτος.

Η πρώτη έκδοση αριστερά, η δεύτερη έκδοση δεξιά. Ίδια χειρόγραφη είσοδος, ίδιο pipeline. Τα άκρα λένε την ιστορία.

Στο iPad, το νέο στυλό πέρασε αμέσως: «好,很好» — καλό. Πολύ καλό.

Κρατώντας την αποτυχημένη εκδοχή

Η πρώτη έκδοση δεν πήγε στον κάδο. Είναι ένα πραγματικά ενδιαφέρον πινέλο — απλώς δεν είναι στυλό νερού. Έτσι κυκλοφόρησε ως η πρώτη καταχώριση σε ένα νέο μενού πειραματικών πινέλων, με το όνομα που του έδωσε ο άνθρωπος: 漏水的圆珠笔, το στυλό διαρροής. Η γραμμή εργαλείων απέκτησε ένα κουμπί φιάλης που ανοίγει μια λίστα κειμένου με πειράματα· η προσθήκη του επόμενου κοστίζει μία γραμμή σε ένα registry. Ένα απορριφθέν μοντέλο δεν είναι χαμένη δουλειά όταν μπορεί να κυκλοφορήσει ως πείραμα με σαφή επισήμανση.

Ένα βράδυ βρόχων

Ολόκληρη η διαδρομή — μέτρηση, μοντέλο, κατασκευή, συσκευή, ερώτηση, νέο μοντέλο, νέα κατασκευή, επικύρωση — κράτησε ένα βράδυ. Το Kimi K3 στο Fireworks δεν έγραψε απλώς κώδικα· ανέλαβε ολόκληρη την τεχνική πλευρά του βρόχου: επινόησε τις σαρώσεις μέτρησης, πρότεινε τη διαχωριστική ερώτηση αντί να μαντέψει για δεύτερη φορά, διέγραψε τον δικό του εκτιμητή κατεύθυνσης όταν άλλαξαν τα στοιχεία και επέκτεινε το pixel-diff harness πριν αγγίξει την εφαρμογή. Η ταχύτητα συμπερασμού του Fireworks κράτησε τον βρόχο διαδραστικό — μεγάλα diff σε Metal και Swift, σενάρια ανάλυσης pixel και εργαλεία corpus έφταναν αρκετά γρήγορα ώστε το σημείο συμφόρησης να μείνει εκεί όπου πρέπει: στην ανθρώπινη κρίση.

Το μοτίβο συνεργασίας ήταν το ίδιο για το οποίο γράψαμε στη δημοσίευση του Metal pipeline και λειτούργησε ξανά: το μοντέλο είναι γρήγορο και ακριβές· ο άνθρωπος έχει το γούστο και την end-to-end επαλήθευση. Μία φράση σχολίου βασισμένου στην αίσθηση — «καλλιτεχνικό στυλό, όχι στυλό νερού» — ήταν αρκετή για να εντοπίσει το μοντέλο το ακριβές σφάλμα μοντελοποίησης και να το αντικαταστήσει με απλούστερο σχεδιασμό.

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