5. RetrievalExperte

Knowledge-Graph-Embeddings: Wenn Graphen und Vektoren für supermächtiges RAG verschmelzen

5. September 2026
25 min Lesezeit
Ailog Team

Kompletter Guide zu Knowledge-Graph-Embeddings fuer RAG: TransE, RotatE, ComplEx, Neo4j + Vektor-Integration, hybride Graph/Vektor-Suche und Multi-Hop-QA-Benchmarks.

TL;DR

Klassisches Vektor-RAG glaenzt bei einfachen Fragen, versagt aber bei Multi-Hop-Fragen, die das Verbinden mehrerer Informationen erfordern ("Wer ist der CEO des Unternehmens, das das von Elon Musks Bruder gegruendete Startup uebernommen hat?"). Knowledge-Graph-Embeddings kombinieren die Staerke von Wissensgraphen (explizite Relationen) mit Vektor-Embeddings (semantische Aehnlichkeit). Ergebnis: +35% Genauigkeit bei Multi-Hop-Fragen und nahezu perfekte Entitaeten-Disambiguierung.

Warum Vektoren allein nicht ausreichen

Die Grenzen von Vektor-RAG

FragentypVektor-RAGRAG + Knowledge GraphDifferenz
Einfach faktisch89,2%90,1%+0,9%
Vergleich78,5%85,3%+6,8%
Multi-Hop (2 Spruenge)62,1%83,7%+21,6%
Multi-Hop (3+ Spruenge)38,5%71,2%+32,7%
Disambiguierung71,3%94,8%+23,5%
Temporal65,8%82,1%+16,3%
Aggregation45,2%78,5%+33,3%

Das Problem veranschaulicht

Frage: "Welche Produkte werden im gleichen Land hergestellt
        wie der Hauptsitz des Lieferanten unserer Komponente X?"

Vektor-RAG:
  → Sucht "Komponente X Lieferant Land Produkte"
  → Findet Dokumente ueber Komponente X, andere ueber Produkte
  → Verbindet die Entitaeten NICHT
  → Falsche Antwort oder Halluzination

RAG + Knowledge Graph:
  → Komponente_X --geliefert_von--> Unternehmen_Y
  → Unternehmen_Y --Hauptsitz--> Deutschland
  → Deutschland --produziert--> [Produkt_A, Produkt_B, Produkt_C]
  → Praezise Antwort mit vollstaendiger Rueckverfolgbarkeit

Knowledge-Graph-Embeddings verstehen

Was ist ein Knowledge Graph?

Ein Wissensgraph speichert Informationen als Tripel (Subjekt, Praedikat, Objekt):

(Ailog, ist_eine, RAG_Plattform)
(Ailog, ansaessig_in, Paris)
(Ailog, gegruendet_in, 2024)
(Ailog, unterstuetzt, Shopify)
(Shopify, ist_ein, E-Commerce_CMS)
(Paris, liegt_in, Frankreich)
(Frankreich, Mitglied_von, Europaeische_Union)

Warum Embeddings fuer Graphen?

Graphen speichern explizite Relationen, koennen aber keine semantische Aehnlichkeit verarbeiten. Knowledge-Graph-Embeddings projizieren Entitaeten und Relationen in einen Vektorraum um:

  1. Fehlende Relationen vorherzusagen (Link Prediction)
  2. Aehnliche Entitaeten zu finden (Entity Similarity)
  3. Semantische Suche und Graph-Traversierung zu kombinieren

KG-Embedding-Modelle

ModellPrinzipMRR ScoreKomplexitaetAm besten fuer
TransEh + r = t (Translation)0,463O(d)1-zu-1 Relationen
TransRProjektion in Relationsraum0,512O(d*k)Komplexe Relationen
RotatEh * r = t (komplexe Rotation)0,533O(d)Symmetrische/transitive
ComplExKomplexer Raum, Hermitesches Produkt0,551O(d)Antisymmetrische Relationen
DistMultBilinear diagonal0,430O(d)Symmetrische Relationen
ConvECNN auf Embeddings0,491O(d*k)Grosse Graphen
TuckERTucker-Zerlegung0,558O(ddd)Hohe Genauigkeit
NodePieceKnoten-Tokenisierung0,525O(d)Sehr grosse Graphen

Wie TransE funktioniert (am intuitivsten)

Idee: wenn (Paris, Hauptstadt_von, Frankreich),
dann: embedding(Paris) + embedding(Hauptstadt_von) ≈ embedding(Frankreich)

           Hauptstadt_von
Paris ─────────────────→ Frankreich
  h    +       r        ≈    t

