This commit is contained in:
team 1
2026-05-04 15:37:33 +02:00
parent c4bf41cd47
commit 16e3d0a0ae
8 changed files with 173 additions and 131 deletions

View File

@@ -211,13 +211,6 @@ parameters:
# Legacy/domain override list. Generic German stopwords are provided by # Legacy/domain override list. Generic German stopwords are provided by
# language cleanup profile `rag_evidence`. Keep RAG/product-role terms here. # language cleanup profile `rag_evidence`. Keep RAG/product-role terms here.
stop_terms: stop_terms:
- suche
- suchen
- finde
- finden
- zeige
- einen
- einem
- ohne - ohne
- messen - messen
- messung - messung
@@ -471,31 +464,8 @@ parameters:
- grenzwerte - grenzwerte
- grenzwerten - grenzwerten
- welche - welche
- welcher
- welches
- welchem
- welchen
- gut - gut
- geeignet - geeignet
- was
- wie
- wo
- kann
- koennen
- können
- konnte
- könnte
- ich
- mir
- wir
- man
- nutzen
- benutzen
- verwenden
- verwende
- nehmen
- zur
- zum
- messen - messen
- gemessen - gemessen
meta_only_terms: meta_only_terms:
@@ -507,21 +477,6 @@ parameters:
- kostet - kostet
- shopsuche - shopsuche
- shop-suche - shop-suche
- suche
- suchen
- such
- finde
- find
- zeige
- zeig
- im
- in
- nach
- danach
- damit
- dafür
- dafuer
- hierzu
language_preservation: language_preservation:
enabled: true enabled: true
language_markers: language_markers:

View File

@@ -25,7 +25,6 @@ parameters:
# language cleanup profile `commerce_query`. Keep only commerce-specific or # language cleanup profile `commerce_query`. Keep only commerce-specific or
# historically sensitive phrases here. # historically sensitive phrases here.
phrases_to_remove: phrases_to_remove:
- suche
- welches gerät - welches gerät
- welche gerät - welche gerät
- welches modell - welches modell
@@ -43,58 +42,22 @@ parameters:
- geeigent - geeigent
- verfügbarkeit - verfügbarkeit
- verfuegbarkeit - verfuegbarkeit
- empfiehl
- antwort
- kurze
- ich
# Legacy/domain override list. Generic German stopwords and conversation # Legacy/domain override list. Generic German stopwords and conversation
# filler terms are provided by language cleanup profile `commerce_query`. # filler terms are provided by language cleanup profile `commerce_query`.
filter_search_tokens: filter_search_tokens:
- zusätzlich
- stattdessen
- preiswerte - preiswerte
- lösung - lösung
- größer - größer
- würde
- welchem - welchem
- mein
- zeige
- zeig
- such
- suche
- finde
- find
- mir
- von
- im
- in
- welche - welche
- welcher - welcher
- welches - welches
- welchen - welchen
- zur
- geeignet - geeignet
- geeigent - geeigent
- verfügbarkeit - verfügbarkeit
- verfuegbarkeit - verfuegbarkeit
- prüfe
- pruefe
- sowie
- seine
- seinen
- seiner
- seinem
- seines
- siene
- sienen
- siener
- sienem
- sienes
- gebe
- gib
- nenne
- nenn
- preis - preis
- preise - preise
- preisen - preisen

View File

@@ -82,6 +82,7 @@ parameters:
- commerce_query - commerce_query
- rag_evidence - rag_evidence
- shop_context_fallback - shop_context_fallback
- retrieval_reference_cleanup
required_profile_terms: required_profile_terms:
commerce_query: commerce_query:
stopwords: stopwords:

View File

