diff --git a/app/config.py b/app/config.py index f344387..d712a8b 100644 --- a/app/config.py +++ b/app/config.py @@ -21,7 +21,9 @@ class Settings: # --- Qdrant Datenbank --- QDRANT_URL: str = os.getenv("QDRANT_URL", "http://127.0.0.1:6333") QDRANT_API_KEY: str | None = os.getenv("QDRANT_API_KEY") - COLLECTION_PREFIX: str = os.getenv("MINDNET_PREFIX", "mindnet_dev") + # WP-24c v4.5.10: Harmonisierung - Unterstützt beide Umgebungsvariablen für Abwärtskompatibilität + # COLLECTION_PREFIX hat Priorität, MINDNET_PREFIX als Fallback + COLLECTION_PREFIX: str = os.getenv("COLLECTION_PREFIX") or os.getenv("MINDNET_PREFIX") or "mindnet_dev" # WP-22: Vektor-Dimension für das Embedding-Modell (nomic) VECTOR_SIZE: int = int(os.getenv("VECTOR_DIM", "768")) diff --git a/app/core/database/qdrant.py b/app/core/database/qdrant.py index d5ee7bd..3cbdfab 100644 --- a/app/core/database/qdrant.py +++ b/app/core/database/qdrant.py @@ -44,7 +44,9 @@ class QdrantConfig: port = os.getenv("QDRANT_PORT") port = int(port) if port else None api_key = os.getenv("QDRANT_API_KEY") or None - prefix = os.getenv("COLLECTION_PREFIX") or "mindnet" + # WP-24c v4.5.10: Harmonisierung - Unterstützt beide Umgebungsvariablen für Abwärtskompatibilität + # COLLECTION_PREFIX hat Priorität, MINDNET_PREFIX als Fallback + prefix = os.getenv("COLLECTION_PREFIX") or os.getenv("MINDNET_PREFIX") or "mindnet" dim = int(os.getenv("VECTOR_DIM") or 384) distance = os.getenv("DISTANCE", "Cosine") on_disk_payload = (os.getenv("ON_DISK_PAYLOAD", "true").lower() == "true") diff --git a/docs/03_Technical_References/RETRIEVAL_DEV_PROD_DIFF_ANALYSIS.md b/docs/03_Technical_References/RETRIEVAL_DEV_PROD_DIFF_ANALYSIS.md new file mode 100644 index 0000000..7b0821f --- /dev/null +++ b/docs/03_Technical_References/RETRIEVAL_DEV_PROD_DIFF_ANALYSIS.md @@ -0,0 +1,163 @@ +# Analyse: Retrieval-Unterschiede zwischen Dev und Prod + +**Datum**: 2026-01-12 +**Version**: v4.5.10 +**Status**: 🔴 Kritisch + +## Problemstellung + +Bei identischer Codebasis und identischen Daten liefert das Dev-System Suchergebnisse, während das Prod-System keine Ergebnisse findet. + +## Identifizierte Ursachen + +### 1. 🔴 **KRITISCH: Inkonsistente Collection-Präfix-Konfiguration** + +**Problem**: Zwei verschiedene Umgebungsvariablen werden für den Collection-Präfix verwendet: + +1. **`app/config.py` (Zeile 24)**: + ```python + COLLECTION_PREFIX: str = os.getenv("MINDNET_PREFIX", "mindnet_dev") + ``` + - Verwendet `MINDNET_PREFIX` als Umgebungsvariable + - Default: `"mindnet_dev"` + +2. **`app/core/database/qdrant.py` (Zeile 47)**: + ```python + prefix = os.getenv("COLLECTION_PREFIX") or "mindnet" + ``` + - Verwendet `COLLECTION_PREFIX` als Umgebungsvariable + - Default: `"mindnet"` + +**Auswirkung**: +- **Retriever verwendet `QdrantConfig.from_env()`**, das `COLLECTION_PREFIX` liest +- **Ingestion verwendet `Settings.COLLECTION_PREFIX`**, das `MINDNET_PREFIX` liest +- **Resultat**: Daten werden in verschiedene Collections geschrieben/gesucht: + - Dev: `mindnet_dev_chunks`, `mindnet_dev_notes`, `mindnet_dev_edges` + - Prod: `mindnet_chunks`, `mindnet_notes`, `mindnet_edges` + +### 2. ⚠️ **Mögliche weitere Ursachen** + +#### 2.1 Unterschiedliche Embedding-Modelle +- **Prüfen**: `MINDNET_EMBEDDING_MODEL` in Dev vs. Prod +- **Auswirkung**: Unterschiedliche Vektoren → unterschiedliche Similarity-Scores + +#### 2.2 Unterschiedliche Vektor-Dimensionen +- **Prüfen**: `VECTOR_DIM` in Dev vs. Prod +- **Auswirkung**: Dimension-Mismatch → Suche schlägt fehl + +#### 2.3 Unterschiedliche Qdrant-Instanzen +- **Prüfen**: `QDRANT_URL` / `QDRANT_HOST` in Dev vs. Prod +- **Auswirkung**: Daten liegen in verschiedenen Datenbanken + +#### 2.4 Unterschiedliche Score-Thresholds +- **Prüfen**: Filter-Logik oder Mindest-Scores +- **Auswirkung**: Ergebnisse werden gefiltert, bevor sie zurückgegeben werden + +## Diagnose-Checkliste + +### ✅ Sofort prüfen: + +1. **Collection-Präfix-Verifikation**: + ```bash + # Dev + echo $COLLECTION_PREFIX + echo $MINDNET_PREFIX + + # Prod + echo $COLLECTION_PREFIX + echo $MINDNET_PREFIX + ``` + +2. **Qdrant Collections prüfen**: + ```python + # In beiden Systemen ausführen + from app.core.database.qdrant import get_client, QdrantConfig + cfg = QdrantConfig.from_env() + client = get_client(cfg) + print(f"Prefix: {cfg.prefix}") + print(f"Collections: {client.get_collections().collections}") + ``` + +3. **Embedding-Modell prüfen**: + ```bash + # Dev + echo $MINDNET_EMBEDDING_MODEL + echo $VECTOR_DIM + + # Prod + echo $MINDNET_EMBEDDING_MODEL + echo $VECTOR_DIM + ``` + +4. **Qdrant-Verbindung prüfen**: + ```bash + # Dev + echo $QDRANT_URL + echo $QDRANT_HOST + echo $QDRANT_PORT + + # Prod + echo $QDRANT_URL + echo $QDRANT_HOST + echo $QDRANT_PORT + ``` + +## Lösungsvorschläge + +### Option 1: Harmonisierung der Umgebungsvariablen (Empfohlen) + +**Ziel**: Eine einzige Umgebungsvariable für den Collection-Präfix verwenden. + +**Änderungen**: +1. **`app/core/database/qdrant.py`**: + ```python + prefix = os.getenv("COLLECTION_PREFIX") or os.getenv("MINDNET_PREFIX") or "mindnet" + ``` + - Unterstützt beide Variablen (Abwärtskompatibilität) + - `COLLECTION_PREFIX` hat Priorität + +2. **`app/config.py`**: + ```python + COLLECTION_PREFIX: str = os.getenv("COLLECTION_PREFIX") or os.getenv("MINDNET_PREFIX") or "mindnet_dev" + ``` + - Unterstützt beide Variablen + - `COLLECTION_PREFIX` hat Priorität + +3. **Dokumentation**: Klarstellen, dass `COLLECTION_PREFIX` die primäre Variable ist + +### Option 2: Explizite Konfiguration in .env + +**Ziel**: Beide Systeme verwenden explizit gesetzte `COLLECTION_PREFIX` Werte. + +**Dev `.env`**: +```env +COLLECTION_PREFIX=mindnet_dev +``` + +**Prod `.env`**: +```env +COLLECTION_PREFIX=mindnet +``` + +### Option 3: Daten-Migration + +**Ziel**: Daten von einer Collection in die andere migrieren. + +**Vorgehen**: +1. Identifizieren, welche Collection die "richtigen" Daten enthält +2. Daten von Dev nach Prod migrieren (oder umgekehrt) +3. Collection-Präfix harmonisieren + +## Sofortmaßnahmen + +1. ✅ **Prüfen**: Welche Collections existieren in beiden Systemen? +2. ✅ **Prüfen**: Welche Umgebungsvariablen sind gesetzt? +3. ✅ **Prüfen**: Welche Collection enthält die Daten? +4. ✅ **Fix**: Collection-Präfix-Konfiguration harmonisieren +5. ✅ **Test**: Retrieval in beiden Systemen verifizieren + +## Erwartetes Ergebnis nach Fix + +- ✅ Beide Systeme verwenden dieselbe Collection-Präfix-Logik +- ✅ Retrieval findet Daten in beiden Systemen +- ✅ Konsistente Konfiguration zwischen Ingestion und Retrieval