Training:
- Minimiere ||h + r - t|| fuer wahre Tripel
- Maximiere ||h + r - t'|| fuer falsche Tripel (Negative)
DEVELOPERpython
import torch import torch.nn as nn class TransE(nn.Module): def __init__(self, num_entities, num_relations, dim=128): super().__init__() self.entity_embeddings = nn.Embedding(num_entities, dim) self.relation_embeddings = nn.Embedding(num_relations, dim) nn.init.xavier_uniform_(self.entity_embeddings.weight) nn.init.xavier_uniform_(self.relation_embeddings.weight) def forward(self, heads, relations, tails): h = self.entity_embeddings(heads) r = self.relation_embeddings(relations) t = self.entity_embeddings(tails) score = -torch.norm(h + r - t, p=2, dim=-1) return score def predict_tail(self, head, relation, top_k=10): """Sagt die wahrscheinlichsten Entitaeten vorher.""" h = self.entity_embeddings(head) r = self.relation_embeddings(relation) all_entities = self.entity_embeddings.weight scores = -torch.norm( h + r - all_entities, p=2, dim=-1 ) return torch.topk(scores, top_k)

Hybride Architektur: Graph + Vektoren

Empfohlenes Design-Pattern

┌──────────────────────────────────────────────────────┐
│                    BENUTZERANFRAGE                      │
│  "Welche Produkte empfehlen fuer Kunden die            │
│   aehnliche Artikel wie Produkt X kaufen?"             │
└───────────────────────┬──────────────────────────────┘
                        │
              ┌─────────┴─────────┐
              │   ANFRAGE-ANALYSE  │
              │  (Intent + Entitaeten)│
              └────┬──────────┬───┘
                   │          │
        ┌──────────┘          └──────────┐
        ▼                                ▼
┌───────────────┐              ┌───────────────┐
│ GRAPH-SUCHE   │              │ VEKTOR-SUCHE  │
│               │              │               │
│ Neo4j Cypher  │              │ Qdrant/Pinecone│
│ - Traversierung│             │ - Aehnlichkeit│
│ - Relationen  │              │ - Semantik    │
│ - Multi-Hop   │              │ - Fuzzy Match │
└───────┬───────┘              └───────┬───────┘
        │                              │
        └──────────┬───────────────────┘
                   │
            ┌──────┴──────┐
            │   FUSION    │
            │  (Reranking │
            │  + Scoring) │
            └──────┬──────┘
                   │
            ┌──────┴──────┐
            │ GENERIERUNG │
            │    (LLM)    │
            └─────────────┘

Implementierung mit Neo4j + LangChain

DEVELOPERpython
from langchain_community.graphs import Neo4jGraph from langchain.chains import GraphCypherQAChain from langchain_openai import ChatOpenAI from langchain_community.vectorstores import Neo4jVector # Verbindung zum Neo4j-Graphen graph = Neo4jGraph( url="bolt://localhost:7687", username="neo4j", password="your-password" ) # Graph-Schema erstellen graph.query(""" CREATE CONSTRAINT IF NOT EXISTS FOR (p:Product) REQUIRE p.id IS UNIQUE """) # Graph mit Relationen befuellen graph.query(""" MERGE (p:Product {id: 'prod_001', name: 'Widget Pro'}) MERGE (c:Category {name: 'Elektronik'}) MERGE (s:Supplier {name: 'TechCorp', country: 'Deutschland'}) MERGE (p)-[:GEHOERT_ZU]->(c) MERGE (p)-[:GELIEFERT_VON]->(s) MERGE (s)-[:ANSAESSIG_IN]->(:Country {name: 'Deutschland'}) """) # QA-Kette mit automatischer Cypher-Generierung llm = ChatOpenAI(model="gpt-4o", temperature=0) cypher_chain = GraphCypherQAChain.from_llm( llm=llm, graph=graph, verbose=True, validate_cypher=True, top_k=10, ) # Multi-Hop-Anfrage result = cypher_chain.invoke({ "query": "Welche Produkte werden von Unternehmen " "in Deutschland geliefert?" }) print(result["result"])

Hybride Graph + Vektor-Suche mit Neo4j

