שרשורים רב-לשוניים אינם בעיית תרגום: אמור 'write' במקום 'translate', וסנן טיוטות בסקריפט .length מקומי.
היום פרסמתי 5 מאמרים. לכל אחד שרשור ציוצים ב-6 שפות (en / zh / ja / ko / ar / id), 4 ציוצים לשפה — בסך הכול 120 ציוצים.
ב-4 מתוך 5 היה צריך לקצץ את השרשור הסיני. המספרים הגולמיים (הסקריפט מדפיס בפורמט chars/limit):
zh[1]=160/140 OVER
zh[2]=164/140 OVER
zh[3]=152/140 OVER
...
id[3]=286/280 OVER
zh[2]=163/140 OVER
zh[3]=148/140 OVER
zh[2]=152/140 OVER
תמיד אותה תבנית: קודם כותבים ארבעה ציוצים באנגלית (כל אחד 230–260 תווים, על גבול ה-280), ואחר כך מבקשים מ-Claude „לייצר גרסה סינית משלושת־ארבעת אלה". הגרסה הסינית כמעט תמיד עוברת 140.
זה לא באג, זו המילה הלא-נכונה. ברגע שאתה אומר "translate", Claude עובר למצב שורה-אחר-שורה — אבל שרשור רב-לשוני הוא לא בעיית תרגום. כל שפה חייבת להיכתב מחדש מהיסוד אל מול תקציב התווים שלה. הפוסט הזה מראה איך להוציא טיוטה ראשונה של Claude כבר קרוב למגבלה, בלי לשרוף 3–5 סבבי קיצוץ.
מגבלת האורך של X אינה „כמות תווים" אלא weighted characters:
- אותיות לטיניות, ספרות, סימני פיסוק: 1 weight לתו
- תווי CJK (סינית/יפנית/קוריאנית), חלק מהאמוג'י: 2 weight לתו
- תקרה כוללת לציוץ: 280 weight
בפועל:
- ציוץ באנגלית: תקרה 280 תווים
- ציוץ בסינית טהורה: תקרה 140 תווים (140 × 2 = 280)
- מעורב: פר-תו 1 או 2
אז „לתרגם ציוץ אנגלי של 260 תווים לסינית" לא נותן גרסה סינית של 260 תווים — בגרסה הסינית יש בפועל סביב 130 תווים מקום. כל הפיסוק, המירכאות וה-backtick מהאנגלית המקורית עדיין תופסים מקום, וכל תו סיני נספר כפליים. תרגום מילולי כמעט תמיד גורם לחריגה.
כש-Claude רואה "translate these 4 EN tweets to ZH", המהלך הראשון שלו הוא לשמר את מבנה המשפט האנגלי ולהחליף רק את המילים לסינית:
המשמעות נכונה, אבל:
- שומר את „并不相同" (תו אחד יותר מ-„不同")
- שומר את „已经点击了" („刚点完" קצר יותר)
- שומר את „并看着一个空白屏幕" („看着空白屏" קצר יותר)
כל יתירות שנשמרה אוכלת תווים. בצבירה של 4 ציוצים, 20–40 תווים חריגה זה קל, והמגבלה כבר חצויה.
השוו את שתי הניסוחים:
מה שלא עובד:
"Translate these 4 English tweets to Chinese, Japanese, Korean, Arabic, Indonesian."
מה שעובד:
"For each of these 4 points, write a thread in ZH / JA / KO / AR / ID. Each language gets a fresh pass — same argument, adjusted for that language's tweet budget.
- ZH: ≤ 140 chars per tweet, hook-first, cut detail if needed
- other languages: ≤ 280 chars
- use each language's natural phrasing, don't preserve EN sentence structure
- each tweet must be self-contained but add 🧵 only on tweet 1"
ההבדלים:
.lengthלא סופרים בעין. סקריפט קטן שרץ על כל טיוטה:
tweets.each do |loc, list|
list.each_with_index do |t, i|
len = t.length
limit = loc == "zh" ? 140 : 280
status = len > limit ? "OVER" : "ok"
puts "#{loc}[#{i}]=#{len}/#{limit} #{status}"
end
end
String#length של Ruby מחזיר codepoints של Unicode — כל תו CJK נספר כ-1. X מחשב CJK במשקל 2, אבל מגבלת ציוץ סיני היא 140 codepoints (כי 140 × 2 = 280 weighted), ולכן .length מתיישר ישירות עם התקרה של X. מקרי קצה:
ברוב המכריע של ציוצי CJK, .length של Ruby נמצא בטווח ±1 מהספירה של X. להשתמש בו כשער מקומי עוקף פרסום נסיוני ב-X פי 100.
כשצריך לקצץ ציוץ סיני, שתי הקטגוריות האלה נופלות ראשונות:
ציטוטי קוד כמו `kamal exec` אוכלים תו אחד לכל backtick בהקשר סיני — 2 תווים לציטוט, אפס ערך סמנטי. פתרונות:
`kamal exec`"🧵 רק על הציוץ הראשון. אמוג'ים אחרים בציוצים סיניים — חשבו פעמיים. כל אמוג'י עולה בפועל 2 תווים (1 codepoint + לפעמים מעדכני ZWJ).
'X') — חיסכון של 2 תווים לזוג לעומת fullwidth (「X」)ביצירת שרשורים רב-לשוניים חִסמו את הארבעה האלה:
סימפטום: משפטים סיניים עם ביטויים כגון „并不相同", „已经点击了", „一个空白屏幕" — קלקים ברורים מאנגלית.
חסימה: כתבו בפרומפט "don't preserve EN sentence structure" / "use natural ZH phrasing".
סימפטום: Claude מסיים ואומר "done", הפלט עובר את המגבלה, והוא לא שם לב.
חסימה: בקשו מ-Claude לספור בעצמו את אורך כל ציוץ ("count each tweet's char length and flag any over the limit"), או הציבו סקריפט מקומי כשער. אני בוחר בסקריפט — Ruby מדויק יותר.
סימפטום: כש-Claude סופר, הוא שוכח את ה-weight הנוסף של אמוג'י ומירכאות fullwidth.
חסימה: אל תשאלו את Claude „האם חרג?" — הריצו .length מקומית ולפי המספרים בקשו ממנו לקצץ.
סימפטום: לפעמים 🧵 על כל ציוץ, לפעמים רק על הראשון, לפעמים נוחת על 4/4.
חסימה: קבעו בפרומפט — "🧵 only on tweet 1". Claude לא יודע כברירת מחדל את המוסכמות הוויזואליות של שרשור.
שש חוקות לטיוטה רב-לשונית ראשונה צמודה למגבלה:
"cut detail if needed" אומר ל-Claude שמותר לאבד עובדות עבור אורך..length מקומי כשער. מדויק יותר מהספירה של Claude, מהיר יותר מפרסום נסיוני.התובנה האמיתית: Claude יודע לכתוב שרשורים רב-לשוניים נכון — אבל התגובה ברירת המחדל שלו היא „לתרגם". עבודתך היא להפוך אותו דרך פרומפט למצב „הלחנה עצמאית לכל שפה". עם שער .length, השרשור הסיני של המאמר האחרון היום יצא 140/140 מדויק בטיוטה הראשונה — בלי קיצוץ.