This commit is contained in:
team 1
2026-05-06 18:25:56 +02:00
parent 8a2f4f3c67
commit 02fd087323
6 changed files with 122 additions and 290 deletions

View File

@@ -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
```

View File

@@ -184,48 +184,7 @@ parameters:
# Plain Shopware text search should contain product-relevant terms only. # Plain Shopware text search should contain product-relevant terms only.
# These terms are UI, instruction, presentation or sorting words and are # These terms are UI, instruction, presentation or sorting words and are
# removed after LLM query optimization. Keep this list simple and local. # removed after LLM query optimization. Keep this list simple and local.
terms: 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
attribute_cleanup: attribute_cleanup:
@@ -242,42 +201,19 @@ parameters:
vocabulary_views: vocabulary_views:
product_type_terms: search_repair.direct_product_type_terms product_type_terms: search_repair.direct_product_type_terms
stop_terms: search_repair.direct_product_attribute_stop_terms stop_terms: search_repair.direct_product_attribute_stop_terms
comparative_constraint_patterns: 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<value>\d+(?:[,.]\d+)?\s*[\p{L}µ°%]*)\b/iu'
context_resolution: context_resolution:
context_usage: context_usage:
referential_terms: referential_terms: []
- der
- die
- das
- den
- dem
- dazu
- davon
- dafür
- dafuer
- dieser
- diese
- dieses
- obige
- obigen
- oben
- vorher
- zuvor
- gleiche
- gleichen
- selbe
- selben
history_anchor_enrichment: history_anchor_enrichment:
enabled: true enabled: true
max_query_terms: 2 max_query_terms: 2
template: '{anchor} {query}' template: ''
vocabulary_views: vocabulary_views:
trigger_terms: agent.shop_runtime.context_resolution.history_anchor_enrichment.trigger_terms trigger_terms: agent.shop_runtime.context_resolution.history_anchor_enrichment.trigger_terms
anchor_patterns: 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'
meta_query_guard: meta_query_guard:
enabled: true enabled: true
cleanup_profile: shop_context_fallback cleanup_profile: shop_context_fallback
@@ -289,29 +225,8 @@ parameters:
# Legacy/domain override list. Generic stopwords, user-instruction # Legacy/domain override list. Generic stopwords, user-instruction
# phrases and presentation terms are provided by profile # phrases and presentation terms are provided by profile
# `shop_context_fallback`. Keep shop/price/domain terms here. # `shop_context_fallback`. Keep shop/price/domain terms here.
context_fallback_filter_terms: context_fallback_filter_terms: []
- preis meta_only_terms: []
- preise
- preisen
- kosten
- kostet
- grenzwert
- grenzwerte
- grenzwerten
- welche
- gut
- geeignet
- messen
- gemessen
meta_only_terms:
- shop
- preis
- preise
- preisen
- kosten
- kostet
- shopsuche
- shop-suche
rag_anchor_enrichment: rag_anchor_enrichment:
enabled: true enabled: true
# Enriches overly narrow numeric shop queries with a product anchor from # Enriches overly narrow numeric shop queries with a product anchor from
@@ -326,24 +241,10 @@ parameters:
exact_value_with_unit: 120 exact_value_with_unit: 120
exact_value_only: 40 exact_value_only: 40
anchor_bonus: 50 anchor_bonus: 50
numeric_focus_patterns: numeric_focus_patterns: []
- '/(?P<value>\d+(?:[,.]\d+)?)\s*(?P<unit>°?\s*d\s*h|dh|dH)/iu' product_title_patterns: []
product_title_patterns: anchor_bonus_patterns: []
- '/#\s*Produkt\s+Titel:\s*`(?P<title>[^`]+)`/iu' subject_terms: []
- '/\*\*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
result_identity: result_identity:
@@ -358,9 +259,7 @@ parameters:
# Some Shopware product names combine the requested product type with # Some Shopware product names combine the requested product type with
# a noun suffix, for example "pH-Pufferlösung". Keep this list small # a noun suffix, for example "pH-Pufferlösung". Keep this list small
# and explicit so broad direct-result filtering remains safe. # and explicit so broad direct-result filtering remains safe.
terms: terms: []
- puffer
- kalibrierpuffer
primary_identity_repair: primary_identity_repair:
enabled: true enabled: true
min_query_tokens_after_cleanup: 2 min_query_tokens_after_cleanup: 2
@@ -369,56 +268,29 @@ parameters:
# such as brand/pH/Redox, but remove target-device wording that can # such as brand/pH/Redox, but remove target-device wording that can
# push Shopware ranking toward devices instead of the requested # push Shopware ranking toward devices instead of the requested
# accessory/consumable. # accessory/consumable.
stop_terms: 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
answer_constraints: answer_constraints:
length_sort: length_sort:
enabled: true enabled: true
trigger_patterns: trigger_patterns: []
- '/\b(?:ordne|sortiere|sortiert|sortierung)\b.{0,80}\b(?:meter|metern|m)\b/iu' value_patterns: []
- '/\bnach\s+(?:meter|metern|m)\b/iu'
value_patterns:
- '/(?P<value>\d+(?:[,.]\d+)?)\s*(?:m|meter|metern)\b/iu'
length_filter: length_filter:
enabled: true enabled: true
min_patterns: 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' max_patterns: []
- '/\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'
direct_answer: direct_answer:
enabled: true enabled: true
max_results: 10 max_results: 10
intro: 'Aus den Shopdaten ergeben sich folgende passende Treffer:' intro: ''
no_results: 'Ich finde in den Shopdaten keine passenden Treffer für die angefragte Produktsuche. Ich liste deshalb keine fachfremden Ersatzprodukte auf.' no_results: ''
sorted_by_length_note: 'Sortierung: aufsteigend nach erkannter Kabellänge.' sorted_by_length_note: ''
min_length_filter_note: 'Filter: nur Treffer ab {value} m.' min_length_filter_note: ''
max_length_filter_note: 'Filter: nur Treffer bis {value} m.' max_length_filter_note: ''
rag_evidence_guard: rag_evidence_guard:

View File

@@ -16,10 +16,7 @@ parameters:
retriex.commerce_query.config: retriex.commerce_query.config:
cleanup_profile: commerce_query cleanup_profile: commerce_query
known_brands: known_brands: []
- heyl
- horiba
- neomeris
# Legacy/domain override list. General user-instruction phrases are provided by # Legacy/domain override list. General user-instruction phrases are provided by
# language cleanup profile `commerce_query`. Keep only commerce-specific or # language cleanup profile `commerce_query`. Keep only commerce-specific or
@@ -96,14 +93,7 @@ parameters:
schwinnbad: schwimmbad schwinnbad: schwimmbad
schwimbad: schwimmbad schwimbad: schwimmbad
search_token_canonical_map: search_token_canonical_map: {}
indikatoren: indikator
indicators: indikator
indicator: indikator
reagenzien: reagenz
reagents: reagenz
reagent: reagenz
produkte: produkt
vocabulary_views: vocabulary_views:
semantic_shop_search_tokens: shop.semantic_search_tokens semantic_shop_search_tokens: shop.semantic_search_tokens

View File

@@ -3,50 +3,7 @@
# Migrated config areas are YAML-only; remaining areas are migrated incrementally. # Migrated config areas are YAML-only; remaining areas are migrated incrementally.
parameters: parameters:
retriex.intent.commerce.config: retriex.intent.commerce.config:
strong_signals: 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
non_product_commerce_signals: non_product_commerce_signals:
- shop - shop
- alle - alle
@@ -58,27 +15,8 @@ parameters:
- such - such
- finde - finde
- finden - finden
advisory_signals: advisory_signals: []
- passt advisory_product_selection_patterns: []
- 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'
price_terms: price_terms:
- euro - euro
- -
@@ -93,30 +31,9 @@ parameters:
- preiswerte - preiswerte
- günstig - günstig
- guenstig - guenstig
color_terms: color_terms: []
- schwarz size_token_terms: []
- weiß size_terms: []
- 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
support_diagnostic_patterns: support_diagnostic_patterns:
- '/\bfehler\b/u' - '/\bfehler\b/u'
- '/\bfehlercode\b/u' - '/\bfehlercode\b/u'
@@ -142,27 +59,7 @@ parameters:
- '/\bstörung beheben\b/u' - '/\bstörung beheben\b/u'
- '/\bstoerung beheben\b/u' - '/\bstoerung beheben\b/u'
- '/\be\d{1,3}\b/u' - '/\be\d{1,3}\b/u'
explicit_commerce_intent_patterns: 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'
technical_factual_knowledge: technical_factual_knowledge:
signal_label: technical_factual_knowledge_query signal_label: technical_factual_knowledge_query
question_marker_patterns: question_marker_patterns:

View File

@@ -3,15 +3,4 @@
parameters: parameters:
retriex.query_enrichment.config: retriex.query_enrichment.config:
max_expansions: 4 max_expansions: 4
rules: 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

View File

@@ -88,6 +88,7 @@ input, textarea, select {
background: #121a25; background: #121a25;
border: 1px solid var(--border); border: 1px solid var(--border);
border-radius: 6px 6px 0 0; border-radius: 6px 6px 0 0;
box-shadow: 0px 0px 20px #ffffff33;
} }
.message { .message {
@@ -293,6 +294,7 @@ body {
.text-info { .text-info {
--bs-text-opacity: 1; --bs-text-opacity: 1;
color: #86b7fe !important; color: #86b7fe !important;
font-size: .7rem;
} }
.btn-outline-info { .btn-outline-info {
@@ -545,6 +547,7 @@ body:not(.retriex-show-detail-cards) #chat .retriex-alert {
color: #f8f9fa; color: #f8f9fa;
font-weight: 700; font-weight: 700;
margin-bottom: 0.55rem; margin-bottom: 0.55rem;
font-size: .7rem;
} }
.retriex-meta-card__body { .retriex-meta-card__body {
@@ -561,7 +564,7 @@ body:not(.retriex-show-detail-cards) #chat .retriex-alert {
padding: 0.18rem 0.55rem; padding: 0.18rem 0.55rem;
background: rgba(134, 183, 254, 0.14); background: rgba(134, 183, 254, 0.14);
color: #cfe2ff; color: #cfe2ff;
font-size: 0.78rem; font-size: 0.7rem;
font-weight: 600; font-weight: 600;
} }
@@ -644,7 +647,7 @@ body:not(.retriex-show-detail-cards) #chat .retriex-alert {
.retriex-source-overview > span, .retriex-source-overview > span,
.retriex-product-results__summary { .retriex-product-results__summary {
color: rgba(248, 249, 250, 0.72); color: rgba(248, 249, 250, 0.72);
font-size: 0.82rem; font-size: 0.7rem;
font-weight: 600; font-weight: 600;
} }
@@ -662,13 +665,13 @@ body:not(.retriex-show-detail-cards) #chat .retriex-alert {
padding: 0.16rem 0.55rem; padding: 0.16rem 0.55rem;
background: rgba(13, 202, 240, 0.14); background: rgba(13, 202, 240, 0.14);
color: #b6effb; color: #b6effb;
font-size: 0.78rem; font-size: 0.7rem;
font-weight: 700; font-weight: 700;
} }
.retriex-source-overview__empty { .retriex-source-overview__empty {
color: rgba(248, 249, 250, 0.58); color: rgba(248, 249, 250, 0.58);
font-size: 0.86rem; font-size: 0.7rem;
} }
.retriex-product-results__summary { .retriex-product-results__summary {
@@ -723,13 +726,13 @@ body:not(.retriex-show-detail-cards) #chat .retriex-alert {
.retriex-product-card__facts dt { .retriex-product-card__facts dt {
color: rgba(248, 249, 250, 0.58); color: rgba(248, 249, 250, 0.58);
font-size: 0.76rem; font-size: 0.7rem;
font-weight: 700; font-weight: 700;
} }
.retriex-product-card__facts dd { .retriex-product-card__facts dd {
color: rgba(248, 249, 250, 0.9); color: rgba(248, 249, 250, 0.9);
font-size: 0.8rem; font-size: 0.7rem;
margin: 0; margin: 0;
word-break: break-word; word-break: break-word;
} }