Галоўная / Артыкулы / Практычныя прытамулкі: Стварэнне LLM, частка 1 — Адучыце: Прагнозаванне наступнага токэна

Практычныя прытамулкі: Стварэнне LLM, частка 1 — Адучыце: Прагнозаванне наступнага токэна

Практычныя прыказкі: Стварэнне LLM, частка 1 — Адучыце: Прагнозаванне наступнага токена: контракты, пераконтрольванні і слоты для коду для команд, якія використоўваюць гэты патэрн.

3057 слоў

Існавайце гэта як перапрацоўаны варыянт ідэй з матеріалу «Стварэнне LLM, частка 1 — Адучэнне: прыгадванне наступнага токена» для аператараў: чыстыя этапы, арранжаваныя блакі коду і прыметкі з восстанавлення, якія застаюцца пасля перадачы. Этап Агульнага апісання работае найэфектывней, калі яго спрыяваць як мерыябельную паверхню. Запісайце адна ідеальная транскрыпцыю, адзін прыклад неудачы і прыметкі з вярнення да пачатковага стану прычаму расшырэння масштаба. Запісвайце часы выканання і кост токенаў або запытаў праза функцыйнае рэзультат. Відкрытыя даныя пра косцы з’являюцца раніше, чым утвараюцца неспадзянаныя рахункі, калі процес пераходзіць з дэмаверсіі ў спяльныя среды.

Чаму спачатку Vision Transformer?

Для ўрагану Vision Transformer неабходна падчас змены коду адзначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аперацыі должны магчымае перзапускати крок з вядомай точкі контролю, не прабуючы вычысляць схованы стан. Конфігурацыю трэба залічваць пазначкай ад коду прыемліка. Файлы сераўнавання, храненні секрэтных данных і флагі функций должны знаходзіцца ў аднам месцы, якое аперацыі можа пераглядаць, не чытаяўшы весь граф. Калі наступны крок — це код або вызов інструмента, лепш выкарыстоўваць структураваныя выходныя даны з перакананнем схэмы, чым вольныя тэкстовыя апісанні.

Одна ідея: праўдападобнае вычысленне наступнага токена

Для стадіі прыгнутковага прогназавання неабяжна падзець вводных данных, адміністратара крока і крэтарыяў завершэння працы перад зменым коду. Аперацыйныя працавнікі должны магчымае запускаць крок з вядомай точкі контролю, не падозрываючы схованы стан. Неабяжна задокументаваць як шлях успеху, так і шлях вярнення. Перапрыбуткі, людзкіе перакрыцця і обробка некоректных паведамленняў ёсць часткай продукту, а не пасляднім дапрацоўкам. Калі наступны крок — це код або вызов інструмента, лепш выкарыстоўваць структураваныя выходныя данні з верыфікацыёй схемы, чым вольнай формы тэкст.

logits, _ = model(ids)                     # ids = the tokens so far, shape (1, T)
probs = F.softmax(logits[0, -1], dim=-1)   # one probability per vocabulary token

Тэкст → токены: чаму нам паўзела стварыць савой токенайзер

Для токэнаў Тексту, прычынай чаго мы ствараем пазлікаваныя етапы, неабходна з’явіць вхідныя даны, абавесць етапу і крэтыры завершэння пры змяне коду. Аперацыйныя працавнікі павінны магчымае перазапускаць етап з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест амаль неканчатых скрыптав. Калі етап не выйшаў, прычына неудачы павінна вказываць на адну конкрэтную абавесць, а не на заплутаны ланцюг задач. Калі наступны етап — це код або вызов інструмента, лепш выкарыстоўваць структураваныя выходны даны з пераканальваннем схэмы, замест вольнага формата тэксту. Для токэнаў Тексту, прычынай чаго мы ствараем пазлікаваныя етапы, неабходна з’явіць вхідныя даны, абавесць етапу і крэтыры завершэння пры змяне коду. Аперацыйныя працавнікі павінны магчымае перазапускаць етап з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Запісвайце час выконання і кост токэнаў або запытача разам з функцыйнымі рэзультатамі. Відразувыя даны пра косцы запобегаюць неспакоўным рахункам, калі процес пераходзіць з дэмавай версіі ў спяльныя сераўы.

