Selbsthosting von Cognee: LLM-Leistungstests

Testen von Cognee mit lokalen LLMs - echte Ergebnisse

Inhaltsverzeichnis

Cognee ist ein Python-Framework zum Aufbau von Wissensgraphen aus Dokumenten unter Verwendung von LLMs. Aber funktioniert es mit selbstgehosteten Modellen?

Ich habe es mit mehreren lokalen LLMs getestet, um das herauszufinden.

cognee processing pdf with procelist

Das ist eine PDF-Seite mit einer Preisliste, die ich versucht habe zu verarbeiten.

TL;DR

Cognee funktioniert wahrscheinlich gut mit intelligenten LLMs mit Hunderten von Milliarden Parametern, aber für selbstgehostete RAG-Setups, die automatisch Daten aus PDFs (wie Preislisten) extrahieren sollen, ist es gescheitert, auf meiner Hardware. Die starke Abhängigkeit des Frameworks von strukturierten Ausgaben macht es für kleinere lokale Modelle schwierig, zuverlässig zu arbeiten.

Was ist Cognee?

Cognee ist ein Open-Source-Python-Framework, das speziell für den Aufbau von Wissensgraphen aus unstrukturierten Dokumenten unter Verwendung von LLMs entwickelt wurde. Im Gegensatz zu traditionellen RAG-Systemen, die Dokumente einfach in Chunks aufteilen und einbetten, versucht Cognee, ein semantisches Verständnis zu schaffen, indem es Entitäten, Beziehungen und Konzepte in eine Graphdatenbank extrahiert. Dieser Ansatz entspricht fortschrittlichen RAG-Architekturen wie GraphRAG, die eine bessere kontextbezogene Abfrage verspricht.

Das Framework unterstützt mehrere Backends:

  • Vektordatenbanken: LanceDB (Standard), mit Unterstützung für andere Vektorspeicher
  • Graphdatenbanken: Kuzu (Standard), die komplexe Beziehungsabfragen ermöglicht
  • LLM-Anbieter: OpenAI, Anthropic, Ollama und andere
  • Strukturierte Ausgabeframeworks: BAML und Instructor für eingeschränkte Generierung

Für Selbsthosting-Enthusiasten macht Cognees Kompatibilität mit Ollama es attraktiv für lokale Bereitstellungen. Allerdings liegt der Teufel im Detail – wie wir sehen werden, schaffen die Anforderungen an strukturierte Ausgaben erhebliche Herausforderungen für kleinere Modelle.

Warum strukturierte Ausgaben wichtig sind

Cognee verlässt sich stark auf strukturierte Ausgaben, um Informationen aus Dokumenten in einem konsistenten Format zu extrahieren. Beim Verarbeiten eines Dokuments muss das LLM richtig formatiertes JSON zurückgeben, das Entitäten, Beziehungen und Metadaten enthält. Hier scheitern viele kleinere Modelle.

Wenn Sie in Ihren eigenen Projekten mit strukturierten Ausgaben arbeiten, ist das Verständnis dieser Einschränkungen entscheidend. Die Herausforderungen, auf die ich mit Cognee gestoßen bin, spiegeln breitere Probleme im LLM-Ökosystem bei der Arbeit mit lokalen Modellen wider.

Konfigurationssetup

Hier ist meine Arbeitskonfiguration für Cognee mit Ollama. Beachten Sie die wichtigsten Einstellungen, die den lokalen Betrieb ermöglichen:

TELEMETRY_DISABLED=1

# STRUCTURED_OUTPUT_FRAMEWORK="instructor"
STRUCTURED_OUTPUT_FRAMEWORK="BAML"

# LLM-Konfiguration
LLM_API_KEY="ollama"
LLM_MODEL="gpt-oss:20b"
LLM_PROVIDER="ollama"
LLM_ENDPOINT="http://localhost:11434/v1"
# LLM_MAX_TOKENS="25000"

# Einbettungs-Konfiguration
EMBEDDING_PROVIDER="ollama"
EMBEDDING_MODEL="avr/sfr-embedding-mistral:latest"
EMBEDDING_ENDPOINT="http://localhost:11434/api/embeddings"
EMBEDDING_DIMENSIONS=4096
HUGGINGFACE_TOKENIZER="Salesforce/SFR-Embedding-Mistral"

# BAML-Konfiguration
BAML_LLM_PROVIDER="ollama"
BAML_LLM_MODEL="gpt-oss:20b"

BAML_LLM_ENDPOINT="http://localhost:11434/v1"

