Update Decision Engine for WP-25: Bump version to 1.0.2, enhance robustness by pre-initializing stream variables to prevent KeyErrors, and fix template mismatches in strategy definitions. Ensure compatibility with updated YAML configuration for multi-stream retrieval strategies.

This commit is contained in:
Lars 2026-01-01 08:51:33 +01:00
parent bb6959a090
commit ed3f3e5588
2 changed files with 28 additions and 31 deletions

View File

@ -3,11 +3,12 @@ FILE: app/core/retrieval/decision_engine.py
DESCRIPTION: Der Agentic Orchestrator für WP-25. DESCRIPTION: Der Agentic Orchestrator für WP-25.
Realisiert Multi-Stream Retrieval, Intent-basiertes Routing Realisiert Multi-Stream Retrieval, Intent-basiertes Routing
und parallele Wissens-Synthese. und parallele Wissens-Synthese.
VERSION: 1.0.1 VERSION: 1.0.2
STATUS: Active STATUS: Active
FIX: FIX:
- Behebung eines potenziellen KeyError bei fehlender 'FACT_WHAT' Strategie (Fallback-Resilienz). - WP-25 ROBUSTNESS: Pre-Initialization aller Stream-Variablen zur Vermeidung von KeyErrors.
- Einführung einer mehrstufigen Sicherheitskaskade für die Strategiewahl. - Behebung von Template-Mismatches bei unvollständigen Strategie-Definitionen.
- Erhalt der Sicherheitskaskade für die Strategiewahl.
""" """
import asyncio import asyncio
import logging import logging
@ -167,12 +168,20 @@ class DecisionEngine:
template = self.llm_service.get_prompt(template_key, provider=provider) template = self.llm_service.get_prompt(template_key, provider=provider)
system_prompt = self.llm_service.get_prompt("system_prompt", provider=provider) system_prompt = self.llm_service.get_prompt("system_prompt", provider=provider)
template_vars = {**stream_results, "query": query} # WP-25 ROBUSTNESS FIX:
# Wir stellen sicher, dass alle Variablen, die im Template vorkommen könnten,
# zumindest mit einem leeren String initialisiert sind.
all_possible_streams = ["values_stream", "facts_stream", "biography_stream", "risk_stream", "tech_stream"]
template_vars = {s: "" for s in all_possible_streams}
# Überschreiben mit tatsächlichen Ergebnissen
template_vars.update(stream_results)
template_vars["query"] = query
prepend = strategy.get("prepend_instruction", "") prepend = strategy.get("prepend_instruction", "")
try: try:
# Sicherheitscheck: Sind alle benötigten Platzhalter im Template vorhanden? # Sicherheitscheck: Sind alle benötigten Platzhalter im Template vorhanden?
# Im Fehlerfall Fallback auf eine einfache Zusammenführung
final_prompt = template.format(**template_vars) final_prompt = template.format(**template_vars)
if prepend: if prepend:
final_prompt = f"{prepend}\n\n{final_prompt}" final_prompt = f"{prepend}\n\n{final_prompt}"
@ -197,7 +206,7 @@ class DecisionEngine:
except KeyError as e: except KeyError as e:
logger.error(f"Template Variable mismatch in '{template_key}': Missing {e}") logger.error(f"Template Variable mismatch in '{template_key}': Missing {e}")
# Fallback: Einfaches Aneinanderreihen der gefundenen Stream-Inhalte # Fallback: Einfaches Aneinanderreihen der gefundenen Stream-Inhalte
fallback_context = "\n\n".join(stream_results.values()) fallback_context = "\n\n".join([v for v in stream_results.values() if v])
return await self.llm_service.generate_raw_response( return await self.llm_service.generate_raw_response(
f"Beantworte: {query}\n\nKontext:\n{fallback_context}", f"Beantworte: {query}\n\nKontext:\n{fallback_context}",
system=system_prompt, system=system_prompt,

View File

@ -1,67 +1,53 @@
# config/decision_engine.yaml # config/decision_engine.yaml
# VERSION: 3.1.2 (WP-25: Multi-Stream Agentic RAG) # VERSION: 3.1.3 (WP-25: Multi-Stream Sync Fix)
# STATUS: Active # STATUS: Active
# DoD: Strikte Trennung von Logik und Instruktion. Prompt in prompts.yaml verschoben. # DoD: Harmonisierung der Streams mit prompts.yaml zur Vermeidung von KeyErrors.
version: 3.1 version: 3.1
settings: settings:
llm_fallback_enabled: true llm_fallback_enabled: true
router_provider: "auto" router_provider: "auto"
# Der Prompt-Key für den Router in prompts.yaml
router_prompt_key: "intent_router_v1" router_prompt_key: "intent_router_v1"
# --- EBENE 1: STREAM-LIBRARY (Bausteine) --- # --- EBENE 1: STREAM-LIBRARY ---
streams_library: streams_library:
values_stream: values_stream:
name: "Identität & Ethik" name: "Identität & Ethik"
query_template: "Welche meiner Werte und Prinzipien betreffen: {query}" query_template: "Welche meiner Werte und Prinzipien betreffen: {query}"
filter_types: ["value", "principle", "belief"] filter_types: ["value", "principle", "belief"]
top_k: 5 top_k: 5
edge_boosts: edge_boosts: {guides: 3.0, enforced_by: 2.5, based_on: 2.0}
guides: 3.0
enforced_by: 2.5
based_on: 2.0
facts_stream: facts_stream:
name: "Operative Realität" name: "Operative Realität"
query_template: "Status, Ressourcen und Fakten zu: {query}" query_template: "Status, Ressourcen und Fakten zu: {query}"
filter_types: ["project", "decision", "resource", "task", "milestone"] filter_types: ["project", "decision", "resource", "task", "milestone"]
top_k: 5 top_k: 5
edge_boosts: edge_boosts: {part_of: 2.0, depends_on: 1.5, implemented_in: 1.5}
part_of: 2.0
depends_on: 1.5
implemented_in: 1.5
biography_stream: biography_stream:
name: "Persönliche Erfahrung" name: "Persönliche Erfahrung"
query_template: "Welche Erlebnisse habe ich im Kontext von {query} gemacht?" query_template: "Welche Erlebnisse habe ich im Kontext von {query} gemacht?"
filter_types: ["experience", "journal"] filter_types: ["experience", "journal"]
top_k: 3 top_k: 3
edge_boosts: edge_boosts: {related_to: 1.5, experienced_in: 2.0}
related_to: 1.5
experienced_in: 2.0
risk_stream: risk_stream:
name: "Risiko-Radar" name: "Risiko-Radar"
query_template: "Gefahren, Hindernisse oder Risiken bei: {query}" query_template: "Gefahren, Hindernisse oder Risiken bei: {query}"
filter_types: ["risk", "obstacle"] filter_types: ["risk", "obstacle"]
top_k: 3 top_k: 3
edge_boosts: edge_boosts: {blocks: 2.5, impacts: 2.0, risk_of: 2.5}
blocks: 2.5
impacts: 2.0
risk_of: 2.5
tech_stream: tech_stream:
name: "Technische Referenz" name: "Technische Referenz"
query_template: "Technische Dokumentation und Code-Beispiele für: {query}" query_template: "Technische Dokumentation und Code-Beispiele für: {query}"
filter_types: ["snippet", "reference", "source"] filter_types: ["snippet", "reference", "source"]
top_k: 5 top_k: 5
edge_boosts: edge_boosts: {uses: 2.5, implemented_in: 3.0}
uses: 2.5
implemented_in: 3.0
# --- EBENE 2: STRATEGIEN (Orchestrierung) --- # --- EBENE 2: STRATEGIEN ---
strategies: strategies:
FACT_WHEN: FACT_WHEN:
description: "Abfrage von Zeitpunkten und Historie." description: "Abfrage von Zeitpunkten und Historie."
@ -69,6 +55,7 @@ strategies:
use_streams: use_streams:
- "facts_stream" - "facts_stream"
- "biography_stream" - "biography_stream"
- "tech_stream" # Hinzugefügt für Kompatibilität mit fact_synthesis_v1
prompt_template: "fact_synthesis_v1" prompt_template: "fact_synthesis_v1"
FACT_WHAT: FACT_WHAT:
@ -76,11 +63,12 @@ strategies:
preferred_provider: "openrouter" preferred_provider: "openrouter"
use_streams: use_streams:
- "facts_stream" - "facts_stream"
- "biography_stream" # Hinzugefügt für Kompatibilität mit fact_synthesis_v1
- "tech_stream" - "tech_stream"
prompt_template: "fact_synthesis_v1" prompt_template: "fact_synthesis_v1"
DECISION: DECISION:
description: "Der User sucht Rat, Strategie oder Abwägung." description: "Rat, Strategie oder Abwägung."
preferred_provider: "gemini" preferred_provider: "gemini"
use_streams: use_streams:
- "values_stream" - "values_stream"
@ -95,7 +83,7 @@ strategies:
use_streams: use_streams:
- "biography_stream" - "biography_stream"
- "values_stream" - "values_stream"
prompt_template: "empathy_template" prompt_template: "empathy_template" # Erwartet nur {context_str} oder spezifische Felder
CODING: CODING:
description: "Technische Anfragen und Programmierung." description: "Technische Anfragen und Programmierung."