Protokoll #12607

ID12607
Zeitstempel2025-12-24 09:52:00.676587
Clientroot
IP145.224.96.190
Modellclaude-sonnet-4-20250514
Statuscompleted
Tokens5,239 (Input: 2,624, Output: 2,615)
Dauer291 ms
Request-Zeit2025-12-24 09:52:00.676587
Response-Zeit2025-12-24 09:52:00.967795

Request

{
    "event": "PreToolUse",
    "tool_name": "mcp__mcp-docs__docs_update",
    "tool_input": {
        "id": 100,
        "content": "<h2>Überblick<\/h2>\n<p>Der RAG-Prozess (Retrieval Augmented Generation) bildet das Herzstück der KI-gestützten Wissensgenerierung. Er besteht aus zwei Phasen:<\/p>\n\n<h3>1. Indexierungsphase (Offline)<\/h3>\n<ul>\n<li><strong>Dokument-Import<\/strong> – PDF\/Text-Dokumente in die Pipeline laden<\/li>\n<li><strong>Chunking<\/strong> – Texte in semantische Einheiten zerlegen<\/li>\n<li><strong>Embedding-Generierung<\/strong> – Vektorrepräsentationen erstellen (Ollama)<\/li>\n<li><strong>Vektorspeicherung<\/strong> – Embeddings in Qdrant speichern<\/li>\n<\/ul>\n\n<h3>2. Abfragephase (Online)<\/h3>\n<ul>\n<li><strong>Anfrage-Embedding<\/strong> – Nutzerfrage in Vektor umwandeln<\/li>\n<li><strong>Ähnlichkeitssuche<\/strong> – Relevante Chunks in Qdrant finden<\/li>\n<li><strong>Kontext-Aufbau<\/strong> – Gefundene Chunks als Kontext formatieren<\/li>\n<li><strong>LLM-Generierung<\/strong> – Antwort mit Claude\/Ollama erzeugen<\/li>\n<\/ul>\n\n<h3>Anwendungsbereiche<\/h3>\n<table>\n<thead><tr><th>Anwendung<\/th><th>Beschreibung<\/th><th>Besonderheiten<\/th><\/tr><\/thead>\n<tbody>\n<tr><td>KI-Chat<\/td><td>Interaktive Wissensfragen<\/td><td>Session-basiert, Konversationshistorie<\/td><\/tr>\n<tr><td>Content Studio<\/td><td>Content-Generierung<\/td><td>Profile, Contracts, Struktur, Kritik-Runden<\/td><\/tr>\n<\/tbody>\n<\/table>\n\n<h3>Technologie-Stack<\/h3>\n<ul>\n<li><strong>Embedding-Modell:<\/strong> mxbai-embed-large (Ollama)<\/li>\n<li><strong>Vektordatenbank:<\/strong> Qdrant (1536 Dimensionen, Cosine-Similarity)<\/li>\n<li><strong>LLM:<\/strong> Claude API (Anthropic) oder lokale Ollama-Modelle<\/li>\n<li><strong>Pipeline:<\/strong> Python-Scripts in <code>\/var\/www\/scripts\/pipeline\/<\/code><\/li>\n<\/ul>\n\n<h3>Datenfluss-Diagramm<\/h3>\n<pre>\n┌─────────────┐     ┌──────────────┐     ┌─────────────┐\n│   Dokument  │────▶│   Chunking   │────▶│  Embedding  │\n└─────────────┘     └──────────────┘     └──────┬──────┘\n                                                │\n                                                ▼\n┌─────────────┐     ┌──────────────┐     ┌─────────────┐\n│   Qdrant    │◀────│   Speichern  │◀────│   Vektor    │\n└──────┬──────┘     └──────────────┘     └─────────────┘\n       │\n       │ (Indexierungsphase abgeschlossen)\n       │\n       ▼\n┌─────────────┐     ┌──────────────┐     ┌─────────────┐\n│   Anfrage   │────▶│  Q-Embedding │────▶│   Suche     │\n└─────────────┘     └──────────────┘     └──────┬──────┘\n                                                │\n                                                ▼\n┌─────────────┐     ┌──────────────┐     ┌─────────────┐\n│   Antwort   │◀────│     LLM      │◀────│   Kontext   │\n└─────────────┘     └──────────────┘     └─────────────┘\n<\/pre>\n\n<hr>\n\n<h2>Prozessschritt 1: Dokument-Import<\/h2>\n\n<h3>Funktion<\/h3>\n<ul>\n<li>PDF- und Text-Dokumente in das System einlesen<\/li>\n<li>Metadaten extrahieren (Titel, Autor, Erstellungsdatum)<\/li>\n<li>Dokumentstruktur erkennen (Überschriften, Absätze)<\/li>\n<li>Speicherung in MariaDB für Verwaltung und Tracking<\/li>\n<\/ul>\n\n<h3>Eingabe<\/h3>\n<ul>\n<li>PDF-Dateien (via Content Pipeline Import)<\/li>\n<li>Text-Dateien<\/li>\n<li>Manuelle Eingabe über Web-UI<\/li>\n<\/ul>\n\n<h3>Ausgabe<\/h3>\n<ul>\n<li>Datensatz in <code>ki_content.documents<\/code><\/li>\n<li>Seitenweise Extraktion in <code>ki_content.document_pages<\/code><\/li>\n<li>Status: <code>pending<\/code> (bereit für Chunking)<\/li>\n<\/ul>\n\n<h3>Beteiligte Komponenten<\/h3>\n<table>\n<thead><tr><th>Komponente<\/th><th>Pfad<\/th><th>Funktion<\/th><\/tr><\/thead>\n<tbody>\n<tr><td>Content Pipeline<\/td><td><code>\/content-pipeline<\/code><\/td><td>Web-UI für Imports<\/td><\/tr>\n<tr><td>import_pdf()<\/td><td><code>pipeline\/import_pipeline.py<\/code><\/td><td>PDF-Extraktion mit pdfplumber<\/td><\/tr>\n<tr><td>documents-Tabelle<\/td><td><code>ki_content.documents<\/code><\/td><td>Dokument-Metadaten<\/td><\/tr>\n<\/tbody>\n<\/table>\n\n<h3>Ablauf<\/h3>\n<ol>\n<li>Datei hochladen oder Pfad angeben<\/li>\n<li>PDF-Text extrahieren (pdfplumber)<\/li>\n<li>Metadaten erfassen (filename, source_path, file_size)<\/li>\n<li>Dokument in DB speichern mit Status <code>pending<\/code><\/li>\n<li>Seiten einzeln in <code>document_pages<\/code> speichern<\/li>\n<\/ol>\n\n<h3>Datenbank-Schema<\/h3>\n<pre>\ndocuments:\n  id, filename, source_path, file_size, \n  page_count, status, created_at\n  \ndocument_pages:\n  id, document_id, page_number, content, \n  metadata, created_at\n<\/pre>\n\n<hr>\n\n<h2>Prozessschritt 2: Chunking<\/h2>\n\n<h3>Funktion<\/h3>\n<ul>\n<li>Lange Texte in kleinere, semantisch sinnvolle Einheiten zerlegen<\/li>\n<li>Überlappung (Overlap) für Kontexterhalt<\/li>\n<li>Heading-Path für Hierarchie-Kontext<\/li>\n<li>Token-Count für Embedding-Limit-Prüfung<\/li>\n<\/ul>\n\n<h3>Eingabe<\/h3>\n<ul>\n<li>Dokument aus <code>documents<\/code>-Tabelle<\/li>\n<li>Extrahierter Text aus <code>document_pages<\/code><\/li>\n<\/ul>\n\n<h3>Ausgabe<\/h3>\n<ul>\n<li>Chunks in <code>ki_content.chunks<\/code><\/li>\n<li>Jeder Chunk: content, chunk_index, token_count, heading_path<\/li>\n<\/ul>\n\n<h3>Parameter<\/h3>\n<table>\n<thead><tr><th>Parameter<\/th><th>Wert<\/th><th>Beschreibung<\/th><\/tr><\/thead>\n<tbody>\n<tr><td>chunk_size<\/td><td>500-800 Token<\/td><td>Zielgröße pro Chunk<\/td><\/tr>\n<tr><td>overlap<\/td><td>50-100 Token<\/td><td>Überlappung zwischen Chunks<\/td><\/tr>\n<tr><td>max_embed_chars<\/td><td>800 Zeichen<\/td><td>Limit für mxbai-embed-large<\/td><\/tr>\n<\/tbody>\n<\/table>\n\n<h3>Beteiligte Komponenten<\/h3>\n<table>\n<thead><tr><th>Komponente<\/th><th>Pfad<\/th><th>Funktion<\/th><\/tr><\/thead>\n<tbody>\n<tr><td>chunk_document()<\/td><td><code>pipeline\/chunk.py<\/code><\/td><td>Chunking-Logik<\/td><\/tr>\n<tr><td>chunks-Tabelle<\/td><td><code>ki_content.chunks<\/code><\/td><td>Chunk-Speicherung<\/td><\/tr>\n<\/tbody>\n<\/table>\n\n<h3>Ablauf<\/h3>\n<ol>\n<li>Text aus Dokument laden<\/li>\n<li>Überschriften-Hierarchie erkennen<\/li>\n<li>Text an semantischen Grenzen splitten (Absätze, Sätze)<\/li>\n<li>Chunks mit Overlap erstellen<\/li>\n<li>Token-Count berechnen<\/li>\n<li>Heading-Path für jeden Chunk speichern<\/li>\n<li>Chunks in DB mit Status <code>pending<\/code> (bereit für Embedding)<\/li>\n<\/ol>\n\n<h3>Datenbank-Schema<\/h3>\n<pre>\nchunks:\n  id, document_id, chunk_index, content,\n  token_count, heading_path, metadata,\n  qdrant_id, created_at\n<\/pre>\n\n<h3>Beispiel<\/h3>\n<pre>\nDokument: \"Systemisches Coaching.pdf\"\nSeite 5, Abschnitt \"Auftragsklärung\"\n\n→ Chunk 1: \"Die Wichtigkeit einer guten Auftragsklärung...\"\n  heading_path: [\"Kapitel 2\", \"Auftragsklärung\"]\n  token_count: 423\n  chunk_index: 0\n\n→ Chunk 2: \"Auftragsklärung erfolgt einerseits zum Start...\"\n  heading_path: [\"Kapitel 2\", \"Auftragsklärung\"]\n  token_count: 387\n  chunk_index: 1\n<\/pre>\n\n<hr>\n\n<h2>Prozessschritt 3: Embedding-Generierung<\/h2>\n\n<h3>Funktion<\/h3>\n<ul>\n<li>Text-Chunks in numerische Vektorrepräsentationen umwandeln<\/li>\n<li>Semantische Bedeutung in 1536-dimensionalem Vektor kodieren<\/li>\n<li>Ermöglicht Ähnlichkeitssuche via Cosine-Similarity<\/li>\n<\/ul>\n\n<h3>Eingabe<\/h3>\n<ul>\n<li>Chunk-Text aus <code>chunks<\/code>-Tabelle<\/li>\n<li>Maximal 800 Zeichen pro Chunk (Modell-Limit)<\/li>\n<\/ul>\n\n<h3>Ausgabe<\/h3>\n<ul>\n<li>Vektor mit 1536 Float-Werten<\/li>\n<li>Normalisiert für Cosine-Similarity<\/li>\n<\/ul>\n\n<h3>Embedding-Modell<\/h3>\n<table>\n<thead><tr><th>Eigenschaft<\/th><th>Wert<\/th><\/tr><\/thead>\n<tbody>\n<tr><td>Modell<\/td><td>mxbai-embed-large<\/td><\/tr>\n<tr><td>Anbieter<\/td><td>Ollama (lokal)<\/td><\/tr>\n<tr><td>Dimensionen<\/td><td>1536<\/td><\/tr>\n<tr><td>Max Context<\/td><td>512 Token (~800 Zeichen)<\/td><\/tr>\n<tr><td>Sprachen<\/td><td>Multilingual (inkl. Deutsch)<\/td><\/tr>\n<\/tbody>\n<\/table>\n\n<h3>Beteiligte Komponenten<\/h3>\n<table>\n<thead><tr><th>Komponente<\/th><th>Pfad<\/th><th>Funktion<\/th><\/tr><\/thead>\n<tbody>\n<tr><td>get_embedding()<\/td><td><code>pipeline\/embed.py:20<\/code><\/td><td>Embedding via Ollama API<\/td><\/tr>\n<tr><td>Ollama API<\/td><td><code>localhost:11434<\/code><\/td><td>Lokaler Embedding-Service<\/td><\/tr>\n<tr><td>config.py<\/td><td><code>pipeline\/config.py<\/code><\/td><td>EMBEDDING_MODEL, EMBEDDING_DIMENSION<\/td><\/tr>\n<\/tbody>\n<\/table>\n\n<h3>Ablauf<\/h3>\n<ol>\n<li>Chunk-Text laden<\/li>\n<li>Text bereinigen (Punktfolgen reduzieren)<\/li>\n<li>Auf 800 Zeichen truncaten falls nötig<\/li>\n<li>POST an Ollama <code>\/api\/embeddings<\/code><\/li>\n<li>Vektor aus Response extrahieren<\/li>\n<li>Weiter an Vektorspeicherung<\/li>\n<\/ol>\n\n<h3>Code-Beispiel<\/h3>\n<pre>\n# pipeline\/embed.py\ndef get_embedding(text):\n    response = requests.post(\n        f\"{OLLAMA_HOST}\/api\/embeddings\",\n        json={\"model\": EMBEDDING_MODEL, \"prompt\": text},\n        timeout=60\n    )\n    return response.json().get(\"embedding\")\n<\/pre>\n\n<h3>Fehlerbehandlung<\/h3>\n<ul>\n<li>Leerer Text → None zurückgeben, überspringen<\/li>\n<li>Timeout → Logging, Retry<\/li>\n<li>Ollama nicht erreichbar → Fehler loggen, Chunk als pending belassen<\/li>\n<\/ul>\n\n<hr>\n\n<h2>Prozessschritt 4: Vektorspeicherung<\/h2>\n\n<h3>Funktion<\/h3>\n<ul>\n<li>Embedding-Vektoren in Qdrant persistieren<\/li>\n<li>Payload mit Metadaten speichern (chunk_id, document_id, content)<\/li>\n<li>Collection-basierte Organisation (documents, system-docs, etc.)<\/li>\n<li>UUID als Point-ID für eindeutige Referenzierung<\/li>\n<\/ul>\n\n<h3>Eingabe<\/h3>\n<ul>\n<li>Embedding-Vektor (1536 Floats)<\/li>\n<li>Chunk-Metadaten (chunk_id, document_id, document_title, content)<\/li>\n<li>Ziel-Collection (documents, system-docs)<\/li>\n<\/ul>\n\n<h3>Ausgabe<\/h3>\n<ul>\n<li>Point in Qdrant Collection gespeichert<\/li>\n<li>qdrant_id in <code>chunks<\/code>-Tabelle aktualisiert<\/li>\n<\/ul>\n\n<h3>Qdrant-Konfiguration<\/h3>\n<table>\n<thead><tr><th>Eigenschaft<\/th><th>Wert<\/th><\/tr><\/thead>\n<tbody>\n<tr><td>Host<\/td><td>localhost:6333<\/td><\/tr>\n<tr><td>Dimensionen<\/td><td>1536<\/td><\/tr>\n<tr><td>Distance Metric<\/td><td>Cosine<\/td><\/tr>\n<tr><td>Collections<\/td><td>documents, system-docs<\/td><\/tr>\n<\/tbody>\n<\/table>\n\n<h3>Payload-Struktur<\/h3>\n<pre>\n{\n  \"document_id\": 42,\n  \"document_title\": \"Systemisches Coaching.pdf\",\n  \"chunk_id\": 1234,\n  \"content\": \"Die Wichtigkeit einer guten Auftragsklärung...\",\n  \"source_path\": \"\/data\/documents\/coaching.pdf\"\n}\n<\/pre>\n\n<h3>Beteiligte Komponenten<\/h3>\n<table>\n<thead><tr><th>Komponente<\/th><th>Pfad<\/th><th>Fun... [TRUNCATED-15088e91113a4a12]"
    }
}