# Datenbank-Einstellungen (Standard)
DB_PROVIDER="sqlite"
VECTOR_DB_PROVIDER="lancedb"
GRAPH_DATABASE_PROVIDER="kuzu"

# Authentifizierung
REQUIRE_AUTHENTICATION=False
ENABLE_BACKEND_ACCESS_CONTROL=False

Wichtige Konfigurationsentscheidungen

Strukturierte Ausgabeframework: Ich habe BAML getestet, das eine bessere Kontrolle über Ausgabeschemata im Vergleich zu einfachen Prompts bietet. BAML ist speziell für strukturierte LLM-Ausgaben entwickelt worden und daher eine natürliche Wahl für Aufgaben zur Extraktion von Wissensgraphen.

LLM-Anbieter: Die Verwendung des OpenAI-kompatiblen API-Endpunkts von Ollama (/v1) ermöglicht es Cognee, es wie jeden anderen OpenAI-ähnlichen Dienst zu behandeln.

Einbettungsmodell: Das SFR-Embedding-Mistral-Modell (4096 Dimensionen) liefert hochwertige Einbettungen. Für mehr Informationen zur Auswahl und Leistung von Einbettungsmodellen bieten die Qwen3-Einbettungsmodelle hervorragende Alternativen mit starken mehrsprachigen Fähigkeiten.

Datenbanken: SQLite für Metadaten, LanceDB für Vektoren und Kuzu für den Wissensgraphen halten alles lokal ohne externe Abhängigkeiten.

Installieren Sie Cognee

Die Installation ist einfach mit uv (oder pip). Ich empfehle uv für schnellere Abhängigkeitsauflösung:

uv venv && source .venv/bin/activate
uv pip install cognee[ollama]
uv pip install cognee[baml]
uv pip install cognee[instructor]

uv sync --extra scraping
uv run playwright install
sudo apt-get install libavif16

Die Extras [ollama], [baml] und [instructor] installieren die notwendigen Abhängigkeiten für den lokalen LLM-Betrieb und strukturierte Ausgaben. Das Extra scraping fügt Web-Scraping-Funktionen hinzu, während Playwright die Verarbeitung von JavaScript-rendered Seiten ermöglicht.

Beispielcode und Verwendung

Hier ist der grundlegende Arbeitsablauf zur Verarbeitung von Dokumenten mit Cognee. Zuerst fügen wir Dokumente hinzu und bauen den Wissensgraphen auf:

msy-add.py:

import cognee
import asyncio

async def main():

    # Erstellen Sie einen sauberen Arbeitsbereich für Cognee -- Daten und Systemzustand zurücksetzen
    await cognee.prune.prune_data()
    await cognee.prune.prune_system(metadata=True)

    # Beispielinhalt hinzufügen
    await cognee.add(
        "/home/rg/prj/prices/msy_parts_price_20251224.pdf",
        node_set=["price_list", "computer_parts", "2025-12-24", "aud"]
    )

    # Verarbeiten mit LLMs, um den Wissensgraphen aufzubauen
    await cognee.cognify()

if __name__ == '__main__':
    asyncio.run(main())

Der Parameter node_set bietet semantische Tags, die helfen, das Dokument im Wissensgraphen zu kategorisieren. Die Methode cognify() ist der Ort, an dem die Magie (oder Probleme) passiert – sie sendet Dokumenten-Chunks an das LLM zur Extraktion von Entitäten und Beziehungen.

msy-search.py:

import cognee
import asyncio

async def main():

    # Durchsuchen Sie den Wissensgraphen
    results = await cognee.search(
        query_text="Welche Produkte sind in der Preisliste enthalten?"
#       query_text="Was ist der durchschnittliche Preis für 32GB RAM (2x16GB-Module)?"
    )

    # Ausgeben
    for result in results:
        print(result)

if __name__ == '__main__':
    asyncio.run(main())

Im Gegensatz zur traditionellen Vektorsuche in RAG-Systemen fragt Cognee den Wissensgraphen ab, was theoretisch eine anspruchsvollere, beziehungsbasierte Abfrage ermöglicht. Dies ähnelt der Funktionsweise fortschrittlicher RAG-Architekturen, erfordert aber, dass der anfängliche Graphaufbau erfolgreich ist.

Testergebnisse: LLM-Leistung

Ich habe Cognee mit einem realen Anwendungsfall getestet: der Extraktion von Produktinformationen aus einer PDF-Preisliste für Computerteile. Dies schien ein ideales Szenario zu sein – strukturierte Daten in tabellarischer Form. Hier ist, was mit jedem Modell passiert ist:

Getestete Modelle

