Chatbot entwickeln mit Claude Code: Von 0 zu Production 2026
Ein Chatbot der wirklich funktioniert braucht mehr als einen API-Call: Kontext-Management, Persönlichkeit, Tool Use, RAG für firmenspezifisches Wissen — und eine UI die Nutzer nicht frustriert. Claude Code baut das alles.
Chatbot-Architektur: Die Entscheidungen die zählen
- Kontext-Strategie: Wie viel Chat-History mitschicken? Token-Budget balancieren — zu wenig bedeutet Gedächtnisverlust, zu viel bedeutet hohe Kosten.
- Persönlichkeit: System-Prompt definiert Ton, Domäne, Grenzen — Claude Code generiert optimierte System-Prompts aus einer einfachen Beschreibung.
- Tool Use: Soll der Chatbot Aktionen ausführen? DB-Abfragen, APIs, Kalender → Function Calling einrichten.
- RAG: Firmen-Dokumente, FAQs, Produktinfos → Vektordatenbank + Retrieval für domänenspezifisches Wissen.
- UI: Standalone-App, einbettbares Widget, oder Integration in WhatsApp/Telegram über Webhooks.
Multi-Turn Conversation mit Kontext-Management
CoreConversation-Engine mit Window-Management
# Das Herzstück: Kontext intelligent kürzen
class ChatSession {
constructor(systemPrompt, maxTokens = 4000) {
this.system = systemPrompt;
this.messages = [];
this.maxTokens = maxTokens;
this.sessionId = crypto.randomUUID();
}
async send(userMessage) {
this.messages.push({ role: 'user', content: userMessage });
// Token-Schätzung: ~4 chars = 1 token
while (this.estimateTokens() > this.maxTokens) {
if (this.messages.length <= 2) break;
this.messages.splice(0, 2); // Ältestes User+Assistant Pair entfernen
}
const response = await claude.messages.create({
model: 'claude-sonnet-4-6',
max_tokens: 1024,
system: this.system,
messages: this.messages
});
const reply = response.content[0].text;
this.messages.push({ role: 'assistant', content: reply });
await db.chatMessages.create({
sessionId: this.sessionId,
userMessage, reply,
timestamp: new Date()
});
return reply;
}
estimateTokens() {
return this.messages.reduce((sum, m) =>
sum + Math.ceil(m.content.length / 4), 0);
}
}
System-Prompt Engineering mit Claude Code
PromptOptimierten System-Prompt generieren
# Prompt an Claude Code:
Erstelle einen System-Prompt für einen Kundenservice-Chatbot:
- Firma: TechShop GmbH (Online-Shop für Elektronik)
- Kann: Bestellstatus abfragen, FAQ beantworten, Rückgaben einleiten
- Kann NICHT: Preise ändern, Rabatte gewähren, Eskalationen über €500
- Tonalität: freundlich, professionell, kurze Antworten
- Bei Unklarheit: eskalieren an human@techshop.de
- Antwortet auf Deutsch, wechselt bei englischen Fragen zu Englisch
# Claude Code generiert:
Du bist Max, der Kundenservice-Assistent von TechShop GmbH.
Deine Aufgaben:
- Bestellstatus abrufen (Tool: check_order_status)
- Häufige Fragen beantworten (Lieferzeit, Rückgaben, Garantie)
- Rückgabeprozesse einleiten (Tool: initiate_return)
Grenzen:
- Preisanpassungen, Rabatte: IMMER ablehnen
- Beträge über 500 Euro oder emotionale Eskalationen: an human@techshop.de
Stil: Kurz und klar. Max 3 Sätze pro Antwort.
System-Prompt Iteration: Erstellt Claude Code einen Prompt, teste ihn mit 5-10 Edge-Cases. Beschreibe was nicht funktioniert — Claude Code iteriert den Prompt bis das Verhalten stimmt.
Tool Use: Chatbot der Aktionen ausführt
Tool UseBestellstatus und Datenbank-Aktionen
# Claude mit Tools verbinden
const tools = [{
name: 'check_order_status',
description: 'Bestellstatus für eine Bestellnummer abrufen',
input_schema: {
type: 'object',
properties: {
order_id: { type: 'string', description: 'Bestellnummer' }
},
required: ['order_id']
}
}];
async function chatWithTools(messages) {
const response = await claude.messages.create({
model: 'claude-sonnet-4-6',
max_tokens: 1024,
tools,
messages
});
if (response.stop_reason === 'tool_use') {
const toolCall = response.content.find(b => b.type === 'tool_use');
const result = await executeToolCall(toolCall.name, toolCall.input);
return chatWithTools([
...messages,
{ role: 'assistant', content: response.content },
{ role: 'user', content: [{
type: 'tool_result',
tool_use_id: toolCall.id,
content: JSON.stringify(result)
}]}
]);
}
return response.content[0].text;
}
RAG: Chatbot mit eigenem Unternehmenswissen
RAGFAQ-Datenbank und Dokumente einbinden
# Retrieval Augmented Generation für Unternehmens-FAQs
async function ragChatbot(userQuestion, sessionMessages) {
// 1. Relevante Dokumente finden via Embedding-Suche
const embedding = await openai.embeddings.create({
model: 'text-embedding-3-small',
input: userQuestion
});
const relevantDocs = await vectorDb.similarity_search(
embedding.data[0].embedding,
{ limit: 3, threshold: 0.75 }
);
// 2. Kontext in System-Prompt einfügen
const contextBlock = relevantDocs.length > 0
? `\n\nRelevante Informationen:\n${relevantDocs.map(d => d.content).join('\n\n')}`
: '';
return claude.messages.create({
model: 'claude-sonnet-4-6',
max_tokens: 1024,
system: BASE_SYSTEM_PROMPT + contextBlock,
messages: [...sessionMessages, { role: 'user', content: userQuestion }]
});
}
# Dokumente indexieren (einmalig beim Setup):
async function indexDocument(text, metadata) {
const chunks = chunkText(text, 500); // 500-Token-Chunks
for (const chunk of chunks) {
const embedding = await getEmbedding(chunk);
await vectorDb.insert({ content: chunk, embedding, metadata });
}
}
Einbettbares Chat-Widget
WidgetEin-Zeilen-Integration für jede Website
<!-- Einbinden mit einer Zeile: -->
<script src="https://your-app.com/widget.js"
data-chatbot-id="YOUR_ID"></script>
// widget.js — Shadow DOM für Style-Isolation
class ChatWidget extends HTMLElement {
connectedCallback() {
const shadow = this.attachShadow({ mode: 'closed' });
shadow.innerHTML = `
<style>
.chat-btn { position:fixed; bottom:24px; right:24px;
width:56px; height:56px; border-radius:50%;
background:#6366f1; cursor:pointer; border:none;
font-size:24px; color:white; }
.chat-win { position:fixed; bottom:90px; right:24px;
width:360px; height:500px; background:white;
border-radius:12px; box-shadow:0 20px 60px rgba(0,0,0,.15);
display:none; flex-direction:column; overflow:hidden; }
.chat-win.open { display:flex; }
</style>
<button class="chat-btn" id="toggle">💬</button>
<div class="chat-win" id="window">
<div id="messages" style="flex:1;overflow-y:auto;padding:16px"></div>
<input id="input" placeholder="Nachricht..." style="border-top:1px solid #e2e8f0;padding:12px">
</div>
`;
shadow.getElementById('toggle')
.addEventListener('click', () =>
shadow.getElementById('window').classList.toggle('open'));
}
}
customElements.define('chat-widget', ChatWidget);
document.body.appendChild(document.createElement('chat-widget'));
Produktions-Checklist: Rate-Limiting pro User/IP, Session-Timeout (30 min inaktiv), Content-Moderation (kein Prompt-Injection), Kosten-Cap pro Session, DSGVO-konforme Speicherung (Consent, Lösch-API).
Chatbot-Modul im Kurs
Im Claude Code Mastery Kurs: vollständiger Chatbot-Stack mit Kontext-Management, RAG-Integration, Tool Use und einbettbarem Widget — direkt produktionsreif. Mit Schritt-für-Schritt-Aufbau vom ersten API-Call zur fertigen Kundenservice-Lösung.
14 Tage kostenlos testen →