Free

איך לגרום ל-Claude לכתוב שרשורי ציוצים רב-לשוניים בלי לחרוג מהמגבלה

שרשורים רב-לשוניים אינם בעיית תרגום: אמור '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 מחשב CJK כפול × Claude ברירת-מחדל מתרגם מילולית

כללי ספירת התווים של X

מגבלת האורך של X אינה „כמות תווים" אלא weighted characters:
- אותיות לטיניות, ספרות, סימני פיסוק: 1 weight לתו
- תווי CJK (סינית/יפנית/קוריאנית), חלק מהאמוג'י: 2 weight לתו
- תקרה כוללת לציוץ: 280 weight

בפועל:
- ציוץ באנגלית: תקרה 280 תווים
- ציוץ בסינית טהורה: תקרה 140 תווים (140 × 2 = 280)
- מעורב: פר-תו 1 או 2

אז „לתרגם ציוץ אנגלי של 260 תווים לסינית" לא נותן גרסה סינית של 260 תווים — בגרסה הסינית יש בפועל סביב 130 תווים מקום. כל הפיסוק, המירכאות וה-backtick מהאנגלית המקורית עדיין תופסים מקום, וכל תו סיני נספר כפליים. תרגום מילולי כמעט תמיד גורם לחריגה.

המילה "translate" מדליקה את מצב המילולי של Claude

כש-Claude רואה "translate these 4 EN tweets to ZH", המהלך הראשון שלו הוא לשמר את מבנה המשפט האנגלי ולהחליף רק את המילים לסינית:

  • EN: "Production 400/500 isn't like local. User's already staring at a blank screen after hitting Pay."
  • ZH מילולי של Claude: „生产环境的 400/500 和本地并不相同。用户已经点击了『付款』并看着一个空白屏幕。" (40 תווים סיניים)

המשמעות נכונה, אבל:
- שומר את „并不相同" (תו אחד יותר מ-„不同")
- שומר את „已经点击了" („刚点完" קצר יותר)
- שומר את „并看着一个空白屏幕" („看着空白屏" קצר יותר)

כל יתירות שנשמרה אוכלת תווים. בצבירה של 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"

ההבדלים:

  1. "write" מחליף את "translate" — מדליק ב-Claude את מצב הקומפוזיציה, לא את מצב התרגום.
  2. "fresh pass" / "same argument" — נותן ל-Claude רשות לסדר מחדש את המשפטים.
  3. "don't preserve EN sentence structure" — חוסם ישירות את התנהגות ברירת המחדל.
  4. "cut detail if needed" — מרשה להקריב תוכן עבור אורך (בלי זה, Claude שומר כל עובדה וחורג).
  5. תקציב מפורש לשפה — "≤ 140 chars" יעיל פי 100 מ-"short".

Sanity check מקומי: Ruby + .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. מקרי קצה:

  • מספר codepoints של אמוג'י (🧵 = 1 codepoint, אבל יש אמוג'י שהם רצף של כמה)
  • תווי רוחב אפס (ZWJ וכו')

ברוב המכריע של ציוצי CJK, .length של Ruby נמצא בטווח ±1 מהספירה של X. להשתמש בו כשער מקומי עוקף פרסום נסיוני ב-X פי 100.

מלכודות אמוג'י ו-backtick

כשצריך לקצץ ציוץ סיני, שתי הקטגוריות האלה נופלות ראשונות:

Backtick

ציטוטי קוד כמו `kamal exec` אוכלים תו אחד לכל backtick בהקשר סיני — 2 תווים לציטוט, אפס ערך סמנטי. פתרונות:

  • השתמשו בנקודתיים: „命令 kamal exec" קצר יותר מ-„`kamal exec`"
  • אם חייבים לשמר backtick, רק על המזהה המרכזי, לא על שורת shell שלמה

אמוג'י

🧵 רק על הציוץ הראשון. אמוג'ים אחרים בציוצים סיניים — חשבו פעמיים. כל אמוג'י עולה בפועל 2 תווים (1 codepoint + לפעמים מעדכני ZWJ).

פיסוק fullwidth מול halfwidth

  • פיסוק CJK (「」、,。——): 2 weight לתו
  • פיסוק ASCII ("",-): 1 weight לתו
  • כשציוץ סיני מערבב מירכאות: השתמשו במירכאות halfwidth ('X') — חיסכון של 2 תווים לזוג לעומת fullwidth (「X」)

ארבעה כיוונים של ברירת מחדל של Claude שצריך ליירט

ביצירת שרשורים רב-לשוניים חִסמו את הארבעה האלה:

1. תרגום מילולי עם שימור מבנה EN

סימפטום: משפטים סיניים עם ביטויים כגון „并不相同", „已经点击了", „一个空白屏幕" — קלקים ברורים מאנגלית.

חסימה: כתבו בפרומפט "don't preserve EN sentence structure" / "use natural ZH phrasing".

2. אין בדיקת אורך יזומה

סימפטום: Claude מסיים ואומר "done", הפלט עובר את המגבלה, והוא לא שם לב.

חסימה: בקשו מ-Claude לספור בעצמו את אורך כל ציוץ ("count each tweet's char length and flag any over the limit"), או הציבו סקריפט מקומי כשער. אני בוחר בסקריפט — Ruby מדויק יותר.

3. התעלמות מה-weight של מירכאות ואמוג'י

סימפטום: כש-Claude סופר, הוא שוכח את ה-weight הנוסף של אמוג'י ומירכאות fullwidth.

חסימה: אל תשאלו את Claude „האם חרג?" — הריצו .length מקומית ולפי המספרים בקשו ממנו לקצץ.

4. חוסר עקביות במיקום 🧵

סימפטום: לפעמים 🧵 על כל ציוץ, לפעמים רק על הראשון, לפעמים נוחת על 4/4.

חסימה: קבעו בפרומפט — "🧵 only on tweet 1". Claude לא יודע כברירת מחדל את המוסכמות הוויזואליות של שרשור.

Checklist

שש חוקות לטיוטה רב-לשונית ראשונה צמודה למגבלה:

  1. אמרו "write", לא "translate". Translate מדליק מילולית = מבנה EN נשמר = חריגה.
  2. תקציב מפורש לשפה. "≤ 140 chars" פי 100 יעיל מ-"short".
  3. רשות לחתוך תוכן. "cut detail if needed" אומר ל-Claude שמותר לאבד עובדות עבור אורך.
  4. Ruby .length מקומי כשער. מדויק יותר מהספירה של Claude, מהיר יותר מפרסום נסיוני.
  5. בסינית, קצצו קודם backticks ואמוג'י. כל backtick = תו, כל אמוג'י = שני תווים.
  6. קבעו את מיקום ה-🧵 בפרומפט. Claude אינו יודע כברירת מחדל את מוסכמות השרשור.

התובנה האמיתית: Claude יודע לכתוב שרשורים רב-לשוניים נכון — אבל התגובה ברירת המחדל שלו היא „לתרגם". עבודתך היא להפוך אותו דרך פרומפט למצב „הלחנה עצמאית לכל שפה". עם שער .length, השרשור הסיני של המאמר האחרון היום יצא 140/140 מדויק בטיוטה הראשונה — בלי קיצוץ.