Free

Jak skłonić Claude'a do pisania wielojęzycznych wątków na Twitterze bez przekraczania limitu

Wielojęzyczne wątki to nie problem tłumaczenia: mów 'write', nie 'translate', i filtruj szkice lokalnym skryptem .length.


Dziś opublikowałem 5 artykułów. Do każdego wątek tweetów w 6 językach (en / zh / ja / ko / ar / id), po 4 tweety na język — razem 120 tweetów.

W 4 z 5 trzeba było przyciąć wątek chiński. Surowe liczby (skrypt wypisuje w formacie 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

Zawsze ten sam schemat: najpierw piszę cztery angielskie tweety (po 230–260 znaków, pod sufit 280), potem proszę Claude'a „wygenerować wersję chińską na bazie tych czterech". Chińska wersja niemal zawsze przekracza 140.

To nie bug, to złe słowo. W momencie, gdy mówisz „translate", Claude wchodzi w tryb „linia po linii" — ale wielojęzyczny wątek to nie problem tłumaczenia. Każdy język trzeba napisać od zera pod jego własny budżet znaków. Ten tekst pokazuje, jak pierwszy szkic Claude'a od razu wypada blisko limitu, bez 3–5 rund cięcia.


Przyczyna źródłowa: X liczy CJK podwójnie × Claude domyślnie tłumaczy dosłownie

Zasady liczenia znaków w X

Limit długości w X to nie „liczba znaków", tylko weighted characters:
- Łacinka, cyfry, interpunkcja: 1 weight na znak
- Znaki CJK (chiński/japoński/koreański), część emoji: 2 weight na znak
- Sufit na tweet: 280 weight

W praktyce:
- Tweet po angielsku: sufit 280 znaków
- Czysty chiński tweet: sufit 140 znaków (140 × 2 = 280)
- Mieszany: po znaku 1 lub 2

Więc „przetłumacz angielski tweet 260 znaków na chiński" nie daje chińskiej wersji 260 znaków — chińska wersja ma realnie ok. 130 znaków miejsca. Cała interpunkcja, cudzysłowy i backticki z angielskiego oryginału nadal zajmują miejsce, a każdy chiński znak liczy się podwójnie. Dosłowne tłumaczenie praktycznie gwarantuje przekroczenie.

Słowo „translate" włącza tryb dosłowny Claude'a

Gdy Claude widzi „translate these 4 EN tweets to ZH", pierwszy jego ruch to zachowanie struktury angielskiego zdania i zmiana tylko słów na chińskie:

  • EN: „Production 400/500 isn't like local. User's already staring at a blank screen after hitting Pay."
  • Dosłowny ZH Claude'a: „生产环境的 400/500 和本地并不相同。用户已经点击了『付款』并看着一个空白屏幕。" (40 chińskich znaków)

Sens jest poprawny, ale:
- Zachowane „并不相同" (o znak dłuższe niż „不同")
- Zachowane „已经点击了" („刚点完" krótsze)
- Zachowane „并看着一个空白屏幕" („看着空白屏" krótsze)

Każdy zachowany nadmiar zjada znaki. Skumulowane na 4 tweetach, 20–40 znaków za dużo wyskakuje łatwo, a limit przekroczony.

Prompt, który działa: „przepisać", nie „tłumaczyć"

Porównaj dwie formulacje:

Co nie działa:

„Translate these 4 English tweets to Chinese, Japanese, Korean, Arabic, Indonesian."

Co działa:

„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"

Różnice:

  1. „write" zastępuje „translate" — włącza tryb kompozycji Claude'a, nie tryb tłumaczenia.
  2. „fresh pass" / „same argument" — daje Claude'owi prawo przestawiać zdania.
  3. „don't preserve EN sentence structure" — blokuje zachowanie domyślne wprost.
  4. „cut detail if needed" — daje prawo porzucić treść dla długości (bez tego Claude trzyma każdy fakt i przekracza).
  5. Jawny budżet na język — „≤ 140 chars" działa 100× skuteczniej niż „short".

Lokalny sanity-check: Ruby + .length

