p86h-k
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
# RetrieX Patch p86h - Multi Product Follow-up Split Lookup Completion
|
||||
|
||||
## Ziel
|
||||
|
||||
p86e/p86g konnten referenzielle Produktlisten-Follow-ups bereits weg von schwachen Meta-Queries wie `links zu aus` auf Produktanker aus dem Verlauf aufloesen. In einem Multi-Produkt-Fall blieb aber eine kombinierte Shopquery sichtbar und teilweise wirksam, z. B.:
|
||||
|
||||
```text
|
||||
testomat 2000 cal 808
|
||||
```
|
||||
|
||||
Diese kombinierte Query kann nur einen Teil der gemeinten Produkte treffen oder ueber Beschreibungen/Zubehoer unpassende Treffer liefern.
|
||||
|
||||
## Problem
|
||||
|
||||
p86g pruefte zwar die Produktidentitaet, stoppte aber sobald mindestens ein passender Treffer vorhanden war. Dadurch wurden fehlende Verlaufanker nicht separat nachgesucht.
|
||||
|
||||
Beispiel:
|
||||
|
||||
```text
|
||||
Vorherige Antwort nennt:
|
||||
- Testomat 2000 CAL
|
||||
- Testomat 808
|
||||
|
||||
Follow-up:
|
||||
gebe mir links zu den produkten aus dem shop
|
||||
|
||||
Primaere Query:
|
||||
testomat 2000 cal 808
|
||||
```
|
||||
|
||||
Wenn die primaere Query nur `Testomat 2000 CAL` fand, wurde nicht mehr separat nach `testomat 808` gesucht.
|
||||
|
||||
## Loesung
|
||||
|
||||
p86h erweitert die p86g-Logik:
|
||||
|
||||
1. Bestehende Shop-Treffer werden weiterhin gegen die Produktidentitaeten der Verlaufanker gefiltert.
|
||||
2. Danach wird ermittelt, welche Verlaufanker bereits abgedeckt sind.
|
||||
3. Wenn bei mehreren Ankern mindestens einer fehlt, werden die Produktanker separat nachgesucht.
|
||||
4. Bereits gefundene Identitaetstreffer und separate Anchor-Lookup-Treffer werden dedupliziert gemerged.
|
||||
5. Die abgeschlossene Shop-Meta-Anzeige zeigt bei referenziellen Produktlisten-Follow-ups die verwendeten Anchor-Queries, z. B.:
|
||||
|
||||
```text
|
||||
testomat 2000 cal | testomat 808
|
||||
```
|
||||
|
||||
## Guardrails
|
||||
|
||||
Der Patch ist bewusst eng begrenzt:
|
||||
|
||||
- nur referenzielle Produktlisten-/Shoplink-Follow-ups
|
||||
- keine neue Intent-Erkennung
|
||||
- keine Aenderung an Retrieval, Ranking, Scoring oder Shop-Matching
|
||||
- keine harte Produktliste im Core
|
||||
- keine Sonderlogik fuer medizinische Geraete
|
||||
- p84 LAB-CL-Kuerzel, p85b SIO2-Anker und Accessory-/Indicator-Flows bleiben unberuehrt
|
||||
|
||||
## Geaenderte Dateien
|
||||
|
||||
- `src/Agent/AgentRunner.php`
|
||||
- `patch_history/RETRIEX_PATCH_86H_MULTI_PRODUCT_FOLLOWUP_SPLIT_LOOKUP_README.md`
|
||||
|
||||
## Lokale Checks
|
||||
|
||||
```text
|
||||
php -l src/Agent/AgentRunner.php
|
||||
find src -name '*.php' -print0 | xargs -0 -n1 php -l
|
||||
YAML parse OK
|
||||
vendor missing - console checks skipped
|
||||
```
|
||||
|
||||
Console-Checks muessen in einer Umgebung mit `vendor/` ausgefuehrt werden:
|
||||
|
||||
```text
|
||||
php bin/console mto:agent:config:validate
|
||||
php bin/console mto:agent:regression:test
|
||||
php bin/console mto:agent:config:audit-source --details
|
||||
php bin/console mto:agent:config:audit-patterns --details
|
||||
```
|
||||
@@ -0,0 +1,68 @@
|
||||
# RetrieX Patch p86j - Multi Product Split Query Meta Clarity
|
||||
|
||||
## Ziel
|
||||
|
||||
Referenzielle Produktlisten-Follow-ups wie:
|
||||
|
||||
```text
|
||||
gebe mir links zu den produkten aus dem shop
|
||||
```
|
||||
|
||||
koennen seit p86i mehrere Produktanker als getrennte Shopware-Suchen ausfuehren. Die UI zeigte diese Einzelqueries jedoch weiterhin als zusammengefuehrte Semikolon-Zeile unter `Gesendete Suchquery`, z. B.:
|
||||
|
||||
```text
|
||||
testomat 2000 self clean; testomat 2000 cal; testomat 808
|
||||
```
|
||||
|
||||
Das war missverstaendlich, weil die Shopware-API keine Pipe-/Semikolon-Syntax als einzelne Query versteht.
|
||||
|
||||
## Aenderung
|
||||
|
||||
- Split-Produktlisten-Follow-ups werden in der Shop-Meta-Card nun als `Gesendete Einzelqueries` dargestellt.
|
||||
- Jede Einzelquery wird separat gerendert, statt zu einer Semikolon- oder Pipe-Query zusammengefuehrt zu werden.
|
||||
- Die technische Ausfuehrung aus p86i bleibt erhalten: `searchProductListFollowUpSplitLookupQueries()` fuehrt weiterhin einzelne, begrenzte und sequenzielle `searchShop()`-Aufrufe pro Produktanker aus.
|
||||
- Die bestehende semikolonbasierte Display-Formatierung wurde entfernt, damit sie nicht versehentlich wieder als Shopware-Query interpretiert wird.
|
||||
- Die Commerce-Search-Logs enthalten nun zusaetzlich `individualShopQueries`, wenn Split-Lookups vorbereitet wurden.
|
||||
- Der einzelne Referenzanker-Guard wird bei bereits identitaetsgefilterten Split-Lookup-Ergebnissen uebersprungen, damit ein Treffer zu `Testomat 2000 self clean` nicht spaeter `Testomat 2000 CAL` oder `Testomat 808` aus der zusammengefuehrten Anzeige-Query herausfiltert.
|
||||
|
||||
## Bewusst nicht geaendert
|
||||
|
||||
- Keine Async-/Parallelisierung. Der Store-API-Pfad ist synchron; Async waere ein separater, groesserer Service-Umbau.
|
||||
- Keine Aenderung an Intent-Erkennung, Retrieval, Scoring, Ranking oder Shop-Matching.
|
||||
- Keine neue Produkt-/Marken-Sonderlogik.
|
||||
- Keine Veraenderung normaler Einzel-Shopqueries.
|
||||
|
||||
## Erwartung
|
||||
|
||||
Vorher:
|
||||
|
||||
```text
|
||||
Gesendete Suchquery
|
||||
testomat 2000 self clean; testomat 2000 cal; testomat 808
|
||||
```
|
||||
|
||||
Nachher:
|
||||
|
||||
```text
|
||||
Gesendete Einzelqueries
|
||||
testomat 2000 self clean
|
||||
testomat 2000 cal
|
||||
testomat 808
|
||||
```
|
||||
|
||||
## Geaenderte Dateien
|
||||
|
||||
- `src/Agent/AgentRunner.php`
|
||||
- `config/retriex/chat-messages.yaml`
|
||||
- `src/Config/ChatMessagesConfig.php`
|
||||
- `public/assets/styles/base.css`
|
||||
|
||||
## Lokale Checks
|
||||
|
||||
```text
|
||||
find src -name '*.php' -print0 | xargs -0 -n1 php -l
|
||||
python yaml parse for config/retriex/*.yaml
|
||||
static check: no semicolon display formatter remains
|
||||
```
|
||||
|
||||
Alle lokalen Checks waren gruen. Symfony-Console-Checks muessen in der Zielumgebung mit `vendor/` ausgefuehrt werden.
|
||||
@@ -0,0 +1,77 @@
|
||||
# RetrieX Patch p86k - YAML-backed Product Anchor Canonicalization
|
||||
|
||||
## Zweck
|
||||
|
||||
p86j hat die Multi-Product-Link-Follow-up-Logik verbessert, aber der Core-Pattern-Audit meldete danach einen Warnfund in `src/Agent/AgentRunner.php`:
|
||||
|
||||
```text
|
||||
preg_match('/\btestomat(?:®)?\b.*$/iu', $anchor, $match)
|
||||
```
|
||||
|
||||
p86k entfernt dieses domain-sensitive Pattern aus dem PHP-Core und verlagert die fachliche Start-/Familien-Erkennung in `config/retriex/genre.yaml`.
|
||||
|
||||
## Änderung
|
||||
|
||||
- `AgentRunner::canonicalizeProductListAnchor()` nutzt keine hart codierte Produktfamilie mehr.
|
||||
- Neuer YAML-backed Trim-Schritt `trimProductListAnchorToConfiguredStart()`:
|
||||
- liest `context_resolution.product_list_followup.canonical_start_patterns`
|
||||
- akzeptiert Named Group `anchor`, Fallback auf Gruppe 1 oder Full Match
|
||||
- Produktfamilien-Erkennung liest nun aus:
|
||||
- `context_resolution.product_list_followup.canonical_family_terms`
|
||||
- `AgentRunnerConfig` stellt Accessor-Methoden bereit.
|
||||
- `RetriexEffectiveConfigProvider` validiert die neuen YAML-Werte.
|
||||
|
||||
## Keine fachliche Änderung
|
||||
|
||||
Der Patch ändert nicht:
|
||||
|
||||
- Intent-Erkennung
|
||||
- Retrieval
|
||||
- Scoring
|
||||
- Ranking
|
||||
- Shop-Matching
|
||||
- Split-Request-Logik aus p86i/p86j
|
||||
- LAB-CL-Kürzelschutz aus p84
|
||||
- SiO2-Geräteanker aus p85b
|
||||
|
||||
## Erwartung
|
||||
|
||||
Der bisherige Effekt bleibt erhalten:
|
||||
|
||||
```text
|
||||
Systembeschreibung Der Testomat® 2000 CAL
|
||||
=> testomat 2000 cal
|
||||
```
|
||||
|
||||
Die dafür nötige Produktfamilienlogik liegt nun in YAML statt im PHP-Core.
|
||||
|
||||
## Lokale Checks
|
||||
|
||||
Ausgeführt im Patch-Arbeitsverzeichnis:
|
||||
|
||||
```bash
|
||||
find src -name '*.php' -print0 | xargs -0 -n1 php -l
|
||||
python3 - <<'PY'
|
||||
from pathlib import Path
|
||||
import yaml
|
||||
for path in Path('config/retriex').glob('*.yaml'):
|
||||
yaml.safe_load(path.read_text(encoding='utf-8'))
|
||||
print('YAML parse OK')
|
||||
PY
|
||||
grep -RIn "preg_match.*testomat\|testomat.*preg_match" src/Agent/AgentRunner.php
|
||||
```
|
||||
|
||||
Ergebnis:
|
||||
|
||||
- PHP lint OK
|
||||
- YAML parse OK
|
||||
- kein `preg_match` mit `testomat` in `AgentRunner.php`
|
||||
|
||||
## Noch in Zielumgebung ausführen
|
||||
|
||||
```bash
|
||||
php bin/console mto:agent:config:validate
|
||||
php bin/console mto:agent:regression:test
|
||||
php bin/console mto:agent:config:audit-source --details
|
||||
php bin/console mto:agent:config:audit-patterns --details
|
||||
```
|
||||
@@ -0,0 +1,77 @@
|
||||
# RetrieX Patch p86i - Multi Product Split Shopware Requests
|
||||
|
||||
## Ziel
|
||||
|
||||
Referenzielle Produktlisten-Follow-ups wie
|
||||
|
||||
```text
|
||||
gebe mir links zu den produkten aus dem shop
|
||||
```
|
||||
|
||||
sollen bei mehreren Produktankern keine kombinierte Pseudo-Query mehr an Shopware senden.
|
||||
|
||||
Vorher konnte aus dem Verlauf eine zusammengeführte Query entstehen, z. B.:
|
||||
|
||||
```text
|
||||
testomat 2000 cal 808
|
||||
```
|
||||
|
||||
oder als Anzeige/Repair-Query eine Pipe-Liste:
|
||||
|
||||
```text
|
||||
testomat 2000 self clean | testomat 2000 cal | testomat 808
|
||||
```
|
||||
|
||||
Diese Pipe-/Kombi-Query ist für die Shopware-API keine gültige Einzelproduktsuche.
|
||||
|
||||
## Änderung
|
||||
|
||||
p86i führt einen engen Split-Lookup-Pfad nur für referenzielle Produktlisten-Follow-ups ein:
|
||||
|
||||
1. Produktanker werden aus Verlauf/RAG wie bisher generisch extrahiert.
|
||||
2. Wenn mindestens zwei Produktanker vorhanden sind, wird keine kombinierte Produktlisten-Query an Shopware gesendet.
|
||||
3. Stattdessen werden echte separate Shopware-Suchen ausgeführt, z. B.:
|
||||
|
||||
```text
|
||||
testomat 2000 self clean
|
||||
testomat 2000 cal
|
||||
testomat 808
|
||||
```
|
||||
|
||||
4. Ergebnisse werden per Produktidentität gefiltert und dedupliziert zusammengeführt.
|
||||
5. Die Query-Anzeige nutzt Semikolon-Trennung als reine Anzeige der Einzelabfragen, keine Pipe-Syntax.
|
||||
|
||||
## Scope / Guardrails
|
||||
|
||||
Der Patch ist bewusst eng begrenzt:
|
||||
|
||||
- nur für `isReferentialProductListShopFollowUpPrompt()`
|
||||
- nur wenn mindestens zwei Produktanker gefunden wurden
|
||||
- keine Änderung für normale Einzel-Shopqueries
|
||||
- keine Änderung an Intent-Erkennung, RAG-Retrieval, Ranking, Scoring oder Shop-Matching
|
||||
- keine feste Produktliste im Core
|
||||
- keine Sonderlogik für medizinische Geräte
|
||||
- kein pauschales `gerät => testomat`
|
||||
- bestehende Identity-Filterung aus p86g/p86h bleibt aktiv
|
||||
|
||||
## Async-Bewertung
|
||||
|
||||
Die getrennten Lookups werden bewusst sequenziell und durch `max_anchors` begrenzt ausgeführt.
|
||||
Der vorhandene `ShopSearchService::search()` / `StoreApiClient`-Pfad ist synchron aufgebaut. Eine echte parallele Store-API-Ausführung würde einen breiteren Service-/HTTP-Client-Umbau erfordern und wurde bewusst nicht in diesen kleinen Hotfix aufgenommen, um keine unrelated Shop-Flows zu riskieren.
|
||||
|
||||
## Lokale Checks
|
||||
|
||||
```text
|
||||
php -l src/Agent/AgentRunner.php
|
||||
find src -name '*.php' -print0 | xargs -0 -n1 php -l
|
||||
YAML parse OK
|
||||
```
|
||||
|
||||
Symfony-Console-Checks müssen in der Zielumgebung mit `vendor/` ausgeführt werden:
|
||||
|
||||
```text
|
||||
php bin/console mto:agent:config:validate
|
||||
php bin/console mto:agent:regression:test
|
||||
php bin/console mto:agent:config:audit-source --details
|
||||
php bin/console mto:agent:config:audit-patterns --details
|
||||
```
|
||||
Reference in New Issue
Block a user