{
"tool_response": [
{
"type": "text",
"text": "{\n \"success\": true,\n \"doc\": {\n \"id\": 107,\n \"parent_id\": 100,\n \"slug\": \"kontext-aufbau\",\n \"path\": \"\/prozesse\/rag-prozess\/kontext-aufbau\",\n \"title\": \"Kontext-Aufbau\",\n \"description\": \"Siebter Schritt: Gefundene Chunks zu Prompt-Kontext formatieren\",\n \"content\": \"<h2>Prozessschritt: Kontext-Aufbau<\/h2>\\n\\n<h3>Funktion<\/h3>\\n<ul>\\n<li>Suchergebnisse in lesbaren Kontext formatieren<\/li>\\n<li>Quellenangaben für Transparenz hinzufügen<\/li>\\n<li>Token-Limit beachten (max_tokens für LLM)<\/li>\\n<li>Relevanteste Chunks priorisieren<\/li>\\n<\/ul>\\n\\n<h3>Eingabe<\/h3>\\n<ul>\\n<li>Liste von Chunk-Ergebnissen aus Qdrant<\/li>\\n<li>Max-Token-Limit für Kontext<\/li>\\n<\/ul>\\n\\n<h3>Ausgabe<\/h3>\\n<ul>\\n<li>Formatierter Kontext-String<\/li>\\n<li>Quellen-Liste für Anzeige<\/li>\\n<\/ul>\\n\\n<h3>Kontext-Format<\/h3>\\n<pre>\\n[Quelle 1: Coaching-Handbuch.pdf]\\nDie Wichtigkeit einer guten Auftragsklärung kann gar nicht \\nstark genug betont werden. Sie ist außerdem eng damit \\nverknüpft, welche Erwartungen an deine Rolle gestellt werden.\\n\\n---\\n\\n[Quelle 2: Teamentwicklung.pdf]\\nAuftragsklärung erfolgt einerseits zum Start, um irgendwann \\ndann auch zu einem Kontrakt zu kommen.\\n\\n---\\n\\n[Quelle 3: Systemik-Grundlagen.pdf]\\n...\\n<\/pre>\\n\\n<h3>Beteiligte Komponenten<\/h3>\\n<table>\\n<thead><tr><th>Anwendung<\/th><th>Komponente<\/th><th>Funktion<\/th><\/tr><\/thead>\\n<tbody>\\n<tr><td>Chat<\/td><td><code>chat.py:build_context()<\/code><\/td><td>Kontext mit Token-Limit<\/td><\/tr>\\n<tr><td>Content Studio<\/td><td><code>generate.py:build_generation_prompt()<\/code><\/td><td>Kontext in Prompt einbauen<\/td><\/tr>\\n<\/tbody>\\n<\/table>\\n\\n<h3>Ablauf<\/h3>\\n<ol>\\n<li>Chunks nach Score sortieren (höchster zuerst)<\/li>\\n<li>Quellen-Header hinzufügen ([Quelle N: Titel])<\/li>\\n<li>Chunk-Inhalte aneinanderreihen<\/li>\\n<li>Token-Limit prüfen, ggf. abschneiden<\/li>\\n<li>Trennzeichen zwischen Chunks einfügen<\/li>\\n<\/ol>\\n\\n<h3>Code-Beispiel (Chat)<\/h3>\\n<pre>\\ndef build_context(results, max_tokens=3000):\\n context_parts = []\\n total_chars = 0\\n max_chars = max_tokens * 4 # Rough estimate\\n \\n for i, result in enumerate(results):\\n content = result[\\\"payload\\\"].get(\\\"content\\\", \\\"\\\")\\n doc_title = result[\\\"payload\\\"].get(\\\"document_title\\\", \\\"Unbekannt\\\")\\n \\n if total_chars + len(content) > max_chars:\\n break\\n \\n context_parts.append(f\\\"[Quelle {i + 1}: {doc_title}]\\\\n{content}\\\")\\n total_chars += len(content)\\n \\n return \\\"\\\\n\\\\n---\\\\n\\\\n\\\".join(context_parts)\\n<\/pre>\\n\\n<h3>Token-Berechnung<\/h3>\\n<table>\\n<thead><tr><th>Schätzung<\/th><th>Wert<\/th><\/tr><\/thead>\\n<tbody>\\n<tr><td>1 Token ≈<\/td><td>4 Zeichen (Deutsch)<\/td><\/tr>\\n<tr><td>Max Kontext Chat<\/td><td>~3000 Token<\/td><\/tr>\\n<tr><td>Max Kontext Content Studio<\/td><td>~5000 Token<\/td><\/tr>\\n<\/tbody>\\n<\/table>\\n\\n<h3>Quellen-Extraktion<\/h3>\\n<pre>\\ndef get_sources(results):\\n sources = []\\n seen = set()\\n \\n for result in results:\\n doc_title = result[\\\"payload\\\"].get(\\\"document_title\\\", \\\"\\\")\\n if doc_title and doc_title not in seen:\\n sources.append({\\n \\\"title\\\": doc_title, \\n \\\"score\\\": round(result[\\\"score\\\"], 3)\\n })\\n seen.add(doc_title)\\n \\n return sources\\n<\/pre>\",\n \"status\": \"published\",\n \"sort_order\": 7,\n \"depth\": 2,\n \"created_at\": \"2025-12-24T09:44:42\",\n \"updated_at\": \"2025-12-24T09:44:42\"\n }\n}"
}
]
}