Response

{
    "tool_response": [
        {
            "type": "text",
            "text": "{\n  \"success\": true,\n  \"doc\": {\n    \"id\": 100,\n    \"parent_id\": 91,\n    \"slug\": \"rag-prozess\",\n    \"path\": \"\/prozesse\/rag-prozess\",\n    \"title\": \"RAG-Prozess\",\n    \"description\": \"Dokumentation des gesamten RAG-Prozesses (Retrieval Augmented Generation) für Chat und Content Studio\",\n    \"content\": \"<h2>Überblick<\/h2>\\n<p>Der RAG-Prozess (Retrieval Augmented Generation) bildet das Herzstück der KI-gestützten Wissensgenerierung. Er besteht aus zwei Phasen:<\/p>\\n\\n<h3>1. Indexierungsphase (Offline)<\/h3>\\n<ul>\\n<li><strong>Dokument-Import<\/strong> – PDF\/Text-Dokumente in die Pipeline laden<\/li>\\n<li><strong>Chunking<\/strong> – Texte in semantische Einheiten zerlegen<\/li>\\n<li><strong>Embedding-Generierung<\/strong> – Vektorrepräsentationen erstellen (Ollama)<\/li>\\n<li><strong>Vektorspeicherung<\/strong> – Embeddings in Qdrant speichern<\/li>\\n<\/ul>\\n\\n<h3>2. Abfragephase (Online)<\/h3>\\n<ul>\\n<li><strong>Anfrage-Embedding<\/strong> – Nutzerfrage in Vektor umwandeln<\/li>\\n<li><strong>Ähnlichkeitssuche<\/strong> – Relevante Chunks in Qdrant finden<\/li>\\n<li><strong>Kontext-Aufbau<\/strong> – Gefundene Chunks als Kontext formatieren<\/li>\\n<li><strong>LLM-Generierung<\/strong> – Antwort mit Claude\/Ollama erzeugen<\/li>\\n<\/ul>\\n\\n<h3>Anwendungsbereiche<\/h3>\\n<table>\\n<thead><tr><th>Anwendung<\/th><th>Beschreibung<\/th><th>Besonderheiten<\/th><\/tr><\/thead>\\n<tbody>\\n<tr><td>KI-Chat<\/td><td>Interaktive Wissensfragen<\/td><td>Session-basiert, Konversationshistorie<\/td><\/tr>\\n<tr><td>Content Studio<\/td><td>Content-Generierung<\/td><td>Profile, Contracts, Struktur, Kritik-Runden<\/td><\/tr>\\n<\/tbody>\\n<\/table>\\n\\n<h3>Technologie-Stack<\/h3>\\n<ul>\\n<li><strong>Embedding-Modell:<\/strong> mxbai-embed-large (Ollama)<\/li>\\n<li><strong>Vektordatenbank:<\/strong> Qdrant (1536 Dimensionen, Cosine-Similarity)<\/li>\\n<li><strong>LLM:<\/strong> Claude API (Anthropic) oder lokale Ollama-Modelle<\/li>\\n<li><strong>Pipeline:<\/strong> Python-Scripts in <code>\/var\/www\/scripts\/pipeline\/<\/code><\/li>\\n<\/ul>\\n\\n<h3>Datenfluss-Diagramm<\/h3>\\n<pre>\\n┌─────────────┐     ┌──────────────┐     ┌─────────────┐\\n│   Dokument  │────▶│   Chunking   │────▶│  Embedding  │\\n└─────────────┘     └──────────────┘     └──────┬──────┘\\n                                                │\\n                                                ▼\\n┌─────────────┐     ┌──────────────┐     ┌─────────────┐\\n│   Qdrant    │◀────│   Speichern  │◀────│   Vektor    │\\n└──────┬──────┘     └──────────────┘     └─────────────┘\\n       │\\n       │ (Indexierungsphase abgeschlossen)\\n       │\\n       ▼\\n┌─────────────┐     ┌──────────────┐     ┌─────────────┐\\n│   Anfrage   │────▶│  Q-Embedding │────▶│   Suche     │\\n└─────────────┘     └──────────────┘     └──────┬──────┘\\n                                                │\\n                                                ▼\\n┌─────────────┐     ┌──────────────┐     ┌─────────────┐\\n│   Antwort   │◀────│     LLM      │◀────│   Kontext   │\\n└─────────────┘     └──────────────┘     └─────────────┘\\n<\/pre>\\n\\n<hr>\\n\\n<h2>Prozessschritt 1: Dokument-Import<\/h2>\\n\\n<h3>Funktion<\/h3>\\n<ul>\\n<li>PDF- und Text-Dokumente in das System einlesen<\/li>\\n<li>Metadaten extrahieren (Titel, Autor, Erstellungsdatum)<\/li>\\n<li>Dokumentstruktur erkennen (Überschriften, Absätze)<\/li>\\n<li>Speicherung in MariaDB für Verwaltung und Tracking<\/li>\\n<\/ul>\\n\\n<h3>Eingabe<\/h3>\\n<ul>\\n<li>PDF-Dateien (via Content Pipeline Import)<\/li>\\n<li>Text-Dateien<\/li>\\n<li>Manuelle Eingabe über Web-UI<\/li>\\n<\/ul>\\n\\n<h3>Ausgabe<\/h3>\\n<ul>\\n<li>Datensatz in <code>ki_content.documents<\/code><\/li>\\n<li>Seitenweise Extraktion in <code>ki_content.document_pages<\/code><\/li>\\n<li>Status: <code>pending<\/code> (bereit für Chunking)<\/li>\\n<\/ul>\\n\\n<h3>Beteiligte Komponenten<\/h3>\\n<table>\\n<thead><tr><th>Komponente<\/th><th>Pfad<\/th><th>Funktion<\/th><\/tr><\/thead>\\n<tbody>\\n<tr><td>Content Pipeline<\/td><td><code>\/content-pipeline<\/code><\/td><td>Web-UI für Imports<\/td><\/tr>\\n<tr><td>import_pdf()<\/td><td><code>pipeline\/import_pipeline.py<\/code><\/td><td>PDF-Extraktion mit pdfplumber<\/td><\/tr>\\n<tr><td>documents-Tabelle<\/td><td><code>ki_content.documents<\/code><\/td><td>Dokument-Metadaten<\/td><\/tr>\\n<\/tbody>\\n<\/table>\\n\\n<h3>Ablauf<\/h3>\\n<ol>\\n<li>Datei hochladen oder Pfad angeben<\/li>\\n<li>PDF-Text extrahieren (pdfplumber)<\/li>\\n<li>Metadaten erfassen (filename, source_path, file_size)<\/li>\\n<li>Dokument in DB speichern mit Status <code>pending<\/code><\/li>\\n<li>Seiten einzeln in <code>document_pages<\/code> speichern<\/li>\\n<\/ol>\\n\\n<h3>Datenbank-Schema<\/h3>\\n<pre>\\ndocuments:\\n  id, filename, source_path, file_size, \\n  page_count, status, created_at\\n  \\ndocument_pages:\\n  id, document_id, page_number, content, \\n  metadata, created_at\\n<\/pre>\\n\\n<hr>\\n\\n<h2>Prozessschritt 2: Chunking<\/h2>\\n\\n<h3>Funktion<\/h3>\\n<ul>\\n<li>Lange Texte in kleinere, semantisch sinnvolle Einheiten zerlegen<\/li>\\n<li>Überlappung (Overlap) für Kontexterhalt<\/li>\\n<li>Heading-Path für Hierarchie-Kontext<\/li>\\n<li>Token-Count für Embedding-Limit-Prüfung<\/li>\\n<\/ul>\\n\\n<h3>Eingabe<\/h3>\\n<ul>\\n<li>Dokument aus <code>documents<\/code>-Tabelle<\/li>\\n<li>Extrahierter Text aus <code>document_pages<\/code><\/li>\\n<\/ul>\\n\\n<h3>Ausgabe<\/h3>\\n<ul>\\n<li>Chunks in <code>ki_content.chunks<\/code><\/li>\\n<li>Jeder Chunk: content, chunk_index, token_count, heading_path<\/li>\\n<\/ul>\\n\\n<h3>Parameter<\/h3>\\n<table>\\n<thead><tr><th>Parameter<\/th><th>Wert<\/th><th>Beschreibung<\/th><\/tr><\/thead>\\n<tbody>\\n<tr><td>chunk_size<\/td><td>500-800 Token<\/td><td>Zielgröße pro Chunk<\/td><\/tr>\\n<tr><td>overlap<\/td><td>50-100 Token<\/td><td>Überlappung zwischen Chunks<\/td><\/tr>\\n<tr><td>max_embed_chars<\/td><td>800 Zeichen<\/td><td>Limit für mxbai-embed-large<\/td><\/tr>\\n<\/tbody>\\n<\/table>\\n\\n<h3>Beteiligte Komponenten<\/h3>\\n<table>\\n<thead><tr><th>Komponente<\/th><th>Pfad<\/th><th>Funktion<\/th><\/tr><\/thead>\\n<tbody>\\n<tr><td>chunk_document()<\/td><td><code>pipeline\/chunk.py<\/code><\/td><td>Chunking-Logik<\/td><\/tr>\\n<tr><td>chunks-Tabelle<\/td><td><code>ki_content.chunks<\/code><\/td><td>Chunk-Speicherung<\/td><\/tr>\\n<\/tbody>\\n<\/table>\\n\\n<h3>Ablauf<\/h3>\\n<ol>\\n<li>Text aus Dokument laden<\/li>\\n<li>Überschriften-Hierarchie erkennen<\/li>\\n<li>Text an semantischen Grenzen splitten (Absätze, Sätze)<\/li>\\n<li>Chunks mit Overlap erstellen<\/li>\\n<li>Token-Count berechnen<\/li>\\n<li>Heading-Path für jeden Chunk speichern<\/li>\\n<li>Chunks in DB mit Status <code>pending<\/code> (bereit für Embedding)<\/li>\\n<\/ol>\\n\\n<h3>Datenbank-Schema<\/h3>\\n<pre>\\nchunks:\\n  id, document_id, chunk_index, content,\\n  token_count, heading_path, metadata,\\n  qdrant_id, created_at\\n<\/pre>\\n\\n<h3>Beispiel<\/h3>\\n<pre>\\nDokument: \\\"Systemisches Coaching.pdf\\\"\\nSeite 5, Abschnitt \\\"Auftragsklärung\\\"\\n\\n→ Chunk 1: \\\"Die Wichtigkeit einer guten Auftragsklärung...\\\"\\n  heading_path: [\\\"Kapitel 2\\\", \\\"Auftragsklärung\\\"]\\n  token_count: 423\\n  chunk_index: 0\\n\\n→ Chunk 2: \\\"Auftragsklärung erfolgt einerseits zum Start...\\\"\\n  heading_path: [\\\"Kapitel 2\\\", \\\"Auftragsklärung\\\"]\\n  token_count: 387\\n  chunk_index: 1\\n<\/pre>\\n\\n<hr>\\n\\n<h2>Prozessschritt 3: Embedding-Generierung<\/h2>\\n\\n<h3>Funktion<\/h3>\\n<ul>\\n<li>Text-Chunks in numerische Vektorrepräsentationen umwandeln<\/li>\\n<li>Semantische Bedeutung in 1536-dimensionalem Vektor kodieren<\/li>\\n<li>Ermöglicht Ähnlichkeitssuche via Cosine-Similarity<\/li>\\n<\/ul>\\n\\n<h3>Eingabe<\/h3>\\n<ul>\\n<li>Chunk-Text aus <code>chunks<\/code>-Tabelle<\/li>\\n<li>Maximal 800 Zeichen pro Chunk (Modell-Limit)<\/li>\\n<\/ul>\\n\\n<h3>Ausgabe<\/h3>\\n<ul>\\n<li>Vektor mit 1536 Float-Werten<\/li>\\n<li>Normalisiert für Cosine-Similarity<\/li>\\n<\/ul>\\n\\n<h3>Embedding-Modell<\/h3>\\n<table>\\n<thead><tr><th>Eigenschaft<\/th><th>Wert<\/th><\/tr><\/thead>\\n<tbody>\\n<tr><td>Modell<\/td><td>mxbai-embed-large<\/td><\/tr>\\n<tr><td>Anbieter<\/td><td>Ollama (lokal)<\/td><\/tr>\\n<tr><td>Dimensionen<\/td><td>1536<\/td><\/tr>\\n<tr><td>Max Context<\/td><td>512 Token (~800 Zeichen)<\/td><\/tr>\\n<tr><td>Sprachen<\/td><td>Multilingual (inkl. Deutsch)<\/td><\/tr>\\n<\/tbody>\\n<\/table>\\n\\n<h3>Beteiligte Komponenten<\/h3>\\n<table>\\n<thead><tr><th>Komponente<\/th><th>Pfad<\/th><th>Funktion<\/th><\/tr><\/thead>\\n<tbody>\\n<tr><td>get_embedding()<\/td><td><code>pipeline\/embed.py:20<\/code><\/td><td>Embedding via Ollama API<\/td><\/tr>\\n<tr><td>Ollama API<\/td><td><code>localhost:11434<\/code><\/td><td>Lokaler Embedding-Service<\/td><\/tr>\\n<tr><td>config.py<\/td><td><code>pipeline\/config.py<\/code><\/td><td>EMBEDDING_MODEL, EMBEDDING_DIMENSION<\/td><\/tr>\\n<\/tbody>\\n<\/table>\\n\\n<h3>Ablauf<\/h3>\\n<ol>\\n<li>Chunk-Text laden<\/li>\\n<li>Text bereinigen (Punktfolgen reduzieren)<\/li>\\n<li>Auf 800 Zeichen truncaten falls nötig<\/li>\\n<li>POST an Ollama <code>\/api\/embeddings<\/code><\/li>\\n<li>Vektor aus Response extrahieren<\/li>\\n<li>Weiter an Vektorspeicherung<\/li>\\n<\/ol>\\n\\n<h3>Code-Beispiel<\/h3>\\n<pre>\\n# pipeline\/embed.py\\ndef get_embedding(text):\\n    response = requests.post(\\n        f\\\"{OLLAMA_HOST}\/api\/embeddings\\\",\\n        json={\\\"model\\\": EMBEDDING_MODEL, \\\"prompt\\\": text},\\n        timeout=60\\n    )\\n    return response.json().get(\\\"embedding\\\")\\n<\/pre>\\n\\n<h3>Fehlerbehandlung<\/h3>\\n<ul>\\n<li>Leerer Text → None zurückgeben, überspringen<\/li>\\n<li>Timeout → Logging, Retry<\/li>\\n<li>Ollama nicht erreichbar → Fehler loggen, Chunk als pending belassen<\/li>\\n<\/ul>\\n\\n<hr>\\n\\n<h2>Prozessschritt 4: Vektorspeicherung<\/h2>\\n\\n<h3>Funktion<\/h3>\\n<ul>\\n<li>Embedding-Vektoren in Qdrant persistieren<\/li>\\n<li>Payload mit Metadaten speichern (chunk_id, document_id, content)<\/li>\\n<li>Collection-basierte Organisation (documents, system-docs, etc.)<\/li>\\n<li>UUID als Point-ID für eindeutige Referenzierung<\/li>\\n<\/ul>\\n\\n<h3>Eingabe<\/h3>\\n<ul>\\n<li>Embedding-Vektor (1536 Floats)<\/li>\\n<li>Chunk-Metadaten (chunk_id, document_id, document_title, content)<\/li>\\n<li>Ziel-Collection (documents, system-docs)<\/li>\\n<\/ul>\\n\\n<h3>Ausgabe<\/h3>\\n<ul>\\n<li>Point in Qdrant Collection gespeichert<\/li>\\n<li>qdrant_id in <code>chunks<\/code>-Tabelle aktualisiert<\/li>\\n<\/ul>\\n\\n<h3>Qdrant-Konfiguration<\/h3>\\n<table>\\n... [TRUNCATED-00e54b94fb335b6d]"
        }
    ]
}
← Vorheriger Zur Liste Nächster →