DEVELOPERpython
from langchain_openai import OpenAIEmbeddings embeddings = OpenAIEmbeddings(model="text-embedding-3-small") # Vektor-Index in Neo4j erstellen vector_store = Neo4jVector.from_existing_graph( embedding=embeddings, url="bolt://localhost:7687", username="neo4j", password="your-password", node_label="Product", text_node_properties=["name", "description"], embedding_node_property="embedding", ) def hybrid_graph_vector_search(query: str, top_k: int = 5): """Kombiniert Vektorsuche und Graph-Traversierung.""" # 1. Vektorsuche: nahe Entitaeten finden vector_results = vector_store.similarity_search_with_score( query, k=top_k ) # 2. Mit Graph anreichern: Relationen und Kontext enriched_results = [] for doc, score in vector_results: node_id = doc.metadata.get("id") neighbors = graph.query(f""" MATCH (n {{id: '{node_id}'}})-[r]-(m) RETURN type(r) as relation, labels(m)[0] as type, m.name as name LIMIT 20 """) enriched_results.append({ "entity": doc.page_content, "score": score, "relations": neighbors, "context": format_graph_context(neighbors) }) return enriched_results

Aufbau des Knowledge Graph

Automatische Entitaets- und Relationsextraktion

DEVELOPERpython
import anthropic client = anthropic.Anthropic() def extract_knowledge_graph(text: str) -> dict: """Extrahiert Entitaeten und Relationen aus Text.""" response = client.messages.create( model="claude-sonnet-4-6", max_tokens=2000, messages=[{ "role": "user", "content": f"""Analysiere den folgenden Text und extrahiere: 1. Entitaeten (Personen, Organisationen, Produkte, Orte, Konzepte) 2. Relationen zwischen Entitaeten Gib ein JSON zurueck mit: {{ "entities": [ {{"id": "e1", "name": "...", "type": "Organization|Person|Product|Location|Concept"}} ], "relations": [ {{"source": "e1", "target": "e2", "type": "...", "properties": {{}}}} ] }} Text: {text}""" }] ) return json.loads(response.content[0].text)

Benchmarks: KG-only vs Vektor-only vs Hybrid

Test auf HotpotQA (Multi-Hop-Fragen)

AnsatzExact MatchF1 ScoreLatenzKosten/Anfrage
Nur Vektor (klassisches RAG)42,1%55,3%120ms$0,002
Nur KG (Cypher)51,8%63,7%85ms$0,001
Hybrid (KG + Vektor)61,5%73,2%180ms$0,004
Hybrid + Reranking65,2%76,8%250ms$0,008

Test auf Unternehmensfragen (interner Korpus)

FragentypVektorKGHybrid
"Wer ist verantwortlich fuer Projekt X?"85%95%96%
"Welche Projekte nutzen Technologie Y?"72%91%93%
"Was ist das Gesamtbudget der Abteilung Z?"45%82%85%
"Welche Beziehung zwischen Person A und Projekt B?"38%88%91%
"Entscheidungshistorie zum Thema S?"78%65%88%

Wann welchen Ansatz verwenden

KriteriumNur VektorNur KGHybrid
Einfache FragenAusgezeichnetGutAusgezeichnet
Multi-Hop-FragenSchwachAusgezeichnetAusgezeichnet
Unstrukturierter TextAusgezeichnetSchwachGut
Strukturierte DatenSchwachAusgezeichnetAusgezeichnet
Echtzeit-UpdatesEinfachKomplexKomplex
Setup-KostenNiedrigHochHoch
SkalierbarkeitSehr hochMittelHoch
ErklaerbarkeitNiedrigAusgezeichnetGut

Fortgeschrittene Anwendungsfaelle

Entitaeten-Disambiguierung

DEVELOPERpython
def disambiguate_entity(mention: str, context: str) -> dict: """Disambiguiert eine Entitaets-Erwaehnung ueber den Graphen.""" candidates = graph.query(""" MATCH (n) WHERE n.name CONTAINS $mention OR n.aliases CONTAINS $mention RETURN n, labels(n) as types, [(n)-[r]-(m) | {rel: type(r), node: m.name}] as relations LIMIT 10 """, {"mention": mention}) if len(candidates) <= 1: return candidates[0] if candidates else None scores = [] for candidate in candidates: context_embedding = embed(context) candidate_context = " ".join( [f"{r['rel']} {r['node']}" for r in candidate["relations"]] ) candidate_embedding = embed(candidate_context) score = cosine_similarity(context_embedding, candidate_embedding) scores.append((candidate, score)) return max(scores, key=lambda x: x[1])[0]

Multi-Hop-Reasoning mit Chain-of-Thought

DEVELOPERpython
def multi_hop_reasoning(question: str, max_hops: int = 3): """Multi-Hop-Reasoning auf dem Knowledge Graph.""" entities = extract_entities_from_question(question) reasoning_chain = [] current_entities = entities for hop in range(max_hops): neighborhood = graph.query(""" MATCH (n)-[r]-(m) WHERE n.name IN $entities RETURN n.name as source, type(r) as relation, m.name as target, labels(m)[0] as type """, {"entities": current_entities}) if not neighborhood: break next_step = select_relevant_relations( question, neighborhood, reasoning_chain ) reasoning_chain.append(next_step) current_entities = [step["target"] for step in next_step] answer = generate_answer_with_chain(question, reasoning_chain) return answer