@@ -81,17 +81,37 @@ parameters:
- eine - eine
- einer - einer
- eines - eines
- einen
- einem
- und - und
- oder - oder
- aber
- sowie
- mit - mit
- für - für
- fuer - fuer
- von
- vom
- im
- in
- nach
- zur
- zum
- ist - ist
- sind - sind
- wird
- werden
- wurde
- kann - kann
- können - können
- koennen - koennen
- kannst
- könnte
- koennte
- würde
- wuerde
- würden
- wuerden
conversation: conversation:
- bitte - bitte
- mal - mal
@@ -105,6 +125,76 @@ parameters:
- also - also
- danke - danke
pronouns:
- ich
- mir
- mein
- meine
- meinen
- meiner
- meinem
- meines
- seine
- seinen
- seiner
- seinem
- seines
- siene
- sienen
- siener
- sienem
- sienes
user_instruction_terms:
- suche
- such
- suchen
- finde
- find
- finden
- zeige
- zeig
- gebe
- gib
- nenne
- nenn
- empfiehl
- prüfe
- pruefe
response_style:
- antwort
- kurze
- kurz
- zusätzlich
- zusaetzlich
- stattdessen
question_terms:
- welcher
- welches
- welchem
- welchen
- was
- wie
- wo
usage_terms:
- nutzen
- benutzen
- verwenden
- verwende
- nehmen
reference_fillers:
- danach
- damit
- dafür
- dafuer
- hierzu
phrase_groups: phrase_groups:
user_instruction: user_instruction:
- ich suche - ich suche
@@ -127,11 +217,29 @@ parameters:
- uebersicht - uebersicht
- auflistung - auflistung
retrieval_reference:
- vorherige
- vorheriger
- nutzerfrage
- aktuelle
- folgefrage
- frage
- antwort
- technische
- referenzanker
- referenzaufloesung
- referenzauflösung
- faktenquelle
cleanup_profiles: cleanup_profiles:
commerce_query: commerce_query:
stopword_groups: stopword_groups:
- de_core - de_core
- conversation - conversation
- pronouns
- user_instruction_terms
- response_style
phrase_groups: phrase_groups:
- user_instruction - user_instruction
protected_term_groups: protected_term_groups:
@@ -141,6 +249,18 @@ parameters:
stopword_groups: stopword_groups:
- de_core - de_core
- conversation - conversation
- user_instruction_terms
protected_term_groups:
- protected_terms
retrieval_reference_cleanup:
stopword_groups:
- de_core
- conversation
- question_terms
meta_term_groups:
- retrieval_reference
protected_term_groups: protected_term_groups:
- protected_terms - protected_terms
@@ -148,6 +268,12 @@ parameters:
stopword_groups: stopword_groups:
- de_core - de_core
- conversation - conversation
- pronouns
- user_instruction_terms
- question_terms
- usage_terms
- reference_fillers
- response_style
phrase_groups: phrase_groups:
- user_instruction - user_instruction
meta_term_groups: meta_term_groups:

View File

@@ -90,56 +90,10 @@ parameters:
- code - code
- wert - wert
- werte - werte
generic_exact_selection_cleanup_profile: retrieval_reference_cleanup
generic_exact_selection_tokens: generic_exact_selection_tokens:
- vorherige
- vorheriger
- nutzerfrage
- aktuelle
- folgefrage
- frage
- antwort
- technische
- referenzanker
- referenzaufloesung
- referenzauflösung
- faktenquelle
- keine - keine
- welche - welche
- welcher
- welches
- welchem
- welchen
- wird
- werden
- wurde
- kann
- koennen
- können
- mit
- der
- die
- das
- den
- dem
- ein
- eine
- einer
- eines
- ist
- sind
- was
- wie
- wo
- zum
- zur
- fuer
- für
- durch
- von
- vom
- und
- oder
- auch
generic_product_tokens: generic_product_tokens:
- produkt - produkt
- produkte - produkte

View File

