feat(routines): refine therapeutic and travel-mode prompt rules

This commit is contained in:
Piotr Oleszczyk 2026-03-04 02:22:39 +01:00
parent a7ad956a62
commit 472a3034a0

View file

@ -414,11 +414,14 @@ CEL:
Twórz realistyczne, bezpieczne i krótkie rutyny o wysokiej zgodności z danymi wejściowymi. Twórz realistyczne, bezpieczne i krótkie rutyny o wysokiej zgodności z danymi wejściowymi.
PRIORYTETY DECYZYJNE (od najwyższego): PRIORYTETY DECYZYJNE (od najwyższego):
1) Bezpieczeństwo i przeciwwskazania 1) Bezpieczeństwo (brak realnego ryzyka klinicznego)
2) Zgodność ze schematem JSON i listą dostępnych produktów 2) Cel terapeutyczny użytkownika
3) Reguły częstotliwości oraz odstępów czasowych 3) Reguły częstotliwości i odstępów
4) Cel użytkownika (np. broda/wąsy, nawilżenie, tolerancja) 4) Zarządzanie inwentarzem
5) Prostota rutyny 5) Prostota
> Cel terapeutyczny oznacza maksymalizację realnego efektu klinicznego,
> nie tylko zgodność z deklarowanymi targetami produktu.
WYMAGANIA ODPOWIEDZI: WYMAGANIA ODPOWIEDZI:
- Zwracaj wyłącznie poprawny JSON (bez markdown, bez komentarzy, bez preambuły). - Zwracaj wyłącznie poprawny JSON (bez markdown, bez komentarzy, bez preambuły).
@ -432,12 +435,23 @@ ZASADY PLANOWANIA:
- Respektuj: incompatible_with (same_step / same_day / same_period), context_rules, - Respektuj: incompatible_with (same_step / same_day / same_period), context_rules,
min_interval_hours, max_frequency_per_week, usage_notes. min_interval_hours, max_frequency_per_week, usage_notes.
- Zarządzanie inwentarzem: - Zarządzanie inwentarzem:
- najpierw zużywaj produkty już otwarte, - Preferuj produkty już otwarte (miękka preferencja).
- minimalizuj liczbę jednocześnie otwartych produktów funkcjonalnie podobnych, - Zamknięty produkt otwieraj tylko wtedy, gdy:
- nie rozpoczynaj nowego produktu, jeśli istnieje funkcjonalny odpowiednik otwarty i kompatybilny, a) bezpieczeństwo jest zachowane oraz
- JEDNAKŻE: jeśli zamknięty produkt drastycznie lepiej odpowiada na aktualne priorytety i stan skóry niż jakikolwiek otwarty, możesz zaproponować jego otwarcie. b) daje wyraźnie lepszy efekt terapeutyczny dla głównego priorytetu
- jeśli nearest_open_pao_deadline lub nearest_open_expiry jest dostępne, preferuj produkt z wcześniejszą datą w swojej kategorii, (>= +1 poziom siły w effect_profile) lub wnosi inną klinicznie istotną klasę aktywną.
- rotuj tylko gdy daje to wartość terapeutyczną. - Jeśli istnieje porównywalny produkt otwarty (różnica < +1 poziomu),
nie otwieraj nowego.
- nearest_open_pao_deadline i nearest_open_expiry wykorzystuj jako tie-breaker
między produktami już otwartymi.
- Unikaj funkcjonalnej redundancji (np. wielokrotne źródła panthenolu, ceramidów lub niacynamidu w tej samej rutynie),
chyba że istnieje wyraźne uzasadnienie terapeutyczne.
- Maksymalnie 2 serum w rutynie.
Jeśli 2: jedno jako główny aktywny bodziec, drugie wyłącznie wspierające.
- Dla mildly_compromised nie eliminuj automatycznie umiarkowanych aktywnych;
decyzję opieraj na effect_profile (irritation_risk, barrier_disruption_risk) i regułach bezpieczeństwa.
- Nie zwiększaj intensywności terapii (retinoid/kwasy) dzień po dniu,
jeśli brak wyraźnej poprawy stanu skóry lub brak wskazań klinicznych.
- Nie łącz retinoidów i kwasów w tej samej rutynie ani tego samego dnia (dla planu wielodniowego). - Nie łącz retinoidów i kwasów w tej samej rutynie ani tego samego dnia (dla planu wielodniowego).
- W AM zawsze uwzględnij SPF, jeśli kompatybilny produkt SPF istnieje na liście. - W AM zawsze uwzględnij SPF, jeśli kompatybilny produkt SPF istnieje na liście.
Wybór filtra (na podstawie KONTEKST DNIA): Wybór filtra (na podstawie KONTEKST DNIA):
@ -454,9 +468,12 @@ ZASADY PLANOWANIA:
Dla standardowych kroków pielęgnacji całej twarzy pozostaw region puste. Dla standardowych kroków pielęgnacji całej twarzy pozostaw region puste.
JAK ROZWIĄZYWAĆ KONFLIKTY: JAK ROZWIĄZYWAĆ KONFLIKTY:
- Gdy cel użytkownika koliduje z bezpieczeństwem, wybierz bezpieczeństwo. - Bezpieczeństwo > wszystko.
- Gdy dwa produkty podobne, wybierz łagodniejszy lub prostszy wariant. - Jeśli MODE=travel: logistyka podróży > różnorodność terapeutyczna.
- Gdy dane niepełne lub niejednoznaczne, wybierz wariant konserwatywny. - W MODE=travel odejdź od minimalizacji produktów tylko gdy wymaga tego bezpieczeństwo
lub bez dodatkowego produktu nie da się osiągnąć głównego celu terapeutycznego.
- Jeśli MODE=standard i bezpieczeństwo jest zachowane, preferuj różnorodność terapeutyczną.
- Przy niepełnych danych wybierz wariant konserwatywny.
""" """
@ -545,15 +562,17 @@ def suggest_routine(
) )
objectives_ctx = _build_objectives_context(data.include_minoxidil_beard) objectives_ctx = _build_objectives_context(data.include_minoxidil_beard)
notes_line = f"\nUSER CONTEXT: {data.notes}\n" if data.notes else "" mode_line = "MODE: standard"
notes_line = f"USER CONTEXT: {data.notes}\n" if data.notes else ""
day_name = _DAY_NAMES[weekday] day_name = _DAY_NAMES[weekday]
prompt = ( prompt = (
f"Zaproponuj rutynę pielęgnacyjną {data.part_of_day.value.upper()} " f"Zaproponuj rutynę pielęgnacyjną {data.part_of_day.value.upper()} "
f"na {data.routine_date} ({day_name}).\n\n" f"na {data.routine_date} ({day_name}).\n\n"
f"{mode_line}\n"
"INPUT DATA:\n" "INPUT DATA:\n"
f"{skin_ctx}\n{grooming_ctx}\n{history_ctx}\n{day_ctx}\n{products_ctx}\n{objectives_ctx}" f"{skin_ctx}\n{grooming_ctx}\n{history_ctx}\n{day_ctx}\n{products_ctx}\n{objectives_ctx}"
f"{notes_line}\n" f"{notes_line}"
f"{_ROUTINES_SINGLE_EXTRA}\n" f"{_ROUTINES_SINGLE_EXTRA}\n"
"Zwróć JSON zgodny ze schematem." "Zwróć JSON zgodny ze schematem."
) )
@ -643,15 +662,19 @@ def suggest_batch(
date_range_lines.append(f" {d} ({_DAY_NAMES[d.weekday()]})") date_range_lines.append(f" {d} ({_DAY_NAMES[d.weekday()]})")
dates_str = "\n".join(date_range_lines) dates_str = "\n".join(date_range_lines)
notes_line = f"\nUSER CONTEXT: {data.notes}\n" if data.notes else "" notes_line = f"USER CONTEXT: {data.notes}\n" if data.notes else ""
mode_line = "MODE: travel" if data.minimize_products else "MODE: standard"
minimize_line = ( minimize_line = (
"\nCONSTRAINTS:\n - Minimize number of unique products (reuse the same products multiple times)\n" "\nCONSTRAINTS (TRAVEL MODE):\n"
"- To tryb podróżny: minimalizuj liczbę unikalnych produktów w całym planie (wszystkie dni, AM+PM).\n"
"- Preferuj reużycie tych samych produktów między dniami, jeśli bezpieczeństwo i główny cel terapeutyczny są zachowane.\n"
"- Dodaj nowy produkt tylko gdy to konieczne dla bezpieczeństwa albo realizacji głównego celu terapeutycznego.\n"
if data.minimize_products if data.minimize_products
else "" else ""
) )
prompt = ( prompt = (
f"Zaproponuj plan pielęgnacji AM + PM dla każdego dnia z zakresu:\n{dates_str}\n\n" f"Zaproponuj plan pielęgnacji AM + PM dla każdego dnia z zakresu:\n{dates_str}\n\n{mode_line}\n"
"INPUT DATA:\n" "INPUT DATA:\n"
f"{skin_ctx}\n{grooming_ctx}\n{history_ctx}\n{products_ctx}\n{objectives_ctx}" f"{skin_ctx}\n{grooming_ctx}\n{history_ctx}\n{products_ctx}\n{objectives_ctx}"
f"{notes_line}{minimize_line}" f"{notes_line}{minimize_line}"