angleichen der Default prefix für die Collections
All checks were successful
Deploy mindnet to llm-node / deploy (push) Successful in 3s

This commit is contained in:
Lars 2026-01-12 15:02:23 +01:00
parent 5e67cd470c
commit df5f9b3fe4
3 changed files with 169 additions and 2 deletions

View File

@ -21,7 +21,9 @@ class Settings:
# --- Qdrant Datenbank --- # --- Qdrant Datenbank ---
QDRANT_URL: str = os.getenv("QDRANT_URL", "http://127.0.0.1:6333") QDRANT_URL: str = os.getenv("QDRANT_URL", "http://127.0.0.1:6333")
QDRANT_API_KEY: str | None = os.getenv("QDRANT_API_KEY") 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) # WP-22: Vektor-Dimension für das Embedding-Modell (nomic)
VECTOR_SIZE: int = int(os.getenv("VECTOR_DIM", "768")) VECTOR_SIZE: int = int(os.getenv("VECTOR_DIM", "768"))

View File

@ -44,7 +44,9 @@ class QdrantConfig:
port = os.getenv("QDRANT_PORT") port = os.getenv("QDRANT_PORT")
port = int(port) if port else None port = int(port) if port else None
api_key = os.getenv("QDRANT_API_KEY") or 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) dim = int(os.getenv("VECTOR_DIM") or 384)
distance = os.getenv("DISTANCE", "Cosine") distance = os.getenv("DISTANCE", "Cosine")
on_disk_payload = (os.getenv("ON_DISK_PAYLOAD", "true").lower() == "true") on_disk_payload = (os.getenv("ON_DISK_PAYLOAD", "true").lower() == "true")

View File

@ -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