@@ -196,6 +196,11 @@ final class NdjsonHybridRetrieverConfig
return $this->requiredStringList('exact_detail_tokens'); return $this->requiredStringList('exact_detail_tokens');
} }
public function genericExactSelectionCleanupProfile(): string
{
return $this->requiredString('generic_exact_selection_cleanup_profile');
}
/** @return string[] */ /** @return string[] */
public function genericExactSelectionTokens(): array public function genericExactSelectionTokens(): array
{ {
@@ -316,6 +321,7 @@ final class NdjsonHybridRetrieverConfig
'exact_selection_indicator_table_required_primary_terms' => $this->exactSelectionIndicatorTableRequiredPrimaryTerms(), 'exact_selection_indicator_table_required_primary_terms' => $this->exactSelectionIndicatorTableRequiredPrimaryTerms(),
'exact_selection_indicator_table_required_context_terms' => $this->exactSelectionIndicatorTableRequiredContextTerms(), 'exact_selection_indicator_table_required_context_terms' => $this->exactSelectionIndicatorTableRequiredContextTerms(),
'exact_detail_tokens' => $this->exactDetailTokens(), 'exact_detail_tokens' => $this->exactDetailTokens(),
'generic_exact_selection_cleanup_profile' => $this->genericExactSelectionCleanupProfile(),
'generic_exact_selection_tokens' => $this->genericExactSelectionTokens(), 'generic_exact_selection_tokens' => $this->genericExactSelectionTokens(),
'generic_product_tokens' => $this->genericProductTokens(), 'generic_product_tokens' => $this->genericProductTokens(),
'important_short_model_tokens' => $this->importantShortModelTokens(), 'important_short_model_tokens' => $this->importantShortModelTokens(),
@@ -369,6 +375,22 @@ final class NdjsonHybridRetrieverConfig
return $value; return $value;
} }
private function requiredString(string $key): string
{
$value = $this->requiredValue($key);
if (!is_scalar($value)) {
throw $this->invalid($key, 'must be a non-empty string');
}
$value = trim((string) $value);
if ($value === '') {
throw $this->invalid($key, 'must be a non-empty string');
}
return $value;
}
/** @return string[] */ /** @return string[] */
private function requiredStringList(string $key): array private function requiredStringList(string $key): array
{ {

View File

@@ -1059,6 +1059,13 @@ final readonly class RetriexEffectiveConfigProvider
$errors[] = 'retrieval.hard_max_chunks must be greater than 0.'; $errors[] = 'retrieval.hard_max_chunks must be greater than 0.';
} }
$cleanupProfile = $retrieval['generic_exact_selection_cleanup_profile'] ?? null;
if (!is_string($cleanupProfile) || trim($cleanupProfile) === '') {
$errors[] = 'retrieval.generic_exact_selection_cleanup_profile must be a non-empty string.';
} elseif (!in_array(trim($cleanupProfile), $this->languageCleanupConfig->getCleanupProfileNames(), true)) {
$errors[] = 'retrieval.generic_exact_selection_cleanup_profile references unknown language cleanup profile: ' . trim($cleanupProfile) . '.';
}
$this->validateStringListMap($retrieval['vocabulary'] ?? [], 'retrieval.vocabulary', $errors, $warnings); $this->validateStringListMap($retrieval['vocabulary'] ?? [], 'retrieval.vocabulary', $errors, $warnings);
$inventory = $retrieval['inventory_parameter'] ?? []; $inventory = $retrieval['inventory_parameter'] ?? [];

View File

@@ -5,6 +5,7 @@ declare(strict_types=1);
namespace App\Knowledge\Retrieval; namespace App\Knowledge\Retrieval;
use App\Catalog\EntityCatalogService; use App\Catalog\EntityCatalogService;
use App\Config\LanguageCleanupConfig;
use App\Config\NdjsonHybridRetrieverConfig; use App\Config\NdjsonHybridRetrieverConfig;
use App\Entity\ModelGenerationConfig; use App\Entity\ModelGenerationConfig;
use App\Intent\CatalogIntentLite; use App\Intent\CatalogIntentLite;
@@ -46,6 +47,7 @@ final readonly class NdjsonHybridRetriever implements RetrieverInterface
private EntityCatalogService $entityCatalogService, private EntityCatalogService $entityCatalogService,
private QueryEnricher $queryEnricher, private QueryEnricher $queryEnricher,
private NdjsonHybridRetrieverConfig $retrieverConfig, private NdjsonHybridRetrieverConfig $retrieverConfig,
private LanguageCleanupConfig $languageCleanupConfig,
) )
{ {
} }
@@ -942,7 +944,19 @@ final readonly class NdjsonHybridRetriever implements RetrieverInterface
private function isGenericExactSelectionToken(string $token): bool private function isGenericExactSelectionToken(string $token): bool
{ {
return in_array($token, $this->retrieverConfig->genericExactSelectionTokens(), true); return in_array($token, $this->genericExactSelectionCleanupTokens(), true);
}
/** @return string[] */
private function genericExactSelectionCleanupTokens(): array
{
$profileName = $this->retrieverConfig->genericExactSelectionCleanupProfile();
return array_values(array_unique(array_merge(
$this->languageCleanupConfig->getStopWordsForProfile($profileName),
$this->languageCleanupConfig->getMetaTermsForProfile($profileName),
$this->retrieverConfig->genericExactSelectionTokens()
)));
} }
/** /**