import glob
from tokenizers import Tokenizer, models, trainers, pre_tokenizers
from llm_transformer.prep_tales import strip_gutenberg, RAW_DIR

# read every raw .txt book and strip its Project Gutenberg header/footer,
# leaving just the story text - one big string per book
tales_texts = [strip_gutenberg(open(p, encoding="utf-8", errors="ignore").read())
               for p in sorted(glob.glob(f"{RAW_DIR}/*.txt"))]   # 12 books, ~809k words
tok = Tokenizer(models.BPE())
tok.pre_tokenizer = pre_tokenizers.ByteLevel(add_prefix_space=False)   # start from bytes
trainer = trainers.BpeTrainer(vocab_size=8192, special_tokens=["<|endoftext|>"],
                              initial_alphabet=pre_tokenizers.ByteLevel.alphabet())
tok.train_from_iterator(tales_texts, trainer)   # learn the 7,935 merges
tok.save("tales_bpe.json")
tok = Tokenizer.from_file("tales_bpe.json")   # reload the trained tokenizer
ids = tok.encode("Once upon a time").ids      # -> [412, 987, 15, 733]   (integers)
idx = torch.tensor(ids).unsqueeze(0)          # (1, 4) — a batch of one sequence

vocab_size = tok.get_vocab_size()             # 8192 - sets the NUMBER OF ROWS below

Токен → вектар: адзінак, а не вычысленне

Калі працуеце з этапам адзінакавання вектара токена, спачатку запісайце умовы: неабяжлівыя данні, сігнал успеху і тое, што выходзіць на падзею частковага нявыпання. Такі список контроля дапамагае заліцьваты змяны ў кодзе пасля таго. Зберагаюце настройкі за межамі коду прыемлі. Файлы сераўнавання, храненні секрэтных дадзенаў і флагі функцыйяй должны знаходзіцца ў аднам месцы, куда аператары можаюць адбавіць аудыт без неабяжлівага чытання всей структуры. Кэшуйце стабільныя інструкцыі системы і схемы інструментаў. Перадача ідэнтычных прамулі ёсць частым выклікам витрачання ресурсаў.

self.token_embed = nn.Embedding(vocab_size, n_embed)   # the 8,192 x 256 table
# .weight IS a learnable (8192, 256) parameter tensor — 2.1M weights, trained by backprop;
# each id's row is nudged only on steps where that token appears in the batch
...
tok_emb = self.token_embed(idx)     # idx (B, T)  ->  vectors (B, T, 256), one row per id

Асаблівы случай: маска прычыны

Калі працуеце над этапам з’ясавання прычыны асаблівасці, спачатку запішыце умовы кантракту: неабяжлівыя даны, сигнал успеху і тое, што выканаецца пад частковай нявыходзе. Такі список контроля дапамагае заліцьварыць пазнейшыя змены ў кодзе. Документаваць трэба як шлях успеху, так і шлях вярнення ў нормальны стан. Перапрыбуткі, людзкія перакрыцця та обробка некоректных паведамленняў є частью продукту, а не пазнейшым дапрацоўкам. Зберагаеце у кэшы стабільныя інструкцыі системы та схемы інструментаў. Перасылка ідэнтычных прамуров є частым выклікам для ресурсаў.

# tril = torch.tril(torch.ones(T, T))  — a lower-triangular matrix of 1s, made once
attn = q @ k.transpose(-2, -1) / math.sqrt(head_size)          # scores, (B, T, T)
attn = attn.masked_fill(self.tril[:T, :T] == 0, float('-inf')) # blank out the future
attn = F.softmax(attn, dim=-1)                                  # -inf -> weight 0
out  = attn @ v

Одна пераглядка, усе контексты адразу

