בניתי לעצמי סקיל שממלא טפסים — כולל טפסים ממשלתיים בעברית, עם משבצות הספרות של תעודת הזהות ותיבות הסימון של כן/לא. הוא נבנה מפרומפט אחד. יצאו מזה שני דברים: כל הקונקטורים שהורדתי בעבר כדי שקלוד ידע לשלוט ב-PDF-ים היו מיותרים, והחלק שהופך את הקובץ הזה לשימושי הוא בכלל לא הקוד.
המסקנה מראש: פרומפט אחד מייצר לכם סקיל שעובד. מה שהופך אותו לסקיל שאפשר לסמוך עליו הוא דווקא החלק שהוא לא קוד — הכללים על מה אסור לו למלא, והדיוק שנצבר בו. שורה אחת שם אפילו מעידה על עצמה שנכתבה רק אחרי שתיקנתי אותו.
שני שלבים, ורוב הראשון הוא לא AI
השלב הראשון הוא בכלל לא טכנולוגי. יש לכם בטלפון תיקייה שבה אתם שומרים צילומים של תעודות ומסמכים? אם לא — זה השלב, ואפשר להעביר גם אותו לקלוד: לעבור על התיקייה, למחוק תעודות שפג תוקפן, לקטלג כל אחת בשם ברור, ולהעלות את הכול לגוגל דרייב. אצלי יצאו מזה בערך 26 סריקות — תעודות זהות, דרכונים, רישיונות ותעודות, וכמה מסמכים משפחתיים.
השלב השני הוא פרומפט אחד לקלוד Cowork, עם קונקטור פעיל לגוגל דרייב: לבנות סקיל שימלא טפסים בשמי, לשאול אותי על כל הפרטים הכלליים, לייצר ארטיפקט שבו אקשקש חתימה ולשמור אותה, ולהסתכל בתיקייה בדרייב כדי להבין אילו תעודות זמינות לו. לגבי ה-PDF כתבתי לו המלצה — להתקין PyMuPDF — ובמפורש אמרתי שאם הוא מוצא פתרון טוב יותר, שילך על זה.
זהו. ומכאן החלק המעניין: מה בעצם יש בקובץ שיצא.
הקונקטורים היו מיותרים
הורדתי בעבר כמה קונקטורים לשליטה ומילוי של PDF-ים. אף אחד מהם לא נדרש. קלוד פשוט מריץ pip install pymupdf pillow בתוך הסביבה שלו ועובד ישירות על הקובץ — קורא קואורדינטות, מדפיס טקסט, מצייר איקסים, מרנדר תמונות לבדיקה.
פרט שחידד לי את זה: הפונט העברי שהסקיל בוחר יושב בנתיב לינוקסי, כלומר החלק הזה לא רץ על המק שלי. ובקובץ יש שורה שמסבירה למה זה גם הכיוון העדיף — שכלי הרינדור של חלק משרתי ה-MCP ל-PDF נופלים על קבצים מסוימים, ו-get_pixmap של PyMuPDF הוא הגיבוי שעובד.
הקונקטור היחיד שבאמת נדרש הוא גוגל דרייב, וגם הוא לא בשביל ה-PDF אלא בשביל הסריקות. כשטופס מבקש מספר דרכון, תאריך תפוגה של רישיון או מספר סניף בבנק, הסקיל לא מנחש: הוא מחפש בתיקייה, פותח את הסריקה הנכונה וקורא את הערך מהתמונה. הכלל שכתוב שם במפורש הוא שאסור לשחזר ערך מהזיכרון ואסור לנחש ספרת ביקורת. אם הסריקה לא קריאה או שהמסמך לא נמצא שם — לשאול אותי.
החלק שאף אחד לא כותב בפרומפט הראשון
טפסים ממשלתיים הם בדרך כלל PDF שטוח. אין בהם שדות טופס, אין AcroForm — יש דיו על נייר וירטואלי, וכל מה שממלאים נדפס בקואורדינטות מוחלטות. לכן הכלל הראשון בסקיל הוא לא לנחש קואורדינטות לעולם אלא לחלץ אותן מהקובץ: לקרוא את הטקסט של התוויות יחד עם התיבות התוחמות שלהן, ולמצוא את קווי הטבלה ואת תיבות הסימון דרך אובייקטי הציור — כי הרבה טפסים מציירים את הקווים כמלבנים דקיקים מלאים ולא כקווים. תיבת סימון היא מלבן כמעט־ריבועי של בערך 5 עד 10 נקודות לכל צלע.
שלוש בעיות הצטברו שם. אחת מהן, לפי הקובץ עצמו, אחרי תיקון שלי:
איזו תיבה שייכת לאיזו תווית. בטפסים בעברית התיבה יושבת בדרך כלל משמאל לתווית שלה — קודם המילה, והמשבצת שלה שמאלה ממנה — אבל הסקיל אוסר להניח את זה, ומחייב לרנדר חיתוך מוגדל של השורה ולהסתכל. סימון בעמודה הלא נכונה בהצהרה משפטית הוא לא באג עיצובי.
כיווניות בתוך שדה. טקסט עברי דורש טיפול bidi, אז הסקיל מדפיס דרך insert_htmlbox עם פונט מוטמע ולא דרך insert_text. אבל מספרים, ספרות ת.ז. וכתובות מייל הם LTR גם בתוך טופס עברי — והשורה שמסבירה איך כתובת מייל יושבת סביב @ מודפס מראש נכתבה, לפי הקובץ עצמו, אחרי שתיקנתי אותו.
סימון שלא תלוי בפונט. במקום להקליד תו וי או איקס, הסקיל מצייר שני קווים חוצים בתוך התיבה. תו עלול לא להיות מכוסה בפונט ולצאת ריבוע; שני קווים תמיד יוצאים איקס.
והחתימה נשמרת לא כתמונה אלא כגאומטריה של משיכת עט — רצף נקודות במרחב 640 על 200, משיכה אחת רציפה, עובי עט 2.4. בזכות זה היא מרונדרת מחדש נקייה בכל גודל: דגימת עקומה ריבועית דרך נקודות אמצע, ברזולוציה גבוהה פי שמונה ואז הקטנה, כדי שהקצוות ייצאו חלקים. בטופס A4 היא יושבת ברוחב של בערך 100 נקודות, ממורכזת על קו החתימה ועם הבסיס שלה מונח עליו.
השלב האחרון בסקיל הוא לרנדר את העמוד, לרנדר חיתוך מוגדל של האזורים שמולאו, ובאמת להסתכל בתמונות לפני שמגישים. עבודה עם קואורדינטות נשברת בשקט.
מה שהוא מסרב למלא
זה החלק שאני הכי שמח שנמצא שם.
פרטים מזהים — בחופשיות. שאלות מהותיות — לא. שם, ת.ז., כתובת, טלפון, עיסוק, תאריך: אלה עובדות עליי, ומילוי שלהן הוא תמלול. שאלה על בריאות, על כספים, על עבר משפטי, על הסכמה או על העדפה היא הצהרה שאני מוסר, לפעמים תחת אזהרה פלילית. הסקיל מחויב לשאול אותי על כל אחת כזאת בנפרד, גם כשהתשובה נראית מובנת מאליה.
בלוקים של צד שלישי נשארים ריקים. ״ימולא על ידי הרופא״, בלוקים לשימוש פנימי של הרשות, סעיף של מעסיק או של עד — מילוי שלהם הוא זיוף אישור של מישהו אחר. הסקיל מצביע עליהם ומודיע לי בסוף מה עוד פתוח ומי צריך להשלים אותו.
ושני כללים קטנים באותה רוח: הקובץ המקורי לא נדרס אף פעם — נשמר עותק חדש לצדו; והחתימה מוטבעת רק כשביקשתי במפורש לחתום. חתימה היא פעולה שלי, לא ברירת מחדל.
אז לא, לא תפסיקו למלא טפסים
הכותרת של הפוסט המקורי הייתה בדיחה, וכדאי להגיד את זה בקול. מה שנעלם הוא התמלול: לחפש את מספר הדרכון, להתאים ספרה למשבצת, להשיג חתימה בקובץ. מה שנשאר הוא בדיוק החלק שדורש אתכם — ההצהרות. וזה בסדר גמור, כי זה גם החלק שהמחיר של טעות בו הוא הגבוה ביותר.
הלקח הכללי, והוא נכון גם בארגונים ולא רק בטפסים שלי: הפרומפט הראשון קונה לכם סקיל שעובד. מה שהופך אותו לכזה שאפשר לתת לו לגעת בדברים אמיתיים הוא שני דברים שהפרומפט הראשון לא מייצר לבד — הדיוק שנכנס בו אחרי שהוא טועה, והרשימה של מה שאסור לו לעשות. שווה לכתוב את שניהם לתוך הקובץ במקום להסתמך על כך שהמודל יחשוב על זה לבד.
אם אתם שוקלים איפה בעסק שלכם יש עבודת תמלול שאפשר להעביר לסקיל — ואיפה עובר הגבול שאסור לו לחצות — ככה אני עובד.