Skip to content

Tag 2 Block 1: Embeddings & Vectorstore

Grundlagen für semantische Suche und RAG


Lernziele

  • Verstehen, was Embeddings sind und wie sie semantische Bedeutung erfassen
  • Kennenlernen verschiedener Embedding-Modelle und ihrer Anwendungen
  • Einrichten und Nutzen von Vektordatenbanken (FAISS, Chroma)
  • Implementieren effizienter Retrieval-Methoden für Finanzdokumente

Wiederholung: Die RAG-Pipeline

  1. Dokumentenladung: Einlesen verschiedener Dokumenttypen
  2. Dokumentenaufteilung: Zerlegung in handhabbare Chunks
  3. 👉 Vektorisierung: Umwandlung von Text in numerische Repräsentationen
  4. 👉 Speicherung: Ablage in einer Vektordatenbank
  5. 👉 Retrieval: Abrufen relevanter Dokumente
  6. Generation: Erstellung von Antworten durch ein LLM

Das Problem: Wie findet man relevante Informationen?

Traditionelle Suche (Keyword-basiert)

  • Sucht nach exakten Wortübereinstimmungen
  • Ignoriert Kontext und Bedeutung
  • Beispiel: Suche nach "Bilanz" findet nicht "Jahresabschluss"

Semantische Suche (Bedeutungs-basiert)

  • Versteht die Bedeutung hinter den Worten
  • Findet inhaltlich ähnliche Dokumente
  • Beispiel: Suche nach "finanzielle Risiken" findet auch "potenzielle Verlustquellen"

Was sind Embeddings?

Embeddings sind numerische Vektordarstellungen von Text, die: - Semantische Bedeutung erfassen - Ähnlichkeitsvergleiche ermöglichen - Dimensionsreduktion für komplexe Daten bieten


Wie funktionieren Embeddings?

  • Jedes Wort/Dokument wird als Vektor im n-dimensionalen Raum dargestellt
  • Ähnliche Konzepte liegen im Vektorraum nahe beieinander
  • Ähnlichkeit wird durch Kosinus-Ähnlichkeit oder Dot-Produkt gemessen
Ähnlichkeit = cos(θ) = A·B / (||A|| × ||B||)

Beispiel: Wort-Embeddings

"Bank" (Finanzinstitut) → [0.2, -0.6, 0.1, 0.9, ...]
"Bank" (Sitzgelegenheit) → [0.3, 0.5, 0.2, -0.7, ...]
"Kreditinstitut" → [0.25, -0.55, 0.15, 0.85, ...]
  • "Bank" (Finanzinstitut) und "Kreditinstitut" liegen im Vektorraum nahe beieinander
  • "Bank" (Sitzgelegenheit) liegt weiter entfernt
  • Typische Dimensionen: 384, 768, 1024, 1536 (OpenAI)

Embedding-Modelle

Verschiedene Anbieter und Modelle: - OpenAI: text-embedding-ada-002 (1536 Dimensionen) - Cohere: embed-multilingual-v2.0 - Sentence Transformers: all-MiniLM-L6-v2 (384 Dimensionen) - HuggingFace: verschiedene Open-Source-Modelle

from langchain.embeddings import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()
text = "Finanzanalyse des Q3 Berichts"
vector = embeddings.embed_query(text)
print(f"Dimensionen des Vektors: {len(vector)}")  # 1536

Anwendungsbeispiel: Finanzberichte

# Beispiel: Verschiedene Finanzkonzepte als Embeddings
texte = [
    "Quartalsbericht Q3 2023",
    "Jahresabschluss 2022",
    "Bilanz zum 31.12.2022",
    "Gewinn- und Verlustrechnung",
    "Risikobewertung Marktrisiken"
]

# Embeddings erstellen
embeddings_model = OpenAIEmbeddings()
text_embeddings = [embeddings_model.embed_query(text) for text in texte]

# Ähnlichkeit berechnen
from sklearn.metrics.pairwise import cosine_similarity
similarity = cosine_similarity([text_embeddings[0]], [text_embeddings[1]])
print(f"Ähnlichkeit zwischen '{texte[0]}' und '{texte[1]}': {similarity[0][0]:.4f}")

Vektordatenbanken

Spezialisierte Datenbanken für: - Effiziente Speicherung von Vektoren - Schnelle Ähnlichkeitssuche - Skalierbarkeit für Millionen von Dokumenten


Populäre Vektordatenbanken

Name Vorteile Nachteile Anwendungsfall
Chroma Einfach, in-memory Begrenzte Skalierbarkeit Prototyping, kleine Datensätze
FAISS Sehr schnell, optimiert Komplexere API Große Datensätze, Produktionsumgebungen
Pinecone Gehostet, skalierbar Kostenpflichtig Cloud-basierte Anwendungen
Weaviate Graph-basiert Komplexer Verknüpfte Daten
Milvus Verteilte Architektur Aufwändiger Setup Sehr große Datensätze

Chroma: Eine einfache Vektordatenbank