Калі працуеце па прынцыпе «One pass every context stage», спачатку запісайте угоду: неабяцковыя даны, сигнал успеху і тое, што выканаецца у разы частковага нявыполнення. Такі список пераканальвае ў тым, каб пазнейшыя змены коду былі чыстымі. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, нявыполнення должна паказваць на адну відпаведальнасць, а не на заплутаны ланцюг задач. Зберагаеце у кэшы стабільныя інструкцыі системы і схемы інструментаў. Перадзял у тое ж самае прамэру ёсць частым выкліканнем зайвых витрачэнняў. Калі працуеце па прынцыпе «One pass every context stage», спачатку запісайте угоду: неабяцковыя даны, сигнал успеху і тое, што выканаецца у разы частковага нявыполнення. Такі список пераканальвае ў тым, каб пазнейшыя змены коду былі чыстымі. Запісвайце час выканання і вартасць токенаў або запытак пад функцыйнальнымі рэзултатамі. Відразувая візуабельнасць вартасцей запобегае неспакойным рахункам, калі процес пераходзіць з дэмавайнага режыма ў спяльныя сераўеры.

Усередзіне адзінай гэтаркі: што на самай працо вычыляе attn @ V

Усередзіне адзінай гэтаркі: якая стадія найлепей працуе, калі яе рассматрываць як вимерную плошчу. Запісайце адзін ідеальны прыклад, адзін прыклад неудачы і прыметку па поверненню да пачатковага стану пры розширэнні масштаба. Зберагачыце настройкі пазначэнныя за межамі коду прыемліка. Файлы сераўіса, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавляць контроль без неабяжнага чытання всіх дадзеных. Задаце ліміт токенаў на кожную гэтарку і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўныя рахункі.

Адна пераглядка, многа урокоў: прыклады прыцэплення T і втарасцей T

Этап «Адаптацыя праз адну спробу» працюе наўзяй калі яго спрыятарабатваць як мерыемую плошчу. Запісаўце адны «золаты» прыклад успеху, адны прыклад неудачы і прыметку па вярнэнню да пачатковага стану пры расшырэнні масштаба. Дакументавайце як шлях успеху, так і шлях вярнэння. Перапрыбуткі, людзкія контрольныя пункты і обработка некоректных паведамленняў ёсць часткай продукту, а не пасляднім дапрацоўкам.

logits = self.lm_head(x)                       # (B, T, vocab)
B, T, C = logits.shape
loss = F.cross_entropy(logits.reshape(B*T, C), # every position ...
                       targets.reshape(B*T))   # ... vs the token that actually followed

Кожная неудача — это класыфікацыя слоўніку (такая ж, як у ViT, але 8 192 класаў)

Кожны рубікон ў процесе ўтварэння пакета працюе наякша, калі яго спрыяваць як вимерную плошчу. Зберагачыце адну ідеальную версію транскрыпцыі, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выходзіць, прычына неудачы павінна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач. Задаеце ліміты на колькість токенав за раунд і за сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўныя рахункі. Кожны рубікон ў процесе ўтварэння пакета працюе наякша, калі яго спрыяваць як вимерную плошчу. Зберагачыце адну ідеальную версію транскрыпцыі, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Запісвайце час выканання і вартасць токенав або запыткаў па боку функцыйнальных рэзультатаў. Відразлівае паказанне вартасцей з самага пачатку запобегае неспакоўным рахункам, калі процес пераходзіць з дэмы ў спяльныя сераверы.

Як ствараецца пакет — і як утвараецца яго рубікон

Кабы з’ясаваць, як працюе пакетна обработка, неабяжна пазначыць вхідныя даны, адпаведальнага за кожны крок і критэрыя завершэння працы перад змінайом код. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не прабуючы спадароўваць схованы стан. Конфігурацыю трэба залічваць параду коду прыкладнення. Файлы сераўнавання сяродовішча, храненні секрэтных данных і флагі функцыйяў должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць, не чытаяўшы весь код. Калі наступны крок — це код або вызов інструмента, лепш выкарыстоўваць структураваныя выходныя даны з перакранаваннем схэмы, чым вольныя тэкстовыя апісанні.

Адучэнне: стежыць за зменамі парадку

