Dziennik rozwoju: Co tak naprawdę psuje się w arkuszu kalkulacyjnym zawierającym 120 000 wierszy
Sesja robocza z arkuszem kalkulacyjnym zawierającym 121 254 wierszy i 1,8 miliona komórek oraz pięć odrębnych rzeczy, które musiały się zmienić, zanim duża analiza między tabelami mogła zostać ukończona, zweryfikować jej wyniki i zwrócić użyteczny sformatowany raport.
Większość funkcji arkusza kalkulacyjnego jest testowana na danych mieszczących się na ekranie. Ten dziennik obejmuje sesję roboczą nad skoroszytem sprzedaży z 121 254 wierszy w 15 kolumnach — około 1,8 miliona komórek — i żądanie, które brzmi zwyczajnie: połącz tabele dotyczące produktu, klienta, zamówienia i sprzedaży, a następnie oznacz produkty, których liczba spada, ryzyko uzupełnienia zapasów i klienci o niskiej wartości.
Nic w tej prośbie nie jest egzotyczne. I tak nie udało się, kilka razy, z powodów, które nie miały prawie nic wspólnego z samą analizą. Poniżej opisano, co faktycznie się zepsuło i co się zmieniło.
Limit platformy, a nie powolne zapytanie
Pierwsza awaria wyglądała jak błąd w systemie trwałych zleceń. Prawdziwą przyczyną była reguła w skrypcie Google Apps: dodatek edytora nie może tworzyć wyzwalacza zależnego od czasu, który będzie uruchamiany częściej niż raz na godzinę.
Projekt zadania w tle zakładał wyzwalanie jednominutowe. To założenie utrzymywało się podczas programowania, gdzie skrypt powiązany z kontenerem może dowolnie planować i przestało obowiązywać w momencie uruchomienia tego samego kodu, co zainstalowany dodatek. Żądanie zainstalowania wyzwalacza nie uległo pogorszeniu — wyrzuciło i wyrzuciło. wcześniej zadanie zostało utworzone, więc praca nigdy się nie rozpoczęła.
Nastąpiły dwie zmiany. Zainstalowanie wyzwalacza jest teraz najlepszym rozwiązaniem: próbuje ustawić jednominutową kadencję, wraca do rytmu godzinowego, a na koniec do całkowitego braku wyzwalacza i nigdy nie rzuca. Pierwszy etap przetwarzania przebiega teraz w tym samym wykonaniu, w którym utworzono zadanie, a nie w drugim wywołaniu, które musi ponownie sprawdzić zadanie.
Ten drugi szczegół miał większe znaczenie, niż się wydaje. Właściwości Apps Script nie umożliwiają niezawodnego odczytu i zapisu w różnych wykonaniach, więc zadanie napisane chwilę wcześniej może powrócić jako „nie znaleziono zadania” już przy następnym wywołaniu.
Raportowanie postępu to nie to samo, co ukończenie
Gdy zadanie w końcu się rozpoczęło, nadal nie zostało ukończone. Narzędzie wykonało jeden krok, a następnie zwróciło status informujący, że praca „jest kontynuowana w tle”.
To zdanie było fałszywe. Ponieważ nie jest dostępny wyzwalacz subgodzinny, nic nie jest kontynuowane w tle. Asystent odczytał stan, przekazał użytkownikowi wartość procentową i zatrzymał się, pozostawiając zadanie zaparkowane przy 34 000 ze 121 253 wierszy na czas nieokreślony.
Środowisko wykonawcze teraz samo doprowadza zadanie do końca, w ramach ograniczonego budżetu, a każde kolejne wywołanie stanu przyspiesza pracę, a nie tylko ją czyta. Jeśli budżet zostanie wyczerpany, tekst statusu wyraźnie mówi, że zadanie jest niedokończone i nic innego nie przyspieszy jego realizacji.
Zasadę warto podać wprost: sprawozdanie z postępu prac nie jest produktem dostarczanym. Użytkownik poprosił o tabelę, a nie procent.
Żądanie może zostać obsłużone tylko przez narzędzia widoczne dla modelu
Aby zapewnić dokładność wyboru narzędzia, GetSheetAI ujawnia podzbiór swoich narzędzi na turę na podstawie żądania. Mechanizm ten został zbudowany w oparciu o zestaw narzędzi Excel, a dodatek Google Sheets rejestruje 22 narzędzia, które istnieją tylko tam. Narzędzia te były odfiltrowywane z każdego żądania.
Efekt był specyficzny i łatwy do przeoczenia. Zapytanie o wykres słupkowy ujawniło 6 z 44 narzędzi, a narzędzie wykresu było jednym z ukrytych. Pytanie o sortowanie zakresu ujawniło 5 z 44, bez narzędzia sortowania. Asystent nie odmawiał — naprawdę nie widział narzędzia, które wykonuje tę pracę.
Arkusze mają teraz własne mapowanie między narzędziami, odzwierciedlające każdy odpowiednik Excel, a filtr przechodzi przez każde narzędzie, o którym nie ma zdania, zamiast je odrzucać. Test odczytuje teraz zarejestrowane nazwy narzędzi bezpośrednio ze źródła, więc dodanie narzędzia bez jego klasyfikacji powoduje niepowodzenie kompilacji, zamiast po cichu uczynić je nieosiągalnym.
Ta sama klasa luki pojawiła się we frazowaniu. Chińskie żądanie oznaczające „utwórz nowy arkusz” nie spełniało żadnej reguły, ponieważ wzorzec rozpoznawał tylko jedno z dwóch popularnych słów oznaczających arkusz. Narzędzie do tworzenia arkuszy pozostało ukryte, a asystent zgłosił, że utworzenie arkusza nie jest możliwe. Tak nie było.
Komunikaty o błędach są częścią produktu
Kilka niepowodzeń sprowadzało się do komunikatu informującego o problemie bez wskazania sposobu rozwiązania.
Zapis do nieistniejącego arkusza zwrócił „Żądany zasób nie istnieje.” To brzmi jak uszkodzony dodatek. Teraz mówi, że arkusz nie istnieje, że narzędzie do pisania nie tworzy arkuszy i które to dwa wywołania.
Odmowa klasyfikacji na poziomie wiersza w bardzo dużym zakresie oznaczała czystą odmowę. Etykietowanie zagregowanego wyniku działa w dowolnym rozmiarze, więc wiadomość teraz nazywa tę ścieżkę: najpierw zgrupuj, a następnie zastosuj reguły klasyfikacji do zgrupowanego wyniku.
Ochrona przed nadpisaniem nie zwróciła nic poza blocked: true, co odczytuje się jako błąd. Wyjaśnia teraz, że cel posiada już dane i informuje, jak postępować.
Żadne z nich nie jest kosmetyczne. W każdym przypadku poprzednia wiadomość kończyła zadanie, które nadal było możliwe do wykonania.
Wyrażenia deterministyczne wymagały więcej arytmetyki
Wyprowadzenie roku i miesiąca, takiego jak 201707, z klucza daty w postaci liczby całkowitej, takiego jak 20170702, wymaga floor(x / 100) lub modulo. Żadne nie istniało. Dwie próby nie powiodły się i kolumna pochodna została porzucona.
Warstwa wyrażeń zawiera teraz floor, round, abs i mod, a błąd nieobsługiwanej funkcji wyświetla pełny zestaw i podaje dokładne wyrażenie, a nie tylko nazywa to, co zostało odrzucone.
Tam, gdzie stoi
W tym samym skoroszycie trwała ścieżka została teraz ukończona: wszystkie 121 253 wierszy zostały przetworzone, pogrupowane, zapisane i sformatowane, a każdy fragment wyniku został zweryfikowany. W przypadku Excel w ramach tego samego żądania uzyskano klasyfikację wszystkich 397 produktów — 132 bez niedawnej sprzedaży, 101 oznaczonych jako ryzyko uzupełnienia zapasów, 99 ze spadkiem, 65 w stanie normalnym — obliczoną przy użyciu natywnego SUMIFS względem tabeli źródłowej, zamiast przenosić dane gdziekolwiek.
Wartości eksploatacyjne, które warto znać:
- próg trwałego routingu: więcej niż 100 000 komórek;
- fragmentacja źródła: ograniczone odczyty, weryfikowane według fragmentu podczas zapisywania zwrotnego;
- pokrycie regresji: 826 testów w całym współdzielonym środowisku wykonawczym;
- wykonywanie w tle dodatków do Arkuszy Google: w najlepszym wypadku co godzinę, więc pasek boczny wykonuje długie zadania, gdy jest otwarty.
Ten ostatni punkt jest rzeczywistym ograniczeniem, a nie tymczasowym. Zainstalowany dodatek nie może planować pracy częściej, więc duże zadanie postępuje, gdy pasek boczny jest otwarty. Trwały punkt kontrolny oznacza, że zamknięcie nie powoduje utraty ukończonej pracy, ale uczciwy opis jest taki, że praca jest napędzana, a nie zaplanowana.
Szersza lekcja płynąca z tej sesji nie dotyczyła skali. Każda z tych awarii wynikała z tego, że system wiedział o czymś, czego użytkownik nie mógł zobaczyć: o regule platformy, ukrytym narzędziu, obsługiwanej ścieżce, której nigdzie nie wymieniono w błędzie. Rozmiar sprawiał, że były widoczne wszystkie na raz.