diff --git a/RETRIEX_PATCH_58_SINGLE_GENRE_LEGACY_VALUE_REDUCTION_README.md b/RETRIEX_PATCH_58_SINGLE_GENRE_LEGACY_VALUE_REDUCTION_README.md new file mode 100644 index 0000000..35e81ce --- /dev/null +++ b/RETRIEX_PATCH_58_SINGLE_GENRE_LEGACY_VALUE_REDUCTION_README.md @@ -0,0 +1,81 @@ +# RetrieX Patch p58 - Single-Genre Legacy Value Reduction + +## Ziel + +Dieser Patch ist der erste kontrollierte Legacy-Cleanup nach p56/p57. + +Es bleibt strikt bei: eine Installation = ein Genre. Es gibt keine Multi-Genre-Umschaltung, keinen Tenant-Kontext und keinen Request-/Host-Resolver. + +## Warum dieser Schritt + +p55 hat die aktuellen fachlichen Wasseranalyse-/Messgeraete-Werte in `config/retriex/genre.yaml` gespiegelt. p56 hat eine erste sichere Auswahl dieser Werte als bevorzugte Runtime-Quelle verdrahtet. p57 hat die `source_paths` dieser zentralen Genre-Werte validierbar und auditierbar gemacht. + +p58 reduziert nun die erste Welle doppelter Legacy-Wertpflege: Werte, die p56 bereits bevorzugt aus `genre.yaml` liest, werden an ihren alten Pfaden zu leeren Platzhaltern reduziert. Die Pfade bleiben vorhanden, damit Validierung, Audit und Source-Path-Dokumentation weiterhin stabil bleiben. + +## Was geaendert wurde + +Reduziert wurden ausschliesslich bereits verdrahtete Legacy-Werte in: + +- `config/retriex/agent.yaml` + - Shopquery-Stopword-Cleanup-Terms + - direkte Attribut-/Vergleichs-Patterns + - referenzielle Kontextterme + - History-Anchor-Patterns und Template + - Meta-Query-Guard-Terms + - RAG-Anchor-Enrichment-Patterns/-Terms + - Result-Identity-Listen + - Laengenfilter-/Sortierpatterns + - Direct-Shop-Answer-Texte +- `config/retriex/commerce.yaml` + - `commerce_query.known_brands` + - `commerce_query.search_token_canonical_map` +- `config/retriex/intent.yaml` + - Commerce-Strong-Signals + - Advisory-Signals und Advisory-Patterns + - Size-/Color-Terms + - Explicit-Commerce-Intent-Patterns +- `config/retriex/query_enrichment.yaml` + - Query-Enrichment-Regeln + +## Nicht geaendert + +- Keine Fachlogik-Aenderung. +- Keine neuen fachlichen Listen. +- Keine neuen Defaults. +- Keine Shopware-Kriterien-, Ranking-, Retrieval- oder LLM-Verhaltensaenderung. +- Keine Multi-Genre-/Tenant-Loesung. +- Keine Entfernung von Legacy-Pfaden. +- Keine Reduktion der noch nicht voll entkoppelten `vocabulary.yaml`-Include-Ketten. + +## Erwartetes Verhalten + +Das Antwortverhalten soll unveraendert bleiben. Die reduzierten Legacy-Werte sind identisch in `genre.configuration_values` vorhanden und werden durch p56 bevorzugt gelesen. Die alten Pfade bleiben als leere Fallback-/Audit-Platzhalter erhalten. + +Damit wird die zentrale Single-Genre-Pflegeflaeche staerker: Fuer eine spaetere Umwidmung auf ein anderes Genre sollen diese Werte in `genre.yaml` gepflegt werden, nicht mehr parallel in den alten Runtime-Dateien. + +## Lokale Pruefung + +Durchgefuehrt: + +```bash +python3 - <<'PY' +# YAML-Parsing fuer alle Dateien unter config/retriex/*.yaml und config/services.yaml +PY +``` + +Zusaetzlich wurde statisch geprueft: + +- 32 reduzierte Legacy-Pfade hatten vor der Reduktion identische Werte in `genre.configuration_values`. +- dieselben 32 Legacy-Pfade sind nach der Reduktion leer, aber weiterhin vorhanden. + +`bin/console` konnte lokal nicht ausgefuehrt werden, weil im ZIP kein `vendor/` enthalten ist. + +## Projektchecks nach dem Einspielen + +```bash +bin/console cache:clear +bin/console mto:agent:config:validate +bin/console mto:agent:regression:test +bin/console mto:agent:config:audit-source --details +bin/console mto:agent:config:audit-patterns --details +``` diff --git a/config/retriex/agent.yaml b/config/retriex/agent.yaml index 8498f5e..7cef824 100644 --- a/config/retriex/agent.yaml +++ b/config/retriex/agent.yaml @@ -184,48 +184,7 @@ parameters: # Plain Shopware text search should contain product-relevant terms only. # These terms are UI, instruction, presentation or sorting words and are # removed after LLM query optimization. Keep this list simple and local. - terms: - - zeige - - zeig - - suche - - such - - finde - - find - - gib - - gebe - - nenne - - mir - - bitte - - ich - - wir - - im - - in - - shop - - für - - fuer - - nach - - mit - - ohne - - von - - zum - - zur - - der - - die - - das - - ein - - eine - - einen - - ordne - - sortiere - - sortiert - - sortierung - - liste - - tabelle - - übersicht - - uebersicht - - auflistung - - meter - - metern + terms: [] attribute_cleanup: @@ -242,42 +201,19 @@ parameters: vocabulary_views: product_type_terms: search_repair.direct_product_type_terms stop_terms: search_repair.direct_product_attribute_stop_terms - comparative_constraint_patterns: - - '/\b(?:länger|laenger|kürzer|kuerzer|größer|groesser|kleiner|über|ueber|unter|mindestens|maximal|maximum|minimum|ab|bis|mehr\s+als|weniger\s+als)\s+(?P\d+(?:[,.]\d+)?\s*[\p{L}µ°%]*)\b/iu' + comparative_constraint_patterns: [] context_resolution: context_usage: - referential_terms: - - der - - die - - das - - den - - dem - - dazu - - davon - - dafür - - dafuer - - dieser - - diese - - dieses - - obige - - obigen - - oben - - vorher - - zuvor - - gleiche - - gleichen - - selbe - - selben + referential_terms: [] history_anchor_enrichment: enabled: true max_query_terms: 2 - template: '{anchor} {query}' + template: '' vocabulary_views: trigger_terms: agent.shop_runtime.context_resolution.history_anchor_enrichment.trigger_terms - anchor_patterns: - - '/\b(?:indikator(?:typ)?|indicator(?:\s+type)?|reagenz(?:satz|typ)?|reagent(?:\s+set|\s+type)?|typ|type)\s+[A-Za-zÄÖÜäöüß]{0,8}\s*\d{1,5}(?:\s*[A-ZÄÖÜ]{1,4})?(?:\s*%)?\b/iu' + anchor_patterns: [] meta_query_guard: enabled: true cleanup_profile: shop_context_fallback @@ -289,29 +225,8 @@ parameters: # Legacy/domain override list. Generic stopwords, user-instruction # phrases and presentation terms are provided by profile # `shop_context_fallback`. Keep shop/price/domain terms here. - context_fallback_filter_terms: - - preis - - preise - - preisen - - kosten - - kostet - - grenzwert - - grenzwerte - - grenzwerten - - welche - - gut - - geeignet - - messen - - gemessen - meta_only_terms: - - shop - - preis - - preise - - preisen - - kosten - - kostet - - shopsuche - - shop-suche + context_fallback_filter_terms: [] + meta_only_terms: [] rag_anchor_enrichment: enabled: true # Enriches overly narrow numeric shop queries with a product anchor from @@ -326,24 +241,10 @@ parameters: exact_value_with_unit: 120 exact_value_only: 40 anchor_bonus: 50 - numeric_focus_patterns: - - '/(?P\d+(?:[,.]\d+)?)\s*(?P°?\s*d\s*h|dh|dH)/iu' - product_title_patterns: - - '/#\s*Produkt\s+Titel:\s*`(?P[^`]+)`/iu' - - '/\*\*Produktname:\*\*\s*(?P<title>[^\r\n]+)/iu' - anchor_bonus_patterns: - - '/\b[\p{L}][\p{L}\p{N}®+._-]*(?:\s+|[-_])\d{2,5}\b/u' - subject_terms: - - resthärte - - resthaerte - - wasserhärte - - wasserhaerte - - gesamthärte - - gesamthaerte - - härte - - haerte - - grenzwert - - messung + numeric_focus_patterns: [] + product_title_patterns: [] + anchor_bonus_patterns: [] + subject_terms: [] result_identity: @@ -358,9 +259,7 @@ parameters: # Some Shopware product names combine the requested product type with # a noun suffix, for example "pH-Pufferlösung". Keep this list small # and explicit so broad direct-result filtering remains safe. - terms: - - puffer - - kalibrierpuffer + terms: [] primary_identity_repair: enabled: true min_query_tokens_after_cleanup: 2 @@ -369,56 +268,29 @@ parameters: # such as brand/pH/Redox, but remove target-device wording that can # push Shopware ranking toward devices instead of the requested # accessory/consumable. - stop_terms: - - messgerät - - messgeraet - - messgeräte - - messgeraete - - messgeräten - - messgeraeten - - gerät - - geraet - - geräte - - geraete - - geräten - - geraeten - - handmessgerät - - handmessgeraet - - handmessgeräte - - handmessgeraete - - messkoffer - - koffer + stop_terms: [] answer_constraints: length_sort: enabled: true - trigger_patterns: - - '/\b(?:ordne|sortiere|sortiert|sortierung)\b.{0,80}\b(?:meter|metern|m)\b/iu' - - '/\bnach\s+(?:meter|metern|m)\b/iu' - value_patterns: - - '/(?P<value>\d+(?:[,.]\d+)?)\s*(?:m|meter|metern)\b/iu' + trigger_patterns: [] + value_patterns: [] length_filter: enabled: true - min_patterns: - - '/\b(?:ab|mindestens|minimum|min\.?|>=|größer\s+gleich|groesser\s+gleich)\s*(?P<value>\d+(?:[,.]\d+)?)\s*(?:m|meter|metern)\b/iu' - - '/\b(?:länger|laenger|größer|groesser|mehr)\s+(?:als\s+)?(?P<value>\d+(?:[,.]\d+)?)\s*(?:m|meter|metern)\b/iu' - - '/(?P<value>\d+(?:[,.]\d+)?)\s*(?:m|meter|metern)\s*(?:oder\s+)?(?:länger|laenger|mehr)\b/iu' - max_patterns: - - '/\b(?:bis|maximal|maximum|max\.?|höchstens|hoechstens|<=|kleiner\s+gleich)\s*(?P<value>\d+(?:[,.]\d+)?)\s*(?:m|meter|metern)\b/iu' - - '/\b(?:kürzer|kuerzer|kleiner|weniger)\s+(?:als\s+)?(?P<value>\d+(?:[,.]\d+)?)\s*(?:m|meter|metern)\b/iu' - - '/(?P<value>\d+(?:[,.]\d+)?)\s*(?:m|meter|metern)\s*(?:oder\s+)?(?:kürzer|kuerzer|weniger)\b/iu' + min_patterns: [] + max_patterns: [] direct_answer: enabled: true max_results: 10 - intro: 'Aus den Shopdaten ergeben sich folgende passende Treffer:' - no_results: 'Ich finde in den Shopdaten keine passenden Treffer für die angefragte Produktsuche. Ich liste deshalb keine fachfremden Ersatzprodukte auf.' - sorted_by_length_note: 'Sortierung: aufsteigend nach erkannter Kabellänge.' - min_length_filter_note: 'Filter: nur Treffer ab {value} m.' - max_length_filter_note: 'Filter: nur Treffer bis {value} m.' + intro: '' + no_results: '' + sorted_by_length_note: '' + min_length_filter_note: '' + max_length_filter_note: '' rag_evidence_guard: diff --git a/config/retriex/commerce.yaml b/config/retriex/commerce.yaml index 00dae93..e76357a 100644 --- a/config/retriex/commerce.yaml +++ b/config/retriex/commerce.yaml @@ -16,10 +16,7 @@ parameters: retriex.commerce_query.config: cleanup_profile: commerce_query - known_brands: - - heyl - - horiba - - neomeris + known_brands: [] # Legacy/domain override list. General user-instruction phrases are provided by # language cleanup profile `commerce_query`. Keep only commerce-specific or @@ -96,14 +93,7 @@ parameters: schwinnbad: schwimmbad schwimbad: schwimmbad - search_token_canonical_map: - indikatoren: indikator - indicators: indikator - indicator: indikator - reagenzien: reagenz - reagents: reagenz - reagent: reagenz - produkte: produkt + search_token_canonical_map: {} vocabulary_views: semantic_shop_search_tokens: shop.semantic_search_tokens diff --git a/config/retriex/intent.yaml b/config/retriex/intent.yaml index 312071e..f237460 100644 --- a/config/retriex/intent.yaml +++ b/config/retriex/intent.yaml @@ -3,50 +3,7 @@ # Migrated config areas are YAML-only; remaining areas are migrated incrementally. parameters: retriex.intent.commerce.config: - strong_signals: - - shop - - alle - - preis - - preise - - preisen - - kunde - - online - - produkt - - artikel - - sku - - kaufen - - kostet - - suche - - such - - finde - - finden - - analysegerät - - analysegeraet - - messgerät - - messgeraet - - pockettester - - pocket tester - - handmessgerät - - handmessgeraet - - analysator - - analyzer - - puffer - - kalibrierpuffer - - kalibrierlösung - - kalibrierloesung - - kalibrierung - - chemie - - reagenz - - reagenzien - - verbrauchsmaterial - - zubehör - - zubehoer - - ersatzteil - - anschlusskabel - - kabel - - sensorkabel - - elektrode - - elektrodenkabel + strong_signals: [] non_product_commerce_signals: - shop - alle @@ -58,27 +15,8 @@ parameters: - such - finde - finden - advisory_signals: - - passt - - eignet - - besser - - besten - - gut - - gut für - - gut fuer - - passend für - - passend fuer - - geeignet - - geeigent - - empfiehl - - empfehl - advisory_product_selection_patterns: - - '/\bmit\s+welche(?:m|n|r|s)?\s+(?:testomat(?:en)?|pockettester|pocket\s+tester|analysegerät|analysegeraet|messgerät|messgeraet|analysator|analyzer)\b.*\b(?:messen|messung|überwach(?:en|ung)?|ueberwach(?:en|ung)?)\b/u' - - '/\bwelche(?:r|s|n|m)?\s+(?:testomat(?:en)?|pockettester|pocket\s+tester|analysegerät|analysegeraet|messgerät|messgeraet|analysator|analyzer)\b.*\b(?:kann|können|koennen|misst|messen|überwacht|ueberwacht|eignet|geeignet|passt|gut|empfehl)\b.*\b(?:messen|messung|überwach(?:en|ung)?|ueberwach(?:en|ung)?)\b/u' - - '/\b(?:testomat(?:en)?|pockettester|pocket\s+tester|analysegerät|analysegeraet|messgerät|messgeraet|analysator|analyzer)\b.*\b(?:für|fuer)\b.*\b(?:messung|messen|überwachung|ueberwachung)\b/u' - - '/\b(?:ich\s+)?(?:würde|wuerde|möchte|moechte|will|brauche|benötige|benoetige)\b.{0,80}\b(?:messen|messung|überwachen|ueberwachen|kontrollieren)\b/u' - - '/\b(?:ich\s+)?(?:suche|finde)\b.{0,120}\b(?:lösung|loesung|gerät|geraet|messgerät|messgeraet|handmessgerät|handmessgeraet|pockettester|analysegerät|analysegeraet|analysator|produkt|artikel)\b.{0,120}\b(?:messen|messung|überwachen|ueberwachen|kontrollieren|wasseranalyse|schwimmbad|pool|becken)\b/u' - - '/\b(?:messen|messung|überwachen|ueberwachen|kontrollieren)\b.{0,80}\b(?:schwimmbad|pool|becken|wasseranalyse)\b/u' + advisory_signals: [] + advisory_product_selection_patterns: [] price_terms: - euro - € @@ -93,30 +31,9 @@ parameters: - preiswerte - günstig - guenstig - color_terms: - - schwarz - - weiß - - weis - - blau - - grau - - beige - - rosa - - pink - - gruen - - orange - - braun - size_token_terms: - - xs - - s - - m - - l - - xl - - xxl - - xxxxl - size_terms: - - größe - - groesse - - grösse + color_terms: [] + size_token_terms: [] + size_terms: [] support_diagnostic_patterns: - '/\bfehler\b/u' - '/\bfehlercode\b/u' @@ -142,27 +59,7 @@ parameters: - '/\bstörung beheben\b/u' - '/\bstoerung beheben\b/u' - '/\be\d{1,3}\b/u' - explicit_commerce_intent_patterns: - - '/\bshop\b/u' - - '/\bpreis(?:e|en)?\b/u' - - '/\bkosten\b/u' - - '/\bkostet\b/u' - - '/\bkaufen\b/u' - - '/\bbestellen\b/u' - - '/\bprodukt\b/u' - - '/\bartikel\b/u' - - '/\bsku\b/u' - - '/\bonline\b/u' - - '/\bchemie\b/u' - - '/\breagenz(?:ien)?\b/u' - - '/\bverbrauchsmaterial(?:ien)?\b/u' - - '/\bzubehör\b/u' - - '/\bzubehoer\b/u' - - '/\bersatzteil(?:e)?\b/u' - - '/\banschlusskabel\b/u' - - '/\bkabel\b/u' - - '/\bsensorkabel\b/u' - - '/\belektrodenkabel\b/u' + explicit_commerce_intent_patterns: [] technical_factual_knowledge: signal_label: technical_factual_knowledge_query question_marker_patterns: diff --git a/config/retriex/query_enrichment.yaml b/config/retriex/query_enrichment.yaml index 2367d0b..059bc45 100644 --- a/config/retriex/query_enrichment.yaml +++ b/config/retriex/query_enrichment.yaml @@ -3,15 +3,4 @@ parameters: retriex.query_enrichment.config: max_expansions: 4 - rules: - Wasserhärte: Resthärte - Gerät: Modell - Indikator: Chemie - Seminar: Webinar - Schulung: Seminar - Indikatoren: Indikator - Wasserhärte-Grenzwert: Resthärte - Resthärte-Grenzwert: Wasserhärte - Grenzwert: Überwachungsbereich - store: shop - Indikatortyp: Indikator + rules: {} diff --git a/public/assets/styles/base.css b/public/assets/styles/base.css index 51a8f03..ed6e9ec 100644 --- a/public/assets/styles/base.css +++ b/public/assets/styles/base.css @@ -88,6 +88,7 @@ input, textarea, select { background: #121a25; border: 1px solid var(--border); border-radius: 6px 6px 0 0; + box-shadow: 0px 0px 20px #ffffff33; } .message { @@ -293,6 +294,7 @@ body { .text-info { --bs-text-opacity: 1; color: #86b7fe !important; + font-size: .7rem; } .btn-outline-info { @@ -545,6 +547,7 @@ body:not(.retriex-show-detail-cards) #chat .retriex-alert { color: #f8f9fa; font-weight: 700; margin-bottom: 0.55rem; + font-size: .7rem; } .retriex-meta-card__body { @@ -561,7 +564,7 @@ body:not(.retriex-show-detail-cards) #chat .retriex-alert { padding: 0.18rem 0.55rem; background: rgba(134, 183, 254, 0.14); color: #cfe2ff; - font-size: 0.78rem; + font-size: 0.7rem; font-weight: 600; } @@ -644,7 +647,7 @@ body:not(.retriex-show-detail-cards) #chat .retriex-alert { .retriex-source-overview > span, .retriex-product-results__summary { color: rgba(248, 249, 250, 0.72); - font-size: 0.82rem; + font-size: 0.7rem; font-weight: 600; } @@ -662,13 +665,13 @@ body:not(.retriex-show-detail-cards) #chat .retriex-alert { padding: 0.16rem 0.55rem; background: rgba(13, 202, 240, 0.14); color: #b6effb; - font-size: 0.78rem; + font-size: 0.7rem; font-weight: 700; } .retriex-source-overview__empty { color: rgba(248, 249, 250, 0.58); - font-size: 0.86rem; + font-size: 0.7rem; } .retriex-product-results__summary { @@ -723,13 +726,13 @@ body:not(.retriex-show-detail-cards) #chat .retriex-alert { .retriex-product-card__facts dt { color: rgba(248, 249, 250, 0.58); - font-size: 0.76rem; + font-size: 0.7rem; font-weight: 700; } .retriex-product-card__facts dd { color: rgba(248, 249, 250, 0.9); - font-size: 0.8rem; + font-size: 0.7rem; margin: 0; word-break: break-word; }