from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings

# Embeddings-Modell initialisieren
embeddings = OpenAIEmbeddings()

# Vektordatenbank erstellen
vectorstore = Chroma.from_texts(
    texts=chunks,  # Unsere Dokument-Chunks
    embedding=embeddings,
    metadatas=[doc.metadata for doc in documents],  # Metadaten hinzufügen
    persist_directory="./chroma_db"  # Lokal speichern
)

# Datenbank speichern
vectorstore.persist()

from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings

# Embeddings-Modell initialisieren
embeddings = OpenAIEmbeddings()

# FAISS Vektordatenbank erstellen
vectorstore = FAISS.from_texts(
    texts=chunks,
    embedding=embeddings,
    metadatas=[doc.metadata for doc in documents]
)

# Datenbank speichern
vectorstore.save_local("faiss_index")

Ähnlichkeitssuche

# Einfache Ähnlichkeitssuche
query = "Wie hat sich die Liquidität im letzten Quartal entwickelt?"
docs = vectorstore.similarity_search(query, k=3)

print(f"Top 3 relevante Dokumente für: '{query}'")
for i, doc in enumerate(docs):
    print(f"\nDokument {i+1}:")
    print(f"Quelle: {doc.metadata.get('source', 'Unbekannt')}")
    print(f"Inhalt: {doc.page_content[:200]}...")

Metadaten-Filterung

# Nur Dokumente aus dem Jahresbericht 2023
filter = {"source": "jahresbericht_2023.pdf"}
docs = vectorstore.similarity_search(
    query, k=3, filter=filter
)

# Nur Dokumente aus dem Abschnitt "Risikobewertung"
filter = {"section": "Risikobewertung"}
docs = vectorstore.similarity_search(
    query, k=3, filter=filter
)

Maximum Marginal Relevance (MMR)

  • Balanciert Relevanz und Diversität
  • Verhindert redundante Ergebnisse
  • Besonders nützlich für umfassende Analysen
docs = vectorstore.max_marginal_relevance_search(
    query, k=3, fetch_k=10, lambda_mult=0.5
)

Anwendungsfall: Finanzberichte analysieren

# Beispiel: Analyse von Quartalsberichten
query = "Vergleichen Sie die Umsatzentwicklung der letzten 4 Quartale"

# Metadaten-Filter für Quartalsberichte
filter = {"type": "quarterly_report"}

# MMR für diverse Ergebnisse
docs = vectorstore.max_marginal_relevance_search(
    query, k=4, filter=filter
)

for i, doc in enumerate(docs):
    quarter = doc.metadata.get("quarter", "Unbekannt")
    print(f"\nQuartal {quarter}:")
    print(f"Umsatz: {doc.page_content[:100]}...")

Anwendungsfall: ESG-Risiken identifizieren

# Beispiel: ESG-Risiken aus Nachhaltigkeitsberichten extrahieren
query = "Welche Klimarisiken wurden im Nachhaltigkeitsbericht identifiziert?"

# Metadaten-Filter für ESG-Berichte
filter = {"category": "sustainability"}

# Ähnlichkeitssuche mit Filter
docs = vectorstore.similarity_search(
    query, k=5, filter=filter
)

# Risikofaktoren extrahieren
risk_factors = []
for doc in docs:
    print(f"Quelle: {doc.metadata.get('source', 'Unbekannt')}")
    print(f"Inhalt: {doc.page_content[:200]}...")

Praxistipp: Embedding-Kosten optimieren

  • OpenAI berechnet Kosten pro Token
  • Lokale Modelle (Sentence Transformers) sind kostenlos
  • Embeddings können zwischengespeichert werden
  • Für große Dokumentmengen: Batch-Verarbeitung
# Beispiel: Lokales Embedding-Modell
from langchain.embeddings import HuggingFaceEmbeddings

model_name = "sentence-transformers/all-MiniLM-L6-v2"
embeddings = HuggingFaceEmbeddings(model_name=model_name)

Praxistipp: Vektordatenbank auswählen

Anforderung Empfehlung
Schnelles Prototyping Chroma
Große Dokumentmengen FAISS
Cloud-Lösung Pinecone
Komplexe Abfragen Weaviate
Datenschutz-Bedenken Lokale Lösung (FAISS, Chroma)

Zusammenfassung: Embeddings & Vectorstore

  1. Embeddings wandeln Text in numerische Vektoren um, die semantische Bedeutung erfassen
  2. Vektordatenbanken speichern diese Vektoren und ermöglichen schnelle Ähnlichkeitssuche
  3. Retrieval-Methoden wie Similarity Search und MMR finden relevante Dokumente
  4. Metadaten-Filterung ermöglicht präzise Eingrenzung der Suchergebnisse

Nächste Schritte

  • Übung 1: Embeddings für Finanzdokumente erstellen
  • Übung 2: Vektordatenbank mit Chroma aufbauen
  • Übung 3: Verschiedene Retrieval-Methoden vergleichen

Ressourcen