Files
Crumb-Core-v.1/SESSION_2025-12-03_DOCUMENT_SEARCH_FIX.md

5.3 KiB
Raw Blame History

🎉 Session Notes: Document Search Fix

Datum: 2025-12-03 Status: ERFOLGREICH

🎯 Ziel

Document Search API zum Laufen bringen - Semantic Search über 721 Crumbforest + 12 RZ-Nullfeld Markdown-Dateien.

🐛 Hauptproblem

{"detail":"Unsupported embedding model: openai/text-embedding-3-small.
Supported models: ['text-embedding-3-small', 'text-embedding-3-large', 'text-embedding-ada-002']"}

🔍 Root Causes (3x!)

1. Falscher Provider in .env

# ❌ FALSCH:
DEFAULT_EMBEDDING_PROVIDER=openai

# ✅ RICHTIG:
DEFAULT_EMBEDDING_PROVIDER=openrouter

2. Kein Volume Mount - Code nicht aktiv!

  • Problem: Docker Image hat Code eingebacken (kein Volume Mount)
  • Symptom: Alle Code-Edits hatten keine Wirkung
  • Fix: docker compose up --build -d nach JEDER Code-Änderung

3. Collection-Namen inkonsistent

  • Qdrant: docs_crumbforest_, docs_rz_nullfeld_ (mit Unterstrich)
  • Code: Suchte nach docs_crumbforest, docs_rz_nullfeld (ohne)
  • Zusätzlich: RAGService fügte _{locale} hinzu → Doppel-Unterstrich!

Alle Fixes

Fix 1: .env Konfiguration

# compose/.env
DEFAULT_EMBEDDING_PROVIDER=openrouter
DEFAULT_EMBEDDING_MODEL=text-embedding-3-small
DEFAULT_COMPLETION_PROVIDER=openrouter
DEFAULT_COMPLETION_MODEL=anthropic/claude-3-5-sonnet

Fix 2: app/routers/document_rag.py

# Explizites embedding_model ohne Prefix
embedding_provider = ProviderFactory.create_provider(
    provider_name=provider,
    settings=settings,
    embedding_model="text-embedding-3-small"  # Ohne openai/ prefix
)

# Collection-Namen ohne trailing underscore (RAGService fügt _{locale} hinzu)
collections = ["docs_rz_nullfeld", "docs_crumbforest"]

Fix 3: app/lib/embedding_providers/openrouter_provider.py

# Auto-Prefix für OpenRouter API
model = self.embedding_model if "/" in self.embedding_model else f"openai/{self.embedding_model}"

Fix 4: app/config.py

# Model ohne Prefix (funktioniert für beide Provider)
default_embedding_model: str = "text-embedding-3-small"

Fix 5: Docker Rebuild

cd compose
docker compose down
docker compose up --build -d

🎊 Erfolgreiche Test-Query

Request:

GET http://localhost:8000/api/documents/search?q=Docker&limit=5

Response:

{
  "query": "Docker",
  "results": [
    {
      "post_id": 2032991606,
      "title": "ssh_login_test",
      "header": "Dockerfile Ergänzung",
      "score": 0.5505129,
      "collection": "docs_crumbforest"
    },
    {
      "post_id": 676631428,
      "title": "crumbforest_specialist_roles",
      "header": "🐋 DockerDuke  Container-Kapitän",
      "score": 0.5469476,
      "collection": "docs_crumbforest"
    }
  ],
  "provider": "openrouter"
}

🦉 Besondere Momente

DockerDuke ist Legende! 🐋

Der Character "DockerDuke Container-Kapitän" tauchte in den Search Results auf und begeisterte sofort:

"dockerduke ist bereits jetzt legende #dude <3"

Token-Verbrennung 😅

Nach vielen Debugging-Runden:

"nö ... wir verbrennen nur token?"

Aber am Ende: WUHUUUU! 🎉

📊 System-Status

Indexierte Dokumente

  • Crumbforest: 721 Dokumente, 5,219 Vektoren
  • RZ Nullfeld: 12 Dokumente, 308 Vektoren
  • Total: 733 Dokumente, 5,527 Vektoren

Qdrant Collections

curl -s http://localhost:6333/collections | jq '.result.collections[].name'
# "docs_crumbforest_"
# "docs_rz_nullfeld_"

Provider-Status

docker compose logs app | grep provider
# ✓ Using provider: openrouter

🎓 Wichtige Learnings

1. Docker Volume Mounts prüfen!

# compose/docker-compose.yml
# KEIN Volume Mount für app/ Code!
# → Code ist im Image eingebacken
# → Rebuild nach jeder Änderung!

2. .env überschreibt config.py

# config.py Defaults werden von .env überschrieben
# Pydantic BaseSettings liest:
# 1. Environment Variables
# 2. .env File
# 3. Class Defaults

3. Collection-Namen Konvention

# RAGService erwartet PREFIX
collection_prefix = "docs_crumbforest"  # Ohne trailing _

# RAGService fügt hinzu:
collection_name = f"{collection_prefix}_{locale}"

# Bei locale="" → "docs_crumbforest_" ✅

4. Provider-spezifische Model-Namen

# OpenRouter: "openai/text-embedding-3-small" (mit Prefix)
# OpenAI: "text-embedding-3-small" (ohne Prefix)

# Lösung: Auto-Prefix in Provider
model = embedding_model if "/" in embedding_model else f"openai/{embedding_model}"

📝 Aktualisierte Dokumentation

  • QUICKSTART.md - Provider-Config Warnung, Rebuild-Requirements
  • HANDBUCH.md - Fehler 9 hinzugefügt mit vollständiger Diagnose
  • compose/.env - Korrekte Provider-Einstellungen

🚀 Next Steps

  1. Document Search funktioniert
  2. DockerDuke ist Legende
  3. ⏭️ Weitere Queries testen (Python, Qdrant, Kubernetes)
  4. ⏭️ RAG mit Completions testen
  5. ⏭️ Performance monitoring

🦉 Fazit

Nach intensivem Debugging (und einigen Token-Opfern 😅):

  • 3 Root Causes identifiziert und gefixt
  • 5 Code-Änderungen implementiert
  • 721 Dokumente durchsuchbar
  • DockerDuke ist geboren! 🐋

Status: WUHUUUU! 🎊


"Die Eule hat den Wald durchsucht und gefunden!" - Crumbforest Philosophy, 2025