1. gpt-oss:20b (20 Milliarden Parameter)

  • Ergebnis: Fehlgeschlagen mit Zeichenkodierungsfehlern
  • Problem: Gibt fehlerhaftes strukturiertes Format mit falschen Zeichen zurück
  • Hinweis: Trotz spezieller Entwicklung für Open-Source-Kompatibilität konnte es die konsistente JSON-Formatierung nicht aufrechterhalten

2. qwen3:14b (14 Milliarden Parameter)

  • Ergebnis: Keine strukturierte Ausgabe erzeugt
  • Problem: Das Modell generierte Text, aber nicht im erforderlichen JSON-Schema
  • Hinweis: Qwen-Modelle leisten normalerweise gute Arbeit, aber diese Aufgabe überstieg ihre Fähigkeiten zur strukturierten Ausgabe

3. deepseek-r1:14b (14 Milliarden Parameter)

  • Ergebnis: Keine strukturierte Ausgabe erzeugt
  • Problem: Ähnlich wie qwen3, konnte es den BAML-Schema-Anforderungen nicht entsprechen
  • Hinweis: Die Fähigkeiten zur logischen Schlussfolgerung halfen nicht bei der Formatkonformität

4. devstral:24b (24 Milliarden Parameter)

  • Ergebnis: Keine strukturierte Ausgabe erzeugt
  • Problem: Trotz mehrerer Parameter konnte es kein gültiges JSON konsistent generieren
  • Hinweis: Spezialmodell für Codierung hatte weiterhin Schwierigkeiten mit der strikten Schema-Einhaltung

5. ministral-3:14b (14 Milliarden Parameter)

  • Ergebnis: Keine strukturierte Ausgabe erzeugt
  • Problem: Das kleinere Mistral-Modell konnte die Anforderungen an die strukturierte Ausgabe nicht bewältigen

6. qwen3-vl:30b-a3b-instruct (30 Milliarden Parameter)

  • Ergebnis: Keine strukturierte Ausgabe erzeugt
  • Problem: Die Fähigkeiten zur Bildverarbeitung halfen in diesem Kontext nicht bei der Extraktion von PDF-Tabellen

7. gpt-oss:120b (120 Milliarden Parameter)

  • Ergebnis: Verarbeitung nicht abgeschlossen nach 2+ Stunden
  • Hardware: Consumer-GPU-Setup
  • Problem: Das Modell war für den praktischen Selbsthosting-Betrieb zu groß, auch wenn es möglicherweise irgendwann funktioniert hätte

Wichtige Erkenntnisse

Chunk-Größenbegrenzung: Cognee verwendet 4k-Token-Chunks bei der Verarbeitung von Dokumenten mit Ollama. Für komplexe Dokumente oder Modelle mit größeren Kontextfenstern erscheint dies unnötig restriktiv. Das Framework bietet keine einfache Möglichkeit, diesen Parameter anzupassen.

Anforderungen an strukturierte Ausgaben: Das Kernproblem ist nicht die Intelligenz des Modells, sondern die Formatkonformität. Diese Modelle können den Inhalt verstehen, aber die Aufrechterhaltung eines konsistenten JSON-Schemas während des gesamten Extraktionsprozesses erweist sich als schwierig. Dies entspricht breiteren Herausforderungen bei der Veranlassung lokaler Modelle, Ausgabebeschränkungen zu respektieren.

Hardwareüberlegungen: Selbst wenn ein ausreichend großes Modell funktionieren könnte (wie gpt-oss:120b), machen die Hardwareanforderungen es für die meisten Selbsthosting-Szenarien unpraktikabel. Sie benötigen erheblichen GPU-Speicher und Verarbeitungsleistung.

Vergleich mit Best Practices für strukturierte Ausgaben

Diese Erfahrung unterstreicht die Lehren aus der Arbeit mit strukturierten Ausgaben bei verschiedenen LLM-Anbietern. Kommerzielle APIs von OpenAI, Anthropic und Google haben oft eingebaute Mechanismen, um Ausgabeschemata durchzusetzen, während lokale Modelle anspruchsvollere Ansätze wie grammatikbasiertes Sampling oder mehrere Validierungsdurchläufe erfordern.

Für eine tiefgehende Analyse der Auswahl des richtigen LLM für Cognee auf Ollama, einschließlich detaillierter Vergleiche verschiedener Modellgrößen und ihrer Leistungscharakteristika, gibt es umfassende Leitfäden, die Ihnen helfen können, eine fundierte Entscheidung zu treffen.

Alternative Ansätze für selbstgehostete RAG

Wenn Sie sich für das Selbsthosting entscheiden und strukturierte Daten aus Dokumenten extrahieren müssen, sollten Sie diese Alternativen in Betracht ziehen:

1. Traditionelle RAG mit einfacherer Extraktion

Anstatt zunächst ein komplexes Wissensgraph zu erstellen, verwenden Sie traditionelle RAG mit Dokumenten-Chunking und Vektor-Suche. Für die Extraktion strukturierter Daten:

  • Parsen Sie Tabellen direkt mit Bibliotheken wie pdfplumber oder tabula-py
  • Verwenden Sie einfachere Prompts, die keine strikte Schema-Einhaltung erfordern
  • Implementieren Sie eine Nachbearbeitungsvalidierung in Python, anstatt sich auf das LLM-Ausgabeformat zu verlassen

2. Spezialisierte Embedding-Modelle

Die Qualität Ihrer Embeddings beeinflusst die Abrufleistung erheblich. Erwägen Sie die Verwendung leistungsstarker Embedding-Modelle, die lokal gut funktionieren. Moderne Embedding-Modelle wie die Angebote von Qwen3 bieten hervorragende mehrsprachige Unterstützung und können die Genauigkeit Ihres RAG-Systems deutlich verbessern.

3. Reranking für bessere Ergebnisse

Sogar mit einfacheren RAG-Architekturen kann ein Reranking-Schritt die Ergebnisse deutlich verbessern. Nach der anfänglichen Vektor-Suche kann ein Reranker-Modell die Relevanz besser bewerten. Dieser zweistufige Ansatz übertrifft oft komplexere Einstufen-Systeme, insbesondere bei der Arbeit mit eingeschränkter Hardware.

4. Hybrid-Suchstrategien

Die Kombination aus Vektor-Suche und traditioneller Keyword-Suche (BM25) ergibt oft bessere Ergebnisse als jede allein. Viele moderne Vektordatenbanken unterstützen Hybrid-Suche standardmäßig.

5. Alternativen für Vektor-Speicher

Wenn Sie ein RAG-System von Grund auf aufbauen, bewerten Sie verschiedene Vektor-Speicher basierend auf Ihren Anforderungen. Die Optionen reichen von leichten eingebetteten Datenbanken bis zu verteilten Systemen, die für die Produktionsskalierung entwickelt wurden.

Docker-Implementierungsüberlegungen

Für die Produktion von Self-Hosting vereinfacht die Containerisierung Ihrer RAG-Konfiguration die Implementierung und Skalierung. Beim Ausführen von Cognee oder ähnlichen Frameworks mit Ollama:

# Führen Sie Ollama in einem Container aus
docker run -d --gpus=all -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama

# Laden Sie Ihre Modelle herunter
docker exec -it ollama ollama pull gpt-oss:20b

# Konfigurieren Sie Cognee, um sich mit dem Container-Endpunkt zu verbinden

Stellen Sie sicher, dass Sie GPU-Passthrough und Volumen-Mounts für die Modellpersistenz korrekt konfigurieren.

Erlernte Lektionen

1. Passende Tools für Hardware: Cognee ist für cloudbasierte LLMs konzipiert. Wenn Sie auf Consumer-Hardware selbst hosten, können einfachere Architekturen praktischer sein.

2. Strukturierte Ausgabe ist schwierig: Konsistente Schema-Konformität von lokalen LLMs bleibt eine Herausforderung. Wenn Ihre Anwendung kritisch von strukturierter Ausgabe abhängt, verwenden Sie entweder kommerzielle APIs oder implementieren Sie robuste Validierungs- und Wiederholungslogik.

3. Testen Sie früh: Bevor Sie sich für einen Framework entscheiden, testen Sie ihn mit Ihrem spezifischen Anwendungsfall und Ihrer Hardware. Was in Demos funktioniert, funktioniert möglicherweise nicht im großen Maßstab oder mit Ihren Dokumenten.

4. Hybrid-Ansätze in Betracht ziehen: Verwenden Sie kommerzielle APIs für komplexe Extraktionsaufgaben und lokale Modelle für einfachere Abfragen, um Kosten und Fähigkeiten auszugleichen.

Verwandte Lektüre

Strukturierte Ausgabe mit LLMs

Das Verständnis strukturierter Ausgaben ist entscheidend für Frameworks wie Cognee. Diese Artikel gehen tief in die Erlangung konsistenter, schema-konformer Antworten von LLMs ein:

RAG-Architektur und Implementierung

Für alternative oder komplementäre Ansätze zur Wissensextraktion und -abfrage:

Embedding und Reranking

Verbesserung der Abfragequalität durch bessere Embeddings und Reranking:

Tools und Ressourcen

Externe Ressourcen