RAG Ingestion Tools
Lokale Python-Tools zum Importieren von Dokumenten in pgvector-Datenbanken. Drei eigenständige Ingestion-Scripts für unterschiedliche Zieldatenbanken und Anwendungsfälle, plus zwei gemeinsame Module für Extraktion und KI-Normalisierung.
Dateistruktur
rag-ingestion/
├── ingest_V2.py Vollpipeline v2: OCR + KI-Normalisierung (→ Hetzner)
├── ingest_anythingllm.py Einfaches Script v1: nur MD/TXT/PDF (→ Hetzner)
├── ingest_job_matching.py Job-Matching Script: direkt auf NAS (→ NAS Port 5433)
│
├── extractor.py Modul: Text-Extraktion + OCR (wird von ingest_V2 genutzt)
├── normalizer.py Modul: KI-Normalisierung via Claude (wird von ingest_V2 genutzt)
│
├── templates/
│ ├── *_TEMPLATE.md Ziel-Strukturvorlagen (leer)
│ └── ausgefuellt/ Ausgefüllte Referenzbeispiele (Few-Shot für KI, nicht in Git)
│
├── .env.ingest Secrets für ingest_V2.py (nicht in Git)
├── .env.job_matching Secrets für ingest_job_matching.py (nicht in Git)
└── .env.example Vorlage für .env.ingest
Übersicht
| Tool | Zieldatenbank | Verbindung | .env-Datei | Besonderheit |
|---|---|---|---|---|
ingest_V2.py |
Hetzner (anythingllm) | SSH-Tunnel | .env.ingest |
OCR + KI-Normalisierung |
ingest_anythingllm.py |
Hetzner (anythingllm) | SSH-Tunnel | .env.ingest |
Einfach, nur MD/TXT/PDF |
ingest_job_matching.py |
NAS 192.168.178.128 | Direkt (Port 5433) | .env.job_matching |
Job-Matching-Datenbank |
Tool 1: ingest_V2.py — Vollpipeline mit OCR + KI-Normalisierung
Das Haupt-Tool der neuen Generation. Verarbeitet beliebige Dokumente (inkl. Scans und Bilder) und normalisiert sie via Claude KI in die einheitliche Template-Struktur.
Benötigt: extractor.py und normalizer.py im gleichen Verzeichnis.
Unterstützte Formate
.md .txt .pdf .docx .png .jpg .jpeg .tif .tiff .bmp .webp
Voraussetzungen
# System-Tools (einmalig)
brew install tesseract tesseract-lang poppler
# Python-Pakete
pip install -r requirements.txt
# .env.ingest konfigurieren
cp .env.example .env.ingest
nano .env.ingest # ANTHROPIC_API_KEY eintragen
Verwendung
python ingest_V2.py file ~/Downloads/fremdes_cv.pdf
python ingest_V2.py file ~/Desktop/scan.png --dry-run
python ingest_V2.py file ~/templates/ausgefuellt/mein_cv.md --no-normalize
python ingest_V2.py dir ~/Dokumente/bewerbungsunterlagen/ --force
python ingest_V2.py watch ~/Desktop/scan-eingang/
python ingest_V2.py list
python ingest_V2.py delete "fremdes_cv.pdf"
Datenbank verwalten
# Alle importierten Dokumente anzeigen
# Zeigt: Titel, Dokumenttyp, Qualitäts-Score, Format, Anzahl Chunks, Datum
python ingest_V2.py list
# Ausgabe-Beispiel:
# Titel Typ Score Fmt Chunks Datum
# ─────────────────────────────────────────────────────────────────────────────────────────────
# Arbeitszeugnis Sopra Financial Technology... arbeitszeugnis 95% .pdf 3 2026-04-28
# Einzelnes Dokument löschen (alle Chunks)
python ingest_V2.py delete "Arbeitszeugnis Sopra Financial Technology GmbH.pdf"
# Hinweis: Der Titel entspricht exakt dem Dateinamen wie er beim Import verwendet wurde
Flags
| Flag | Beschreibung |
|---|---|
--force |
Bestehende Chunks überschreiben |
--no-normalize |
KI-Normalisierung überspringen |
--dry-run |
Nur extrahieren + normalisieren, nicht in DB speichern |
--quality-min 0.5 |
Mindest-Qualitäts-Score (0.0–1.0, Standard: 0.0) |
KI-Normalisierung (normalizer.py)
- Typ-Erkennung: Claude Haiku (günstig + schnell)
- Transformation: Claude Sonnet
- Fehlende Felder werden mit
[FEHLT]markiert, nie halluziniert - Qualitäts-Score: 0.0–1.0 (Anteil befüllter Pflichtfelder)
Erkannte Typen: arbeitszeugnis, cv, lebenslauf, anschreiben,
projektbeschreibung, karriereziele, technologie, zertifikate,
referenzen, elevatorpitch, rahmenbedingungen, zielstellen
OCR-Pipeline (extractor.py)
pypdfversucht Text zu extrahieren- Weniger als 150 Zeichen → OCR-Fallback via Tesseract (300 DPI)
- Bilder (PNG, JPG etc.) → direkt OCR
Tool 2: ingest_anythingllm.py — Einfaches Ingestion-Script (v1)
Schlankes Tool ohne OCR und ohne KI-Normalisierung. Geeignet für eigene, bereits fertig strukturierte Dokumente (z.B. ausgefüllte Templates).
Unterstützte Formate
.md .txt .pdf
Verwendung
python ingest_anythingllm.py file ~/Dokumente/Lebenslauf.md
python ingest_anythingllm.py file ~/Dokumente/Lebenslauf.md --force
python ingest_anythingllm.py dir ~/Dokumente/bewerbung/
python ingest_anythingllm.py list
Tool 3: ingest_job_matching.py — Job-Matching-Datenbank (NAS)
Importiert Dokumente direkt in die job_matching-Datenbank auf dem lokalen NAS
(192.168.178.128, Port 5433). Kein SSH-Tunnel erforderlich.
Embeddings via OpenAI text-embedding-3-small (kostenpflichtig).
Verwendung
python ingest_job_matching.py file ~/Dokumente/stellenanzeige.pdf
python ingest_job_matching.py dir ~/Dokumente/stellen/
python ingest_job_matching.py list
python ingest_job_matching.py clear "stellenanzeige.pdf"
Gemeinsame Infrastruktur
Embedding-Modelle
| Tool | Modell | Dimensionen | Kosten |
|---|---|---|---|
ingest_V2.py |
multilingual-e5-small (lokal) | 384 | kostenlos |
ingest_anythingllm.py |
multilingual-e5-small (lokal) | 384 | kostenlos |
ingest_job_matching.py |
OpenAI text-embedding-3-small | 1536 | kostenpflichtig |
Umgebungsvariablen
| Datei | Verwendet von | Inhalt |
|---|---|---|
.env.ingest |
ingest_V2.py, ingest_anythingllm.py |
ANTHROPIC_API_KEY, SSH, DB |
.env.job_matching |
ingest_job_matching.py |
OPENAI_API_KEY, NAS-DB |
Setup (komplett, einmalig)
cd ~/Projekte/rag-ingestion
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
brew install tesseract tesseract-lang poppler # nur für ingest_V2.py
cp .env.example .env.ingest
nano .env.ingest # ANTHROPIC_API_KEY + SSH + DB-Zugangsdaten eintragen