p24
This commit is contained in:
@@ -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.
|
||||||
@@ -207,6 +207,7 @@ parameters:
|
|||||||
debug_internal_error_prefix: '❌ Interner Fehler: '
|
debug_internal_error_prefix: '❌ Interner Fehler: '
|
||||||
|
|
||||||
rag_evidence_guard:
|
rag_evidence_guard:
|
||||||
|
cleanup_profile: rag_evidence
|
||||||
stop_terms:
|
stop_terms:
|
||||||
- suche
|
- suche
|
||||||
- suchen
|
- suchen
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ use App\Commerce\Dto\ShopProductResult;
|
|||||||
use App\Commerce\SearchRepairService;
|
use App\Commerce\SearchRepairService;
|
||||||
use App\Commerce\ShopSearchService;
|
use App\Commerce\ShopSearchService;
|
||||||
use App\Config\AgentRunnerConfig;
|
use App\Config\AgentRunnerConfig;
|
||||||
|
use App\Config\LanguageCleanupConfig;
|
||||||
use App\Context\ContextService;
|
use App\Context\ContextService;
|
||||||
use App\Context\UrlAnalyzer;
|
use App\Context\UrlAnalyzer;
|
||||||
use App\Infrastructure\OllamaClient;
|
use App\Infrastructure\OllamaClient;
|
||||||
@@ -33,6 +34,7 @@ final readonly class AgentRunner
|
|||||||
private OllamaClient $ollamaClient,
|
private OllamaClient $ollamaClient,
|
||||||
private LoggerInterface $agentLogger,
|
private LoggerInterface $agentLogger,
|
||||||
private AgentRunnerConfig $agentRunnerConfig,
|
private AgentRunnerConfig $agentRunnerConfig,
|
||||||
|
private LanguageCleanupConfig $languageCleanupConfig,
|
||||||
private bool $debug,
|
private bool $debug,
|
||||||
private bool $logPrompt,
|
private bool $logPrompt,
|
||||||
private bool $logContext,
|
private bool $logContext,
|
||||||
@@ -2710,7 +2712,7 @@ final readonly class AgentRunner
|
|||||||
$normalizedPrompt = $this->normalizeRagEvidenceText($prompt);
|
$normalizedPrompt = $this->normalizeRagEvidenceText($prompt);
|
||||||
$stopTerms = [];
|
$stopTerms = [];
|
||||||
|
|
||||||
foreach ($this->agentRunnerConfig->getRagEvidenceStopTerms() as $term) {
|
foreach ($this->getRagEvidenceCleanupStopTerms() as $term) {
|
||||||
$term = $this->normalizeRagEvidenceText($term);
|
$term = $this->normalizeRagEvidenceText($term);
|
||||||
if ($term !== '') {
|
if ($term !== '') {
|
||||||
$stopTerms[$term] = true;
|
$stopTerms[$term] = true;
|
||||||
@@ -2743,6 +2745,35 @@ final readonly class AgentRunner
|
|||||||
return $groups;
|
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<string, string[]>
|
* @return array<string, string[]>
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -503,6 +503,11 @@ final class AgentRunnerConfig
|
|||||||
return $this->getRequiredInt('no_llm_fallback.max_shop_results');
|
return $this->getRequiredInt('no_llm_fallback.max_shop_results');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getRagEvidenceCleanupProfile(): string
|
||||||
|
{
|
||||||
|
return $this->getRequiredString('rag_evidence_guard.cleanup_profile');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string[]
|
* @return string[]
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -496,6 +496,7 @@ final readonly class RetriexEffectiveConfigProvider
|
|||||||
'debug_internal_error_prefix' => $this->agentRunnerConfig->getDebugInternalErrorPrefix(),
|
'debug_internal_error_prefix' => $this->agentRunnerConfig->getDebugInternalErrorPrefix(),
|
||||||
],
|
],
|
||||||
'rag_evidence_guard' => [
|
'rag_evidence_guard' => [
|
||||||
|
'cleanup_profile' => $this->agentRunnerConfig->getRagEvidenceCleanupProfile(),
|
||||||
'stop_terms' => $this->agentRunnerConfig->getRagEvidenceStopTerms(),
|
'stop_terms' => $this->agentRunnerConfig->getRagEvidenceStopTerms(),
|
||||||
'synonyms' => $this->agentRunnerConfig->getRagEvidenceSynonyms(),
|
'synonyms' => $this->agentRunnerConfig->getRagEvidenceSynonyms(),
|
||||||
'aggregate_query_patterns' => $this->agentRunnerConfig->getRagEvidenceAggregateQueryPatterns(),
|
'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'] : [];
|
$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->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->validateStringListMap($ragEvidence['synonyms'] ?? [], 'agent.rag_evidence_guard.synonyms', $errors, $warnings);
|
||||||
$this->validateRegexPatternList($ragEvidence['aggregate_query_patterns'] ?? [], 'agent.rag_evidence_guard.aggregate_query_patterns', $errors);
|
$this->validateRegexPatternList($ragEvidence['aggregate_query_patterns'] ?? [], 'agent.rag_evidence_guard.aggregate_query_patterns', $errors);
|
||||||
|
|||||||
Reference in New Issue
Block a user