Dokładna arytmetyka w LLM: generowanie wykonywalnego kodu
LLM nie są przeznaczone do precyzyjnych obliczeń: architektura Transformer przewiduje tokeny na podstawie prawdopodobieństw, a nie wykonuje działań matematycznych. Zapytanie o mnożenie 18 × 38,76 może dać wynik 697,68 lub błąd typu 680 z powodu przybliżeń wzorców z danych treningowych. To systemowe ograniczenie, a nie degeneracja modelu.
Rozwiązanie: wykluczyć LLM z obliczeń. Model generuje skrypt w Pythonie dla zadania — kod jest uruchamiany w izolowanej środowisku. Python zapewnia dokładność: 18 * 38,76 zawsze daje 697,68.
Architektura systemu
Przepływ przetwarzania: użytkownik → LLM → skrypt Pythona → kontener Docker → wynik (tekst + Excel).
Przykład obliczenia rachunków za komunalne (Tomsk):
- Użytkownik: «Woda zimna 320, woda ciepła 229, prąd 7422, poprzednie: WZ 302, WC 222, prąd 7133».
- LLM z systemowym promptem (stawkę z konfiguracji) generuje skrypt.
- Skrypt oblicza zużycie, stosuje stawki, tworzy tabelę.
- Uruchomienie w piaskownicy, zwracanie pliku.
Uproszczony wygenerowany kod:
# Pokazania liczników
cold_current, cold_prev = 320, 302
hot_current, hot_prev = 229, 222
elec_current, elec_prev = 7422, 7133
# Zużycie
cold_usage = cold_current - cold_prev # 18 m³
hot_usage = hot_current - hot_prev # 7 m³
elec_usage = elec_current - elec_prev # 289 kWh
# Stawki Tomsk 2025 (z konfiguracji, nie z modelu)
tariffs = {
'cold_water': 38.76,
'hot_water': 142.63,
'electricity': 4.94,
'drainage': 27.04,
}
# Obliczenia
cold_cost = cold_usage * tariffs['cold_water'] # 697.68
hot_cost = hot_usage * tariffs['hot_water'] # 998.41
elec_cost = elec_usage * tariffs['electricity'] # 1427.66
drain_cost = (cold_usage + hot_usage) * tariffs['drainage'] # 676.00
total = cold_cost + hot_cost + elec_cost + drain_cost # 3799.75
# Tworzenie pliku Excel
import openpyxl
wb = openpyxl.Workbook()
ws = wb.active
ws.append(['Usługa', 'Zużycie', 'Stawka, ₽', 'Koszt, ₽'])
ws.append(['Woda zimna', f'{cold_usage} m³', tariffs['cold_water'], cold_cost])
ws.append(['Woda ciepła', f'{hot_usage} m³', tariffs['hot_water'], hot_cost])
ws.append(['Prąd', f'{elec_usage} kWh', tariffs['electricity'], elec_cost])
ws.append(['Odprowadzanie', f'{cold_usage + hot_usage} m³', tariffs['drainage'], drain_cost])
ws.append(['RAZEM', '', '', total])
wb.save('komunalne.xlsx')
Stawki są wstrzykiwane z zewnętrznego pliku konfiguracyjnego aktualizowanego z oficjalnych źródeł. Model nie wymyśla wartości.
Wybór LLM i piaskownicy
Modele:
- Qwen (Alibaba): darmowy API, stabilna generacja kodu dla prostych zadań.
- DeepSeek V3: do złożonych scenariuszy (analiza dokumentów), z cache’em promptów.
GPT-4/Claude są nadmiarowe dla generowania skryptów do 20 linii.
Piaskownica: kontener Docker na żądanie.
- Izolacja użytkowników.
- Podstawowe biblioteki: openpyxl, math, datetime.
- Limit czasu 30 sekund.
- Zakaz pandas/numpy w promptach.
Częste problemy i rozwiązania
| Problem | Rozwiązanie |
|--------|-------------|
| Halucynacje stawek | Stawki z konfiguracji w prompcie |
| Bezpośrednie obliczenia bez kodu | Walidacja + ponowne z instrukcją «tylko kod» |
| Zajęte znaki w Excelu | encoding='utf-8', walidacja po procesie |
| Brakujące importy | Ograniczenie bibliotek w obrazie i prompcie |
| UX: błędny licznik tokenów | Liczenie po stronie backendu |
| Błędy w kodzie | Zwracanie stderr modelu do iteracyjnej korekty |
Zwracanie stderr w odpowiedzi zmniejsza liczbę iteracji o 5 razy: model analizuje traceback i poprawia kod.
Rozszerzenia: analiza kosztorysów
Do sprawdzania kosztorysów (plik Excel, miasto): model generuje 150–200 linii kodu.
- Parsowanie dowolnej struktury.
- Porównanie z cenami rynkowymi z konfiguracji.
- Wykrywanie błędów arytmetycznych.
- Raport z kolorową wizualizacją (openpyxl).
Przykład: kosztorys remontu łazienki (Tomsk) — nadwyżka 25,9%, 8 pozycji >50%, różnice 1–4 zł.
Co jest ważne
- Arytmetyka 100% dokładna: wykonuje się w Pythonie.
- Stawki z danych zewnętrznych, nie z modelu.
- Piaskownica obowiązkowa dla bezpieczeństwa.
- Iteracje z stderr przyspieszają debugowanie.
- Skalowalne: aktualizacja konfiguracji bez ponownego uczenia.
— Editorial Team
Brak komentarzy.