2026-04-28 11:21:53 +02:00
|
|
|
|
# RAG Ingestion Tools
|
2026-02-27 10:59:36 +01:00
|
|
|
|
|
2026-04-28 11:21:53 +02:00
|
|
|
|
Lokale Python-Tools zum Importieren von Dokumenten in pgvector-Datenbanken.
|
2026-04-29 10:19:18 +02:00
|
|
|
|
Drei eigenständige Ingestion-Scripts für unterschiedliche Zieldatenbanken und
|
|
|
|
|
|
Anwendungsfälle, plus zwei gemeinsame Module für Extraktion und KI-Normalisierung.
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Dateistruktur
|
|
|
|
|
|
|
2026-04-29 10:24:59 +02:00
|
|
|
|
```
|
2026-04-29 10:19:18 +02:00
|
|
|
|
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
|
2026-04-29 10:24:59 +02:00
|
|
|
|
```
|
2026-02-27 10:59:36 +01:00
|
|
|
|
|
2026-04-28 11:21:53 +02:00
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Übersicht
|
|
|
|
|
|
|
2026-04-29 10:19:18 +02:00
|
|
|
|
| Tool | Zieldatenbank | Verbindung | .env-Datei | Besonderheit |
|
|
|
|
|
|
|---|---|---|---|---|
|
2026-04-29 10:24:59 +02:00
|
|
|
|
| `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 |
|
2026-04-28 11:21:53 +02:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-04-29 10:24:59 +02:00
|
|
|
|
## Tool 1: `ingest_V2.py` — Vollpipeline mit OCR + KI-Normalisierung
|
2026-04-28 11:21:53 +02:00
|
|
|
|
|
|
|
|
|
|
Das Haupt-Tool der neuen Generation. Verarbeitet beliebige Dokumente (inkl. Scans
|
|
|
|
|
|
und Bilder) und normalisiert sie via Claude KI in die einheitliche Template-Struktur.
|
|
|
|
|
|
|
2026-04-29 10:24:59 +02:00
|
|
|
|
**Benötigt:** `extractor.py` und `normalizer.py` im gleichen Verzeichnis.
|
2026-04-28 11:21:53 +02:00
|
|
|
|
|
|
|
|
|
|
### Unterstützte Formate
|
|
|
|
|
|
|
2026-04-29 10:24:59 +02:00
|
|
|
|
`.md` `.txt` `.pdf` `.docx` `.png` `.jpg` `.jpeg` `.tif` `.tiff` `.bmp` `.webp`
|
2026-04-28 11:21:53 +02:00
|
|
|
|
|
|
|
|
|
|
### Voraussetzungen
|
|
|
|
|
|
|
2026-04-29 10:24:59 +02:00
|
|
|
|
```bash
|
2026-04-29 10:19:18 +02:00
|
|
|
|
# System-Tools (einmalig)
|
|
|
|
|
|
brew install tesseract tesseract-lang poppler
|
2026-04-28 11:21:53 +02:00
|
|
|
|
|
|
|
|
|
|
# Python-Pakete
|
|
|
|
|
|
pip install -r requirements.txt
|
|
|
|
|
|
|
2026-04-29 10:19:18 +02:00
|
|
|
|
# .env.ingest konfigurieren
|
|
|
|
|
|
cp .env.example .env.ingest
|
|
|
|
|
|
nano .env.ingest # ANTHROPIC_API_KEY eintragen
|
2026-04-29 10:24:59 +02:00
|
|
|
|
```
|
2026-04-28 11:21:53 +02:00
|
|
|
|
|
|
|
|
|
|
### Verwendung
|
|
|
|
|
|
|
2026-04-29 10:24:59 +02:00
|
|
|
|
```bash
|
2026-04-29 10:19:18 +02:00
|
|
|
|
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"
|
2026-04-29 10:24:59 +02:00
|
|
|
|
```
|
2026-04-28 11:21:53 +02:00
|
|
|
|
|
|
|
|
|
|
### Flags
|
|
|
|
|
|
|
|
|
|
|
|
| Flag | Beschreibung |
|
|
|
|
|
|
|---|---|
|
2026-04-29 10:24:59 +02:00
|
|
|
|
| `--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) |
|
2026-04-28 11:21:53 +02:00
|
|
|
|
|
2026-04-29 10:24:59 +02:00
|
|
|
|
### KI-Normalisierung (`normalizer.py`)
|
2026-04-28 11:21:53 +02:00
|
|
|
|
|
2026-04-29 10:19:18 +02:00
|
|
|
|
- **Typ-Erkennung:** Claude Haiku (günstig + schnell)
|
|
|
|
|
|
- **Transformation:** Claude Sonnet
|
2026-04-29 10:24:59 +02:00
|
|
|
|
- **Fehlende Felder** werden mit `[FEHLT]` markiert, nie halluziniert
|
2026-04-29 10:19:18 +02:00
|
|
|
|
- **Qualitäts-Score:** 0.0–1.0 (Anteil befüllter Pflichtfelder)
|
2026-04-28 11:21:53 +02:00
|
|
|
|
|
2026-04-29 10:24:59 +02:00
|
|
|
|
Erkannte Typen: `arbeitszeugnis`, `cv`, `lebenslauf`, `anschreiben`,
|
|
|
|
|
|
`projektbeschreibung`, `karriereziele`, `technologie`, `zertifikate`,
|
|
|
|
|
|
`referenzen`, `elevatorpitch`, `rahmenbedingungen`, `zielstellen`
|
2026-04-29 10:19:18 +02:00
|
|
|
|
|
2026-04-29 10:24:59 +02:00
|
|
|
|
### OCR-Pipeline (`extractor.py`)
|
2026-04-29 10:19:18 +02:00
|
|
|
|
|
2026-04-29 10:24:59 +02:00
|
|
|
|
1. `pypdf` versucht Text zu extrahieren
|
2026-04-29 10:19:18 +02:00
|
|
|
|
2. Weniger als 150 Zeichen → OCR-Fallback via Tesseract (300 DPI)
|
|
|
|
|
|
3. Bilder (PNG, JPG etc.) → direkt OCR
|
2026-04-28 11:21:53 +02:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-04-29 10:24:59 +02:00
|
|
|
|
## Tool 2: `ingest_anythingllm.py` — Einfaches Ingestion-Script (v1)
|
2026-04-28 11:21:53 +02:00
|
|
|
|
|
2026-04-29 10:19:18 +02:00
|
|
|
|
Schlankes Tool ohne OCR und ohne KI-Normalisierung. Geeignet für eigene,
|
|
|
|
|
|
bereits fertig strukturierte Dokumente (z.B. ausgefüllte Templates).
|
2026-04-28 11:21:53 +02:00
|
|
|
|
|
|
|
|
|
|
### Unterstützte Formate
|
|
|
|
|
|
|
2026-04-29 10:24:59 +02:00
|
|
|
|
`.md` `.txt` `.pdf`
|
2026-04-28 11:21:53 +02:00
|
|
|
|
|
|
|
|
|
|
### Verwendung
|
|
|
|
|
|
|
2026-04-29 10:24:59 +02:00
|
|
|
|
```bash
|
2026-04-28 11:21:53 +02:00
|
|
|
|
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
|
2026-04-29 10:24:59 +02:00
|
|
|
|
```
|
2026-04-28 11:21:53 +02:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-04-29 10:24:59 +02:00
|
|
|
|
## Tool 3: `ingest_job_matching.py` — Job-Matching-Datenbank (NAS)
|
2026-04-28 11:21:53 +02:00
|
|
|
|
|
2026-04-29 10:24:59 +02:00
|
|
|
|
Importiert Dokumente direkt in die `job_matching`-Datenbank auf dem lokalen NAS
|
2026-04-28 11:21:53 +02:00
|
|
|
|
(192.168.178.128, Port 5433). Kein SSH-Tunnel erforderlich.
|
|
|
|
|
|
|
2026-04-29 10:24:59 +02:00
|
|
|
|
Embeddings via OpenAI `text-embedding-3-small` (kostenpflichtig).
|
2026-04-28 11:21:53 +02:00
|
|
|
|
|
|
|
|
|
|
### Verwendung
|
|
|
|
|
|
|
2026-04-29 10:24:59 +02:00
|
|
|
|
```bash
|
2026-04-28 11:21:53 +02:00
|
|
|
|
python ingest_job_matching.py file ~/Dokumente/stellenanzeige.pdf
|
|
|
|
|
|
python ingest_job_matching.py dir ~/Dokumente/stellen/
|
|
|
|
|
|
python ingest_job_matching.py list
|
2026-04-29 10:19:18 +02:00
|
|
|
|
python ingest_job_matching.py clear "stellenanzeige.pdf"
|
2026-04-29 10:24:59 +02:00
|
|
|
|
```
|
2026-04-28 11:21:53 +02:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Gemeinsame Infrastruktur
|
|
|
|
|
|
|
2026-04-29 10:19:18 +02:00
|
|
|
|
### Embedding-Modelle
|
2026-04-28 11:21:53 +02:00
|
|
|
|
|
2026-04-29 10:19:18 +02:00
|
|
|
|
| Tool | Modell | Dimensionen | Kosten |
|
|
|
|
|
|
|---|---|---|---|
|
2026-04-29 10:24:59 +02:00
|
|
|
|
| `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 |
|
2026-04-28 11:21:53 +02:00
|
|
|
|
|
|
|
|
|
|
### Umgebungsvariablen
|
|
|
|
|
|
|
2026-04-29 10:19:18 +02:00
|
|
|
|
| Datei | Verwendet von | Inhalt |
|
|
|
|
|
|
|---|---|---|
|
2026-04-29 10:24:59 +02:00
|
|
|
|
| `.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 |
|
2026-04-28 11:21:53 +02:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Setup (komplett, einmalig)
|
2026-02-27 10:59:36 +01:00
|
|
|
|
|
2026-04-29 10:24:59 +02:00
|
|
|
|
```bash
|
2026-02-27 10:59:36 +01:00
|
|
|
|
cd ~/Projekte/rag-ingestion
|
|
|
|
|
|
python3 -m venv venv
|
|
|
|
|
|
source venv/bin/activate
|
|
|
|
|
|
pip install -r requirements.txt
|
2026-04-29 10:19:18 +02:00
|
|
|
|
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
|
2026-04-29 10:24:59 +02:00
|
|
|
|
```
|