Для етапа аналізу збытка падіння ў процесе навчання неабходна перш заўсёды визначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння, прычаму праз зміны ў кодзе. Аператары должны магчыма было перазапускаць крок з вядомай точкі контролю, не прабуючы спадарацца прыватны стан. Неабходна адзначыць як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў є частью продукту, а не етапамі далейшай доработкі. Калі наступны крок — це код чыя-небудзь вызов інструменту, лепш выкарыстоўваць структураваныя выходны даны з пераканальваннем схемы, чым вольныя тэкстовыя описы.

for step in range(train_steps):
    xb, yb = get_batch(train_data)     # random (context, next-token) windows
    _, loss = model(xb, yb)            # forward: T predictions -> one mean loss
    opt.zero_grad(); loss.backward()   # backprop the loss into all 9M parameters
    opt.step()                         # nudge them downhill

Што мы створылі — і што будзе далей

Для раздела «Што мы створылі» і «Этап» неабяжна практычна вказаць інпуты, адпаведальную особу за даны этап і крэтыяры завершэння працы перад змінайом коду. Аператары должны магчымаць перзапуск этапу з вядомай точкі контролю, не падозрываючы прыхованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі этап не выконваецца, прычына неудачы должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач. Калі наступны этап — це код або вызов інструмента, лепш выкарыстоўваць структураваныя выходны данні з пераканальванням схемы, а не вольныя тэкстовыя выказванні. Для раздела «Што мы створылі» і «Этап» неабяжна практычна вказаць інпуты, адпаведальную особу за даны этап і крэтыяры завершэння працы перад змінайом коду. Аператары должны магчымаць перзапуск этапу з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісваць час выконання і кост токеноў або запытаў разам з функцыйнальнымі рэзультатамі. Відразувыя данні пра косты запобегаюць неспакоўным рахункам, калі процес пераходзіць з дэмавай версіі ў спяльныя сераўысы.

Чэк-ліст аператывных задач

Калі вы працуеце над стадзіяй чэк-ліста аператывных задач, спачатку запісайце умовы контракту: неабяжлівыя данні, сігнал успеху і тое, што выканаецца у разы ўзельнага неяўнасці. Такі чэк-ліст дапамагае заставаць пазнейшыя змены коду чыстымі.

Спрыяйце гэтай стадзіі як контракту межа даннімі і перакананымі выходамі. Дайце назвы элементам, задаце критэрыя успеху і адмовіцеся ад мовчанкавага частковага завершэння.

Зберагачвайце стабільныя інструкцыі системы і схемы інструментаў. Перадзесланне ідэнтычных прамаўляючых частак — частая прычына некантрольваных витрацоў.

Заставайце процес атрыбутавання дакументаў дышэчным, а дорогія процесы вырахоўвання — толькі пасля пераканання ў ўжыце мемаізацыі. Неранняя мемаізацыя можа закрыць багі, вызваные застарэлымі даннымі.

Калі бюджет дазволяе, дадзіце тэст на працясную работу, які пераканае критычны маршрут у CI з викорыстаннем фіксатываў, а не рэальных платных API.

Запісвайце адно і шлях успеху, і шлях вярнення. Перапрыбуткі, людзкія контраліны і обработка некоректных паведамленняў ёсць часткай продукту, а не чымсь, што дадаецца пазней.

Перш чым пераводзіць стак, заморозьце версіі, зафіксавайце ідеальны транскрыпт для критычнага шляху і паказвайце крокі для атрыбутавання назад. У спакульных средах патрэбны ліміты частоты запытоў, перакананні ў правах на выкарыстоўванне ресурсоў і чысткі власнік для змены секрэтных даных. Валіце надзейнасць, а не крэатыўныя разовыя дамастанкі.

Запіс для 44c72473e486: не кладзіце ключы прадастаўчыка ў репазітарый, задаце верхнюю межу токенаў на кожную сесію і зберагачыце транскрыпты празаўсёды разам з фіксатрамі для ацэнкі, каб пазнейшыя замены модэляў заставаліся парабелнымі.

Для стадіі 0 пры практыцы зміцнення неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры зміне коду. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не падозрываючы прыхованы стан. Спрыяйце цій стадіі як даговору межаў вхідных даных і перакананых выходных рэзультатаў. Даць назвы артыфактам, узначыць перакананні ў успеху і адмовіцца ад беззвучнага частковага завершэння.

