From c5e212f8f299792ef350af074744f690525e8fb8 Mon Sep 17 00:00:00 2001 From: team 1 Date: Sun, 3 May 2026 21:33:57 +0200 Subject: [PATCH] p24 --- ...ENT_RAG_EVIDENCE_CLEANUP_PROFILE_README.md | 14 ++++++++ config/retriex/agent.yaml | 1 + src/Agent/AgentRunner.php | 33 ++++++++++++++++++- src/Config/AgentRunnerConfig.php | 5 +++ src/Config/RetriexEffectiveConfigProvider.php | 8 +++++ 5 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 RETRIEX_PATCH_24_AGENT_RAG_EVIDENCE_CLEANUP_PROFILE_README.md diff --git a/RETRIEX_PATCH_24_AGENT_RAG_EVIDENCE_CLEANUP_PROFILE_README.md b/RETRIEX_PATCH_24_AGENT_RAG_EVIDENCE_CLEANUP_PROFILE_README.md new file mode 100644 index 0000000..691d215 --- /dev/null +++ b/RETRIEX_PATCH_24_AGENT_RAG_EVIDENCE_CLEANUP_PROFILE_README.md @@ -0,0 +1,14 @@ +# RetrieX Patch p24 - Agent RAG Evidence Cleanup Profile + +## Goal +Wire the Agent RAG evidence guard to the central `rag_evidence` cleanup profile from `language.yaml`. + +## Scope +- Adds `rag_evidence_guard.cleanup_profile: rag_evidence` to `config/retriex/agent.yaml`. +- Merges profile stopwords with existing legacy `rag_evidence_guard.stop_terms` at runtime. +- Keeps all legacy stop terms in place. +- Adds config validation for the referenced cleanup profile. + +## Safety +No legacy lists are removed in this patch. +No Commerce, Shop fallback, Retrieval scoring, or Prompt logic is changed. diff --git a/config/retriex/agent.yaml b/config/retriex/agent.yaml index aa8c776..56c4ac3 100644 --- a/config/retriex/agent.yaml +++ b/config/retriex/agent.yaml @@ -207,6 +207,7 @@ parameters: debug_internal_error_prefix: '❌ Interner Fehler: ' rag_evidence_guard: + cleanup_profile: rag_evidence stop_terms: - suche - suchen diff --git a/src/Agent/AgentRunner.php b/src/Agent/AgentRunner.php index 2a07b8c..b99b22a 100644 --- a/src/Agent/AgentRunner.php +++ b/src/Agent/AgentRunner.php @@ -8,6 +8,7 @@ use App\Commerce\Dto\ShopProductResult; use App\Commerce\SearchRepairService; use App\Commerce\ShopSearchService; use App\Config\AgentRunnerConfig; +use App\Config\LanguageCleanupConfig; use App\Context\ContextService; use App\Context\UrlAnalyzer; use App\Infrastructure\OllamaClient; @@ -33,6 +34,7 @@ final readonly class AgentRunner private OllamaClient $ollamaClient, private LoggerInterface $agentLogger, private AgentRunnerConfig $agentRunnerConfig, + private LanguageCleanupConfig $languageCleanupConfig, private bool $debug, private bool $logPrompt, private bool $logContext, @@ -2710,7 +2712,7 @@ final readonly class AgentRunner $normalizedPrompt = $this->normalizeRagEvidenceText($prompt); $stopTerms = []; - foreach ($this->agentRunnerConfig->getRagEvidenceStopTerms() as $term) { + foreach ($this->getRagEvidenceCleanupStopTerms() as $term) { $term = $this->normalizeRagEvidenceText($term); if ($term !== '') { $stopTerms[$term] = true; @@ -2743,6 +2745,35 @@ final readonly class AgentRunner return $groups; } + /** @return string[] */ + private function getRagEvidenceCleanupStopTerms(): array + { + return $this->mergeUniqueStrings( + $this->languageCleanupConfig->getStopWordsForProfile($this->agentRunnerConfig->getRagEvidenceCleanupProfile()), + $this->agentRunnerConfig->getRagEvidenceStopTerms() + ); + } + + /** + * @param string[] $left + * @param string[] $right + * @return string[] + */ + private function mergeUniqueStrings(array $left, array $right): array + { + $out = []; + foreach (array_merge($left, $right) as $item) { + $item = trim((string) $item); + if ($item === '' || isset($out[$item])) { + continue; + } + + $out[$item] = $item; + } + + return array_values($out); + } + /** * @return array */ diff --git a/src/Config/AgentRunnerConfig.php b/src/Config/AgentRunnerConfig.php index 0f68b01..084e722 100644 --- a/src/Config/AgentRunnerConfig.php +++ b/src/Config/AgentRunnerConfig.php @@ -503,6 +503,11 @@ final class AgentRunnerConfig return $this->getRequiredInt('no_llm_fallback.max_shop_results'); } + public function getRagEvidenceCleanupProfile(): string + { + return $this->getRequiredString('rag_evidence_guard.cleanup_profile'); + } + /** * @return string[] */ diff --git a/src/Config/RetriexEffectiveConfigProvider.php b/src/Config/RetriexEffectiveConfigProvider.php index 5adc1dc..2641323 100644 --- a/src/Config/RetriexEffectiveConfigProvider.php +++ b/src/Config/RetriexEffectiveConfigProvider.php @@ -496,6 +496,7 @@ final readonly class RetriexEffectiveConfigProvider 'debug_internal_error_prefix' => $this->agentRunnerConfig->getDebugInternalErrorPrefix(), ], 'rag_evidence_guard' => [ + 'cleanup_profile' => $this->agentRunnerConfig->getRagEvidenceCleanupProfile(), 'stop_terms' => $this->agentRunnerConfig->getRagEvidenceStopTerms(), 'synonyms' => $this->agentRunnerConfig->getRagEvidenceSynonyms(), 'aggregate_query_patterns' => $this->agentRunnerConfig->getRagEvidenceAggregateQueryPatterns(), @@ -1076,6 +1077,13 @@ final readonly class RetriexEffectiveConfigProvider } $ragEvidence = is_array($agent['rag_evidence_guard'] ?? null) ? $agent['rag_evidence_guard'] : []; + $ragEvidenceCleanupProfile = $ragEvidence['cleanup_profile'] ?? null; + if (!is_string($ragEvidenceCleanupProfile) || trim($ragEvidenceCleanupProfile) === '') { + $errors[] = 'agent.rag_evidence_guard.cleanup_profile must be a non-empty string.'; + } elseif (!in_array($ragEvidenceCleanupProfile, $this->languageCleanupConfig->getCleanupProfileNames(), true)) { + $errors[] = 'agent.rag_evidence_guard.cleanup_profile references unknown language cleanup profile: ' . $ragEvidenceCleanupProfile . '.'; + } + $this->validateStringList($this->toList($ragEvidence['stop_terms'] ?? []), 'agent.rag_evidence_guard.stop_terms', $errors, $warnings); $this->validateStringListMap($ragEvidence['synonyms'] ?? [], 'agent.rag_evidence_guard.synonyms', $errors, $warnings); $this->validateRegexPatternList($ragEvidence['aggregate_query_patterns'] ?? [], 'agent.rag_evidence_guard.aggregate_query_patterns', $errors);