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¶
- ✅ Dokumentenladung: Einlesen verschiedener Dokumenttypen
- ✅ Dokumentenaufteilung: Zerlegung in handhabbare Chunks
- 👉 Vektorisierung: Umwandlung von Text in numerische Repräsentationen
- 👉 Speicherung: Ablage in einer Vektordatenbank
- 👉 Retrieval: Abrufen relevanter Dokumente
- 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()
FAISS: Facebook AI Similarity Search¶
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¶
- Embeddings wandeln Text in numerische Vektoren um, die semantische Bedeutung erfassen
- Vektordatenbanken speichern diese Vektoren und ermöglichen schnelle Ähnlichkeitssuche
- Retrieval-Methoden wie Similarity Search und MMR finden relevante Dokumente
- 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