mindnet/docs/AUDIT_LLM_PROFILE_INTEGRATION.md

4.2 KiB

Audit: LLM-Profilsteuerung Integration (WP-25a)

Datum: 2025-01-XX
Version: WP-25a
Status: Abgeschlossen mit Verbesserungen

Zusammenfassung

Dieses Audit prüft die Vollständigkeit der neuen LLM-Profilsteuerung (MoE - Mixture of Experts) und identifiziert alle Stellen, die die zentrale Steuerung umgehen könnten.

Gefundene Probleme & Lösungen

Problem 1: Fehlendes profile_name im Fallback-Code

Datei: app/core/retrieval/decision_engine.py (Zeile 253-255)
Problem: Der Fallback-Aufruf in _generate_final_answer nutzte kein profile_name, wodurch die Profilsteuerung umgangen wurde.
Lösung: Behoben - Nutzt nun profile_name=profile für Konsistenz.

⚠️ Problem 2: Ungenutztes Profil ingest_extractor

Datei: config/llm_profiles.yaml
Problem: Das Profil ingest_extractor ist definiert, wird aber nirgendwo im Code verwendet.
Status: ⚠️ Offene Lücke - Profil ist für zukünftige Extraktions-Aufgaben vorgesehen, aktuell nicht benötigt.

Problem 3: Externes Script umgeht Steuerung

Datei: scripts/ollama_tool_runner.py
Problem: Script macht direkte Ollama-Aufrufe ohne LLMService.
Status: Akzeptabel - Dies ist ein externes Test-/Demo-Script, kein Teil der Hauptanwendung.

Vollständige Prüfung aller LLM-Aufrufe

Korrekt implementiert (nutzen Profilsteuerung):

  1. app/core/ingestion/ingestion_validation.py

    • Nutzt profile_name="ingest_validator" (Zeile 61-64)
    • Delegiert Fallback-Kaskade an LLMService
  2. app/core/retrieval/decision_engine.py

    • _determine_strategy(): Nutzt router_profile (Zeile 94-96)
    • _compress_stream_content(): Nutzt compression_profile (Zeile 169-174)
    • _generate_final_answer(): Nutzt llm_profile aus Strategie (Zeile 244-246)
    • BEHOBEN: Fallback nutzt nun auch profile_name (Zeile 253-256)
  3. app/routers/chat.py

    • Interview-Modus: Nutzt profile_name="compression_fast" (Zeile 204-207)
    • RAG-Modus: Delegiert an DecisionEngine (nutzt Strategie-Profile)
  4. app/services/embeddings_client.py

    • Nutzt embedding_expert Profil aus llm_profiles.yaml (Zeile 29-47)
    • Konsistente Modellsteuerung für Embeddings
  5. app/services/llm_service.py

    • Zentrale Implementierung der Profilsteuerung
    • Rekursive Fallback-Kaskade implementiert
    • Schutz gegen zirkuläre Referenzen (visited_profiles)

Keine LLM-Aufrufe (korrekt):

  1. app/routers/ingest.py

    • Nutzt nur IngestionService (der wiederum LLMService nutzt)
  2. app/services/discovery.py

    • Nutzt nur Retrieval, keine LLM-Aufrufe
  3. app/frontend/ui_api.py

    • Macht nur HTTP-Requests zu API-Endpunkten

Konfigurationsprüfung

config/llm_profiles.yaml

  • Alle benötigten Profile definiert:
    • synthesis_pro - Hauptsynthese
    • synthesis_backup - Backup-Synthese
    • tech_expert - Code/Technik
    • compression_fast - Kompression/Routing
    • ingest_validator - Validierung (YES/NO)
    • ingest_extractor - Extraktion (aktuell ungenutzt)
    • identity_safe - Lokaler Privacy-Anker
    • embedding_expert - Embeddings
  • Fallback-Kaskaden korrekt definiert
  • Temperaturen angemessen gesetzt

config/decision_engine.yaml

  • Nutzt router_profile für Intent-Erkennung
  • Strategien referenzieren llm_profile
  • Streams nutzen compression_profile

Empfehlungen

Sofort umsetzbar:

  1. BEHOBEN: Fallback in DecisionEngine nutzt nun Profilsteuerung

Zukünftige Verbesserungen:

  1. ingest_extractor Profil: Wenn Extraktions-Aufgaben hinzukommen, sollte dieses Profil genutzt werden
  2. Monitoring: Logging erweitern, um Profil-Nutzung zu tracken
  3. Dokumentation: Profil-Auswahl-Logik in Entwickler-Dokumentation aufnehmen

Fazit

Die LLM-Profilsteuerung ist vollständig integriert.
Alle kritischen LLM-Aufrufe nutzen die zentrale Steuerung.
Ein kleiner Bug wurde behoben (Fallback ohne Profil).
⚠️ Ein Profil (ingest_extractor) ist definiert, aber aktuell ungenutzt - dies ist akzeptabel für zukünftige Features.

Die Architektur ist robust und folgt dem MoE-Prinzip konsequent.