Дзеянні зміцнення 0/729: вымерыць час выканання, класію каштоўкаў і выкарыстоўванне токенав для гэтай прыметкі, а пасля — вырашыць, чы рашыцца застаўіць змяну, ствараючыся на адной фіксованай сэтцы пытанняў, а не на асобістых спазыраннях.

Калі працуеце над першым этапам зміцнення, спачатку запісайте умовы кантракта: неабяцковыя даны, сігнал успеху і тое, што выходзіць пад частковыя неудачы. Такі список дапамагае заліцварваць пазнейшыя змены коду. Зберагаюце настройкі праз чынны код аплікацыі. Файлы сераўіса, хранільнікі секрэтных данных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куда аператары можуць адбавіць аудыт без неабяцковага чытання всіх элементаў.

Дзеянне зміцнення 1/729: вы мераваеце час выканання, класыя ошибакі і витрату токенав для гэтага пункту, а потым выявляеце, чы хацеце застаўіць змену на адной пазычанай сэткі критэрыяў, а не на асобістых спазырах.

Этап зміцнення 2 працуе лепей, калі яго спрыяваць як меравальную плошчу. Зберагаеце адны ідеальны прыклад роботы, адзін кейс неудачы і прыказку па абратанні змян, перш чым расширваце сферу дзейства. Валіце маленькія, тэставаныя елементы замест большых скрыптав. Калі якісь крок не выйшае, неудача должна вказваць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцужок дзеянняў.

Дзеянне паўжасткі 2/729: звярніце увагу на час выканання, класы памылак і колькасць токенаў, выкорыстаных для гэтага запісу, а пасля, на аднойчынай базе фіксаваных пытанняў, а не на індывідуальных прыкладах, выявіце, чы рэшацца застаўляць змяну.

Для 3-й стадзіі паўжасткі запісу з’явіце вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры зміне коду. Аперацыйныя працавнікі павінны магчымае перазапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісвайце час выканання і колькасць токенаў або запытак палягліва да рэзультатаў функцыянальнай працы. Візуабельнасць костоў з самага пачатку запобегае неспакойным рашчыткам, калі процес пераходзіць з дэмаверсіі ў спяльныя среды.

Дзеянне паўжасткі 3/729: звярніце увагу на час выканання, класы памылак і колькасць токенаў, выкорыстаных для гэтага запісу, а пасля, на аднойчынай базе фіксаваных пытанняў, а не на індывідуальных прыкладах, выявіце, чы рэшацца застаўляць змяну.

Калі працуеце над 4-й стадзіяю прыемкі з павышэння безпекі, спачатку запісайце угоду: неабяжлівыя данні, сігнал успеху і тое, што выходзіць пад частковы нявыплэн. Такі список контроля дапамагае заставіць пазнейшыя змены коду быць чыстымі.

Документавайце як «шчаслівы» шлях, так і шлях вяснавання. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў ёсць частью продукту, а не пазнейшым дапрацоўкам.

Дзялей 4/729 прыемкі з павышэння безпекі: вымерайце час выканання, класыя ошибкі і витрату токенав для гэтай прыемкі, а пасля выберайце, чы робіць змены на адной фіксаванай сэтке пытанняў, а не на адной лічбе прыкладаў.

4-я стадзія прыемкі з павышэння безпекі работае лепей, калі яе спрыямаць як вымеральную плошчу. Зафіксавайце адну «золатую» транскрыпцыю, адны прыклад нявыплэну і прыемку для абратнага запуску, перш чым расширваць масштаб.

Спрыяйце гэтай стадзіі як угоды межа даннімі і перакананымі выходамі. Дайце назвы артыфактам, задаце перакананні успеху і адмовіцеся ад тыхоўскага частковага завершэння.

Дзеянне паўжасткі 5/729: звярніце увагу на час выканання, класы памылак і витрату токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на індывідуальных прыкладах, выявіце, чы рэшацься застаўляць змяну.

