fix(llm): pusta odpowiedz modelu to blad, nie pusta strona #17

Merged
gitea merged 1 commits from fix/empty-llm-response into master 2026-07-22 18:05:20 +00:00
Owner

Objaw

W Kalendarzu horoskop wyswietla sie poprawnie. W Interpretacjach zapytanie wychodzi,
wraca — i nic sie nie pokazuje, bez zadnego komunikatu.

Przyczyna

Model potrafi oddac pusta tresc (finish_reason=length, completion_tokens=0).
generate() zwracalo wtedy pusty tekst bez bledu, a dalej:

{% if prompt_result.horoscope %}   ← pusty string = falsz → nie renderuje nic

i llm_error nie byl ustawiony → zero wyjasnienia. Klasyczna cicha awaria.

Skad asymetria miedzy ekranami: prompt natalny jest znacznie wiekszy (13 obiektow ×
fasety × oryginalne opisy z bazy) i wypelnia okno kontekstu modelu lokalnego — na odpowiedz nie
zostaje miejsca. Prompt okresowy jest mniejszy i sie miesci. Dlatego Kalendarz dzialal,
a Interpretacje nie.

Naprawa

Wspolny straznik _require_text() dla obu dostawcow: pusta lub bialoznakowa odpowiedz podnosi
LLMError
. Komunikat prowadzi do przyczyny, a nie tylko stwierdza fakt:

Model zwrocil pusta odpowiedz (finish_reason=length, tokeny promptu=8192, tokeny odpowiedzi=0).
Najczestsza przyczyna: prompt nie zmiescil sie w oknie kontekstu modelu i na odpowiedz nie
zostalo miejsca. Zmniejsz budzet promptu (zwiezly), zwieksz okno kontekstu modelu (w Ollamie
num_ctx) albo podnies LLM_MAX_TOKENS.

Anthropic sprowadzony do wspolnego ksztaltu diagnostyki (input_tokens/output_tokens).
Dzieki sciezce llm_error uzytkownik dostaje powod ORAZ gotowy prompt do recznego uzycia.

Weryfikacja

  • 6 nowych testow: pusty string, same bialoznaki, brak tresci u Anthropic, obecnosc
    diagnostyki w komunikacie, oraz ze poprawna odpowiedz nadal przechodzi. Calosc: 148 passed.
  • Na zywym stosie: postawilem atrape modelu oddajaca pusta tresc i odtworzylem dokladnie
    zgloszony objaw — po poprawce zamiast pustej strony pojawia sie pelny komunikat z diagnostyka.

Co to znaczy dla Ciebie w praktyce

Poprawka sprawia, ze zobaczysz przyczyne. Sam horoskop natalny na modelu lokalnym najpewniej
nadal sie nie zmiesci, dopoki nie zrobisz jednego z:

  • budzet promptu zwiezly (~4 tys. znakow) zamiast sredniego,
  • wiekszy num_ctx w Ollamie (domyslny bywa mocno za maly na prompt natalny),
  • albo dostawca w chmurze, ktory ma duze okno kontekstu.