Nie licz na oko. Mały skrypt uruchamiany na każdym szkicu:

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 w Ruby zwraca kodpointy Unicode — każdy znak CJK liczy się jako 1. X waży CJK z 2, ale limit chińskiego tweeta to 140 kodpointów (bo 140 × 2 = 280 weighted), więc .length bezpośrednio pokrywa się z sufitem X. Przypadki brzegowe:

  • Liczba kodpointów emoji (🧵 to 1 kodpoint, ale niektóre emoji to sekwencje wielu)
  • Znaki o zerowej szerokości (ZWJ itp.)

W ogromnej większości tweetów CJK .length Ruby'ego jest w zakresie ±1 od liczenia X. Używanie go jako lokalnej bramki bije testowe publikowanie na X 100×.

Pułapki emoji i backticków

Gdy chińskie tweety trzeba ciąć, te dwie kategorie lecą pierwsze:

Backticki

Cytaty kodu w stylu `kamal exec` w chińskim kontekście jedzą 1 znak na backtick — 2 znaki na cytat, zero wartości semantycznej. Rozwiązania:

  • Użyj dwukropka: „命令 kamal exec" bije „`kamal exec`"
  • Jeśli backticki muszą zostać — tylko na kluczowym identyfikatorze, nie na całej linijce shella

Emoji

🧵 tylko na tweecie 1. Inne emoji w chińskich tweetach — dwa razy się zastanów. Każde emoji kosztuje zasadniczo 2 znaki (1 kodpoint + czasem modyfikatory ZWJ).

Interpunkcja fullwidth vs halfwidth

  • Interpunkcja CJK (「」、,。——): 2 weight na znak
  • Interpunkcja ASCII ("",-): 1 weight na znak
  • Gdy chiński tweet miesza cudzysłowy: użyj cudzysłowów halfwidth ('X') — oszczędność 2 znaków na parę względem fullwidth (「X」)

Cztery domyślne odchylenia Claude'a do przechwycenia

Przy generowaniu wielojęzycznych wątków blokuj te cztery:

1. Dosłowne tłumaczenie zachowujące strukturę EN

Objaw: chińskie zdania z konstrukcjami typu „并不相同", „已经点击了", „一个空白屏幕" — oczywiste kalki z angielskiego.

Blokada: napisz w prompcie „don't preserve EN sentence structure" / „use natural ZH phrasing".

2. Brak proaktywnej kontroli długości

Objaw: Claude kończy, mówi „done", wyjście przekracza limit, on tego nie zauważa.

Blokada: poproś Claude'a o samodzielne zliczanie długości każdego tweeta („count each tweet's char length and flag any over the limit") albo postaw lokalny skrypt jako bramkę. Ja wybieram skrypt — Ruby jest dokładniejszy.

3. Ignorowanie weight cudzysłowów i emoji

Objaw: gdy Claude liczy, zapomina o dodatkowym weight emoji i fullwidth-cudzysłowów.

Blokada: nie pytaj Claude'a „czy przekroczony?" — uruchom .length lokalnie i każ mu ciąć na podstawie liczb.

4. Niespójna pozycja 🧵

Objaw: czasem 🧵 na każdym tweecie, czasem tylko na pierwszym, czasem ląduje na 4/4.

Blokada: zafiksuj w prompcie — „🧵 only on tweet 1". Claude nie zna domyślnie wizualnych konwencji wątków.

Checklista

Sześć reguł, żeby pierwszy szkic wielojęzycznego wątku wypadł blisko limitu:

  1. Mów „write", nie „translate". Translate włącza dosłowność = zachowana struktura EN = przekroczenie.
  2. Jawny budżet na język. „≤ 140 chars" 100× lepiej niż „short".
  3. Prawo do cięcia treści. "cut detail if needed" mówi Claude'owi, że może tracić fakty dla długości.
  4. Lokalny Ruby .length jako bramka. Dokładniej niż liczenie Claude'a, szybciej niż test na X.
  5. W chińskim tnij najpierw backticki i emoji. Każdy backtick = 1 znak, każde emoji = 2.
  6. Zafiksuj pozycję 🧵 w prompcie. Claude domyślnie nie zna konwencji wątku.

Prawdziwy wniosek: Claude umie pisać wielojęzyczne wątki poprawnie — ale jego domyślna reakcja to „przetłumaczyć". Twoja robota to obrócić go promptem na „niezależną kompozycję per język". Z bramką .length chiński wątek ostatniego dzisiejszego artykułu wyszedł równo 140/140 w pierwszym szkicu — bez cięcia.