Для 6-й стадзіі паўжасткі запісу перад змянай коду неабходна визначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аперацыяныя працавнікі павінны магчымае перадзванаць крок з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Канфігурацыю трэба зберагчы за межамі коду прыемленае. Файлы сяродавішча, хранільнікі секрэтных дадзенняў і флагі функций павінны знаходзіцца ў аднам месцы, якое працавнікі можуць пераглядаць, не чытаючы весь граф.

Дзеянне паўжасткі 6/729: звярніце увагу на час выканання, класы памылак і витрату токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на індывідуальных прыкладах, выявіце, чы рэшацься застаўляць змяну.

Калі працуеце над 7-ю стадзіяй забезпечэння безпекі, спачатку запісайце умовы кантракта: неабяжлівыя даны, сігнал успеху і тое, што выходзіць на частым неудачам. Такі список контроля дапамагае залічваць пазнейшыя змены ў кодзе чыста і адкрыта. Валіце маленькія, тэставаныя елементы замест вялікіх скрыптав. Калі якась стадзія не выйшла, неудача должна вказваць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач.

Дзеянне 7/729 забезпечэння безпекі: замерайце час выканання, класы каштоўкаў і витраты токенаў для гэтай стадзіі, а пасля выберайце, чы робіць змены на адной фіксаванай базе пытанняў, а не на адной лічбе прыкладаў.

7-я стадзія забезпечэння безпекі працуе лепей, калі яе спрыямаць як меравальную плошчу. Запісайце адны ідеальны прыклад роботы, адзін кейс неудачы і прыказку па абратанні змян, перш чым расширваць сферу дзеяння. Запісвайце часы выканання і вартасць токенаў або запыткаў разам з функцыйнальнымі рэзултатамі. Відкрытая інформацыя пра вартасці запобегае неспакойным рашчыткам, калі процес пераходзіць з дэмавайшага режыма ў спяльныя среды.

Дзеянне паўжчання 8/729: звярніце увагу на час выканання, клас памылакі і колькасць выкорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на асобістых спазырэннях, выявіце, чы хацяце застаўіць змены.

Для 9-го этапу паўжчання неабходна перад змянай коду чытко визначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аперацыйныя працавнікі должны магчымае перадзвануць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Неабходна адначасна задокументаваць шлях успеху і шлях вярнення. Практыка павторных спроб, людзкія контралі і обработка некоректных паведамленняў є частью продукту, а не елементамі пазнейшай дапрацоўкі.

Дзеянне паўжчання 9/729: звярніце увагу на час выканання, клас памылакі і колькасць выкорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на асобістых спазырэннях, выявіце, чы хацяце застаўіць змены.

Калі працуеце над 10-ю стадзіяй ударожэння, спачатку запісайце контракт: неабяжлівыя данні, сігнал успеху і тое, што выходзіць у разе частковага неяксаменства. Такі список контроля дапамагае залічыць пазнейшыя змены коду адкрыта. Спрыятлівайце гэтую стадзію як контракт межа даннімі і перакананымі выходамі. Дайце назву артыкулам, задаце правіла пераканання успеху і адмовіцеся ад тыхоўскага частковага завершэння.

Дзеянні ўдарожэння 10/729: звярніце увагу на час выканання, класы памылак і витрату токенав для гэтай змены, а пасля вырашыце, чы робіць яе, стварыўшы фіксаваны набор пытанняў, а не на адной лічбе.

11-я стадзія ударожэння працюе лепей, калі яе спрыятлівваюць як меравальную плошчу. Запісайце адна ідеальная транскрыпцыя, адзін прыклад неяксаменства і змэту аб анулюванні, перш чым расширваць масштаб. Зберагайце настройкі параду ўнутры коду прыемленае. Файлы сяродавішча, хранільнікі секрэтных дадзенняў і флагі функций павінны знаходзіцца ў адном месцы, якое аператары можаць пераглядаць без неабяжлівага чытання всей структуры.

Дэталі зміцнення 11/729: звярніце увагу на час обработкі, клас памялкі і колькасць токенаў, выкарыстоўваных для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на індывідуальных прыкладах, выявіце, чы хацяце застаўіць гэтыя змены.