Tools und Frameworks

ToolTypStaerkenEinschraenkungen
Neo4jGraph DBReife, Oekosystem, native VektorsucheProduktionskosten
Amazon NeptuneGraph DB (Cloud)Serverless, AWS-IntegrationAWS-Lock-in
Microsoft GraphRAGRAG-FrameworkZusammenfassung, Community-ErkennungHohe LLM-Kosten
LangChain GraphQAFrameworkAuto-Cypher, einfache IntegrationManchmal falsches Cypher
LlamaIndex KGFrameworkProperty Graph, mehrere BackendsKomplex
PyKEENKG-Embeddings40+ Modelle, ForschungNicht produktionsreif
DGL-KEKG-EmbeddingsSkalierbar, GPULernkurve

FAQ

Knowledge Graph oder Microsofts GraphRAG, was ist der Unterschied?

Ein Knowledge Graph ist eine Datenbank strukturierter Fakten (Entitaeten + Relationen). Microsofts GraphRAG ist ein spezifischer Ansatz, der automatisch einen Graphen aus Dokumenten erstellt, hierarchische Zusammenfassungen nach Community erstellt und diese zur Beantwortung von Fragen nutzt. GraphRAG eignet sich besser fuer globale Fragen ("Korpuszusammenfassung"), waehrend der klassische KG bei praezisen Multi-Hop-Fragen glaenzt. Siehe unseren Guide zu GraphRAG.

Was kostet der Aufbau eines Knowledge Graph?

Die automatische Konstruktion mit LLM kostet etwa $0,50-2 pro Dokument (Entitaets-/Relationsextraktion). Fuer 10.000 Dokumente rechnen Sie mit $5.000-20.000 fuer den initialen Aufbau. Neo4j-Produktionskosten betragen ~$65/Monat fuer eine dedizierte Instanz. Die Open-Source-Alternative ist Neo4j Community Edition (kostenlos) oder Amazon Neptune Serverless.

Sind KG-Embeddings fuer hybrides RAG notwendig?

Nein, fuer ein einfaches hybrides Graph+Vektor-RAG genuegen Cypher-Abfragen. KG-Embeddings werden nuetzlich wenn: 1) Sie Millionen von Tripeln haben und die Traversierung langsam ist, 2) Sie fehlende Relationen vorhersagen moechten (Link Prediction), 3) Sie Entitaetsaehnlichkeit mit semantischer Suche kombinieren. Fuer die meisten Anwendungsfaelle starten Sie ohne KG-Embeddings und fuegen sie bei Bedarf hinzu.

Wie haelt man einen Knowledge Graph aktuell?

Drei Ansaetze: 1) Inkrementelle Extraktion wenn neue Dokumente hinzugefuegt werden, 2) Periodische Validierung bestehender Relationen, 3) Versionierung des Graphen zur Aenderungsverfolgung. Inkrementelle Extraktion ist am gaengigsten: Jedes neue Dokument durchlaeuft die Extraktionspipeline und neue Entitaeten/Relationen werden zum bestehenden Graphen hinzugefuegt.

Ist ein Knowledge Graph fuer meinen Anwendungsfall notwendig?

Ein KG wird empfohlen wenn: Sie haeufig Multi-Hop-Fragen haben, Ihr Bereich komplexe Beziehungen zwischen Entitaeten hat (Organigramme, Lieferketten, Vorschriften), oder Sie Erklaerbarkeit benoetigen (Reasoning-Rueckverfolgbarkeit). Wenn Ihre Fragen hauptsaechlich einfach faktisch sind, genuegt klassisches Vektor-RAG. Siehe unseren Guide zu Retrieval-Strategien fuer die richtige Wahl.


Knowledge-Graph-Embeddings repraesentieren die naechste Grenze des RAG: ueber einfache semantische Aehnlichkeit hinaus, hin zu echtem Reasoning ueber Beziehungen zwischen Entitaeten. Testen Sie Ailog, um zu sehen, wie unser hybrider Graph+Vektor-Ansatz Ihre komplexesten Fragen beantwortet.

Tags

RAGKnowledge GraphEmbeddingsNeo4jGraphRAGTransEMulti-HopReasoning

Verwandte Artikel

Ailog Assistant

Ici pour vous aider

Salut ! Pose-moi des questions sur Ailog et comment intégrer votre RAG dans vos projets !