{
"tool_response": [
{
"type": "text",
"text": "{\n \"success\": true,\n \"doc\": {\n \"id\": 77,\n \"parent_id\": 34,\n \"slug\": \"rag\",\n \"path\": \"\/content-studio\/rag\",\n \"title\": \"RAG\",\n \"description\": \"RAG-Integration mit Qdrant für kontextuelle Content-Generierung\",\n \"content\": \"<nav class=\\\"breadcrumb\\\">\\n <a href=\\\"\/docs\\\">Dokumentation<\/a> » <a href=\\\"\/docs\/content-studio\\\">Content Studio<\/a> » RAG\\n<\/nav>\\n\\n<h1>RAG<\/h1>\\n<p class=\\\"doc-meta\\\"><strong>Erstellt:<\/strong> 2025-12-20 | <strong>Aktualisiert:<\/strong> 2025-12-20<\/p>\\n\\n<p>Retrieval-Augmented Generation für kontextbasierte Content-Erstellung.<\/p>\\n\\n<table>\\n <tr><th>Modul<\/th><td>generate.py, embed.py<\/td><\/tr>\\n <tr><th>Vektor-DB<\/th><td>Qdrant<\/td><\/tr>\\n <tr><th>Quellen-Tabelle<\/th><td>content_sources<\/td><\/tr>\\n<\/table>\\n\\n<h2>Architektur<\/h2>\\n<pre><code>Briefing\\n ↓\\n┌─────────────┐\\n│ Embedding │ → Vektor aus Briefing\\n└─────────────┘\\n ↓\\n┌─────────────┐\\n│ Qdrant │ → Ähnlichkeitssuche\\n└─────────────┘\\n ↓\\n┌─────────────┐\\n│ Kontext │ → Top-N relevante Chunks\\n└─────────────┘\\n ↓\\n┌─────────────┐\\n│ LLM │ → Content mit Kontext\\n└─────────────┘<\/code><\/pre>\\n\\n<h2>Collections<\/h2>\\n<table>\\n <tr><th>Collection<\/th><th>Inhalt<\/th><th>Verwendung<\/th><\/tr>\\n <tr><td>documents<\/td><td>Dokumente, PDFs<\/td><td>Allgemeine Wissensbasis<\/td><\/tr>\\n <tr><td>entities<\/td><td>Entitäten, Konzepte<\/td><td>Fachbegriffe, Personen<\/td><\/tr>\\n <tr><td>mail<\/td><td>E-Mail-Korrespondenz<\/td><td>Kommunikationshistorie<\/td><\/tr>\\n<\/table>\\n\\n<h2>get_rag_context() - Zeile 18-35<\/h2>\\n<pre><code>def get_rag_context(briefing, collection=\\\"documents\\\", limit=5):\\n \\\"\\\"\\\"\\n Relevanten Kontext aus Qdrant laden.\\n \\n Args:\\n briefing: Suchtext für Ähnlichkeitssuche\\n collection: Qdrant-Collection\\n limit: Anzahl Ergebnisse\\n \\n Returns:\\n List[{content, source, score}]\\n \\\"\\\"\\\"\\n results = search_similar(briefing, collection, limit)\\n \\n return [{\\n \\\"content\\\": r[\\\"payload\\\"][\\\"content\\\"],\\n \\\"source\\\": r[\\\"payload\\\"][\\\"document_title\\\"],\\n \\\"score\\\": round(r[\\\"score\\\"], 4)\\n } for r in results]<\/code><\/pre>\\n\\n<h2>Kontext-Limit<\/h2>\\n<table>\\n <tr><th>Limit<\/th><th>Tokens (~)<\/th><th>Empfehlung<\/th><\/tr>\\n <tr><td>3<\/td><td>~1500<\/td><td>Schnelle Generierung, wenig Kontext<\/td><\/tr>\\n <tr><td>5<\/td><td>~2500<\/td><td>Standard, ausgewogen<\/td><\/tr>\\n <tr><td>10<\/td><td>~5000<\/td><td>Umfangreicher Kontext, langsamer<\/td><\/tr>\\n<\/table>\\n\\n<h2>Prompt-Integration<\/h2>\\n<p>Der RAG-Kontext wird in den Generierungs-Prompt eingebettet:<\/p>\\n<pre><code>## Kontext aus der Wissensbasis:\\n\\n[Quelle 1: Dokument A]\\nLorem ipsum dolor sit amet...\\n\\n[Quelle 2: Dokument B]\\nConsectetur adipiscing elit...\\n\\n## Briefing:\\nSchreibe einen Artikel über...<\/code><\/pre>\\n\\n<h2>Quellen-Speicherung<\/h2>\\n<p>Nach der Generierung werden Quellen in <code>content_sources<\/code> gespeichert:<\/p>\\n<pre><code>def save_sources(order_id, context):\\n for ctx in context:\\n # Chunk-ID via Content-Match finden\\n chunk = db.execute(\\n \\\"SELECT id FROM chunks WHERE content LIKE %s\\\",\\n (ctx[\\\"content\\\"][:100] + \\\"%\\\",)\\n )\\n \\n # Quelle mit Relevanz-Score speichern\\n db.execute(\\n \\\"INSERT INTO content_sources \\n (order_id, chunk_id, relevance_score) \\n VALUES (%s, %s, %s)\\\",\\n (order_id, chunk.id, ctx[\\\"score\\\"])\\n )<\/code><\/pre>\\n\\n<h2>Relevanz-Score<\/h2>\\n<p>Der Score zeigt die semantische Ähnlichkeit (0.0 - 1.0):<\/p>\\n<table>\\n <tr><th>Score<\/th><th>Interpretation<\/th><\/tr>\\n <tr><td>> 0.85<\/td><td>Sehr relevant<\/td><\/tr>\\n <tr><td>0.70 - 0.85<\/td><td>Relevant<\/td><\/tr>\\n <tr><td>0.50 - 0.70<\/td><td>Möglicherweise relevant<\/td><\/tr>\\n <tr><td>< 0.50<\/td><td>Geringe Relevanz<\/td><\/tr>\\n<\/table>\\n\\n<h2>UI-Anzeige<\/h2>\\n<p>Quellen werden in der Version-Ansicht angezeigt:<\/p>\\n<pre><code><div class=\\\"sources\\\">\\n <strong>Quellen:<\/strong>\\n <ul>\\n <li>Dokument A (85%)<\/li>\\n <li>Dokument B (72%)<\/li>\\n <\/ul>\\n<\/div><\/code><\/pre>\\n\\n<h2>Qdrant-Verbindung<\/h2>\\n<p>Die Verbindung wird in <code>embed.py<\/code> konfiguriert:<\/p>\\n<pre><code>from qdrant_client import QdrantClient\\n\\nclient = QdrantClient(host=\\\"localhost\\\", port=6333)<\/code><\/pre>\\n\\n<h2>Verwandte Dokumentation<\/h2>\\n<ul>\\n <li><a href=\\\"\/docs\/ki-system\/qdrant\\\">Qdrant Vektor-Datenbank<\/a><\/li>\\n <li><a href=\\\"\/docs\/ki-system\/pipeline\\\">Pipeline-Übersicht<\/a><\/li>\\n<\/ul>\",\n \"status\": \"published\",\n \"sort_order\": 4,\n \"depth\": 1,\n \"created_at\": \"2025-12-20T13:37:24\",\n \"updated_at\": \"2025-12-27T15:58:19\"\n }\n}"
}
]
}