## Objaw W **Kalendarzu** horoskop wyswietla sie poprawnie. W **Interpretacjach** zapytanie wychodzi, wraca — i **nic sie nie pokazuje**, bez zadnego komunikatu. ## Przyczyna Model potrafi oddac **pusta tresc** (`finish_reason=length`, `completion_tokens=0`). `generate()` zwracalo wtedy pusty tekst **bez bledu**, a dalej: ```jinja {% if prompt_result.horoscope %} ← pusty string = falsz → nie renderuje nic ``` i `llm_error` nie byl ustawiony → **zero wyjasnienia**. Klasyczna cicha awaria. **Skad asymetria miedzy ekranami:** prompt **natalny** jest znacznie wiekszy (13 obiektow × fasety × oryginalne opisy z bazy) i wypelnia okno kontekstu modelu lokalnego — na odpowiedz nie zostaje miejsca. Prompt **okresowy** jest mniejszy i sie miesci. Dlatego Kalendarz dzialal, a Interpretacje nie. ## Naprawa Wspolny straznik `_require_text()` dla obu dostawcow: pusta lub bialoznakowa odpowiedz **podnosi `LLMError`**. Komunikat **prowadzi do przyczyny**, a nie tylko stwierdza fakt: > Model zwrocil pusta odpowiedz (finish_reason=length, tokeny promptu=8192, tokeny odpowiedzi=0). > Najczestsza przyczyna: prompt nie zmiescil sie w oknie kontekstu modelu i na odpowiedz nie > zostalo miejsca. Zmniejsz budzet promptu (zwiezly), zwieksz okno kontekstu modelu (w Ollamie > num_ctx) albo podnies LLM_MAX_TOKENS. Anthropic sprowadzony do wspolnego ksztaltu diagnostyki (`input_tokens`/`output_tokens`). Dzieki sciezce `llm_error` uzytkownik dostaje **powod ORAZ gotowy prompt** do recznego uzycia. ## Weryfikacja - **6 nowych testow**: pusty string, same bialoznaki, brak tresci u Anthropic, obecnosc diagnostyki w komunikacie, oraz ze poprawna odpowiedz **nadal przechodzi**. Calosc: **148 passed**. - **Na zywym stosie**: postawilem atrape modelu oddajaca pusta tresc i odtworzylem dokladnie zgloszony objaw — po poprawce zamiast pustej strony pojawia sie pelny komunikat z diagnostyka. ## Co to znaczy dla Ciebie w praktyce Poprawka sprawia, ze **zobaczysz przyczyne**. Sam horoskop natalny na modelu lokalnym najpewniej nadal sie nie zmiesci, dopoki nie zrobisz jednego z: - budzet promptu **zwiezly** (~4 tys. znakow) zamiast sredniego, - wiekszy `num_ctx` w Ollamie (domyslny bywa mocno za maly na prompt natalny), - albo dostawca w chmurze, ktory ma duze okno kontekstu.
gitea added 1 commit 2026-07-22 16:37:43 +00:00
fix(llm): pusta odpowiedz modelu to blad, nie pusta strona
Testy / Testy warstwy logicznej (silnik) (push) Successful in 10m59s
Testy / Testy warstwy prezentacji (dostęp do baz) (push) Successful in 9m52s
Testy / Build obrazu silnika B (swisseph) (push) Failing after 1m27s
Testy / Kontrola składni wszystkich warstw (push) Successful in 40s
Testy / Testy warstwy logicznej (silnik) (pull_request) Successful in 11m15s
Testy / Testy warstwy prezentacji (dostęp do baz) (pull_request) Successful in 9m55s
Testy / Build obrazu silnika B (swisseph) (pull_request) Failing after 40s
Testy / Kontrola składni wszystkich warstw (pull_request) Successful in 24s
0d9adc35a5
Objaw zgloszony przez uzytkownika: w Kalendarzu horoskop wyswietla sie
poprawnie, w Interpretacjach zapytanie wychodzi, wraca — i NIC sie nie
pokazuje. Bez zadnego komunikatu.

Przyczyna: model potrafi oddac pusta tresc (finish_reason=length,
completion_tokens=0), a generate() zwracalo wtedy pusty tekst BEZ bledu.
Widok sprawdza {% if prompt_result.horoscope %} -> falsz -> nie renderuje nic,
a llm_error nie jest ustawiony -> zero wyjasnienia. Cicha awaria.

Asymetria miedzy ekranami wynika z rozmiaru promptu: natalny (13 obiektow x
fasety x opisy z bazy) wypelnia okno kontekstu modelu lokalnego i na odpowiedz
nie zostaje miejsca; okresowy jest mniejszy i sie miesci.

- wspolny straznik _require_text() dla obu dostawcow: pusta lub bialoznakowa
  odpowiedz podnosi LLMError,
- komunikat PROWADZI DO PRZYCZYNY: podaje finish_reason i zuzycie tokenow oraz
  radzi zmniejszyc budzet promptu / zwiekszyc num_ctx / LLM_MAX_TOKENS,
- Anthropic sprowadzony do wspolnego ksztaltu diagnostyki (input/output_tokens).

Dzieki temu uzytkownik widzi powod ORAZ gotowy prompt do recznego uzycia.

Zweryfikowane na zywym stosie z atrapa modelu oddajaca pusta tresc: zamiast
pustej strony pojawia sie pelny komunikat z diagnostyka. Testy: 148 passed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
gitea merged commit 877ec91ff0 into master 2026-07-22 18:05:20 +00:00
gitea deleted branch fix/empty-llm-response 2026-07-22 18:05:21 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gitea/astrololo#17