Künstliche Intelligenz revolutioniert die Chatbot Entwicklung: Die größte, greifbare Änderung, die generative KI heute mit sich bringt, ist das „Verstehen“ von natürlicher Sprache. Noch vor drei Jahren war es quasi unmöglich, einen Rechner dazu zu bringen, mit einem Nutzer ein sinnvolles Gespräch zu führen. In der Regel waren solche „Chatbots“ geskriptet. Das heißt, sie warteten auf ein vordefiniertes Stichwort des Nutzers und zeigten dann vorher festgelegte Dialoge bzw. Dialogflüsse an. Meistens waren Nutzer mit den Fachbegriffen des Unternehmens allerdings nicht so firm, wie die Entwickler erwarteten. Daher hinderte bereits das Erraten der Fachbegriffe den Kunden daran, eine sinnvolle Antwort zu bekommen. Eine Zeitlang habe ich persönlich deshalb in entsprechende Chatfenster nur wiederholt „Second Level Support“ getippt. Das wurde überraschend oft verstanden und ich konnte mit einem richtigen Menschen sprechen.
In diesem Artikel illustriere ich, wie einfach es heute unter Einsatz von Künstlicher Intelligenz ist, mit Large Language Modellen akzeptable Chatlösungen zu entwickeln. Und keine Angst: Viel Source Code ist dafür, wie wir sehen werden, nicht nötig.
Moderne Chatlösungen
KI und bereits relativ einfache Large Language Modelle erlauben es, ohne vorheriges Skripten einen Dialog zu führen.

Das Beispiel zeigt einige der „neuen“ Möglichkeiten am Beispiel eines Chatbots für den fiktiven Anbieter „The Magificient Hoster“:
- Der Chatbot wurde angewiesen nur auf Deutsch zu antworten. Auf die englische Frage „How much is the fish?“ antwortet er deshalb auf Deutsch. Besonders dabei: Der Chatbot versteht die englische Frage und kann sie einordnen.
- Der Chatbot wurde instruiert nur Fragen zu einem fiktiven Unternehmen („Magnificent Hoster“) zu geben. Entsprechend lehnt er Fragen zum Fischpreis ab und fordert den Nutzer auf, Fragen zum fiktiven Unternehmen zu stellen.
- Der Chatbot verfügt über eine Menge an Wissen, dass ihm zuvor in Form von verschiedenen Dokumenten „beigebracht“ wurde. Dieses Wissen, zum Beispiel der Name des Gründers, wird beim Antworten genutzt.
- Der KI-Chatbot ist kreativ – im vorliegenden Fall etwas zu sehr: Gemäß der Dokumente hat der Gründer mit einer kleinen Truppe motivierter Kollegen das Unternehmen aufgebaut. Die „Schläger Truppe“ entspringt der Phantasie des Chatbots. Wie solche „Halluzinationen“ verhindert werden, erklären wir weiter unten.
Download und Ausführung des KI-Chatbots
Um alles auf dieser Seite auch im Detail nachvollziehen und selbst umsetzen zu können, haben wir ein Paket mit dem vollständige Quellcode erstellt, das Sie herunterladen können.
Ausführung des Quellcodes
Um die Chatlösung lokal zu betreiben sind einige Schritte nötig. Hier wird davon ausgegangen, dass das genutzte System ein Linux- oder Mac-Computer ist und dass Python (ab Version 3.8) installiert ist.
1. Entpacken des Quellcodes und in das Verzeichnis wechseln
Zunächst müssen Sie das heruntergeladene Paket entpacken und in den Ordner mit dem Quellcode wechseln:
unzip ai-modelhub-chat-main.zip
cd ai-modelhub-chat-main
2. Einrichten einer virtuellen Umgebung und Installation notwendiger Python Module
Nach dem Entpacken müssen einige Python Module auf Ihrem Rechner installiert werden:
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
3. Setzen des IONOS_API_TOKENS als Umgebungsvariable
Anschließend muss ein IONOS API Token erstellt und als Umgebungsvariable hinterlegt werden:
export IONOS_API_TOKEN=<IHR TOKEN HIER>
4. Schreiben von Beispieldaten in die Vektordatenbank und Starten der Chatlösung
Anschließend werden Beispieldaten in eine Vektordatenbank geschrieben und die Chatlösung gestartet:
python src/create_collection.py
python src/launch_ui.py
Nach Ausführung dieser Schritte lässt sich die Chatlösung unter der URL http://127.0.0.1:8080/ im Browser öffnen und der Nutzer kann direkt mit der Lösung interagieren. In der Lösung lässt sich der Chatverlauf aus der obigen Abbildung erzeugen.
Optional: Löschen der Vektordatenbank
Durch das langfristige Speichern von Daten in unserer Vektordatenbank können Kosten entstehen. Um dies zu verhindern, lassen sich die Inhalte der Vektordatenbank nach der Benutzung mit folgendem Befehl löschen:
python src/delete_collection.py
Erläuterung der Architektur des KI-Chatbots
Die Chatlösung nutzt Retrieval Augmented Generation um die Anfragen des Nutzers mit eigenen Daten anzureichern. Dabei wird nicht einfach nur ein Large Language Model abgefragt, sondern die Abfrage mit eigenen Dokumenten angereichert.

Um Retrieval Augmented Generation umzusetzen, sind technisch prinzipiell zwei Schritte nötig: (1) Zuerst müssen Textdokumente in eine Vektordatenbank gespeichert werden und (2) die Dokumente müssen in die Anfragen an das Large Language Model (LLM) integriert werden.
Speichern von Dokumenten in der Vektordatenbank
Um Texte in einer Vektordatenbank zu speichern müssen diese zunächst aus bestehenden Dateien extrahiert werden. Das wirkt auf den ersten Blick kompliziert, Python bietet aber vielfältige Bibliotheken, um verschiedene Dateiformate zu lesen und zu verarbeiten. So kann dieser Schritt größtenteils an entsprechende Bibliotheken ausgelagert werden. Hier wird das Vorgehen für Microsoft-Word- und PDF-Dateien illustriert:
Extraktion von Text aus Word Dokumenten
Das Python Modul zur Extraktion von Texten aus Microsoft Word Dokumenten heißt python-docx. Texte lassen sich mit nur wenigen Zeilen extrahieren:
# Siehe documents.py (Zeile 34ff)
from docx import Document
doc = Document(file_path)
text = ''
for para in doc.paragraphs:
text += para.text + '\n'
Es wird zunächst das Word Dokument geöffnet und anschließend Absatz für Absatz extrahiert und in einen langen String kopiert.
Extraktion von Text aus PDF Dokumenten
Adobe PDF Dateien lassen sich mit dem Python Modul PyMuPDF auslesen. Die Lösung geht dabei seitenweise vor und liest Seite für Seite ein:
# Siehe documents.py (Zeile 15ff)
import fitz
with fitz.open(file_path) as doc:
text = ''
num_pages = len(doc)
for page_num in range(num_pages):
if max_pages is not None and page_num >= max_pages:
break
page = doc[page_num]
text += page.get_text()
Optional: Andere Dateiformate
Für andere Dateiformate lassen sich alternative Python Module finden. So lassen sich die gängigsten E-Book-Formate, wie epub und mobi, auch mit PyMuPDF einlesen. Für die meisten anderen Formate lassen sich auch passende Module finden.
Laden der Extrahierten Texte in eine Vektordatenbank
Der extrahierte Text kann dann mit folgendem Code in eine Vektordatenbank geschrieben werden:
# Siehe vectordb.py (Zeile 82ff)
endpoint = f"https://inference.de-txl.ionos.com/collections/{id}/documents"
body = {
"type": "collection",
"items": [{
"type": "document",
"properties": {
"name": file_name,
"contentType": "text/plain",
"content": base64.b64encode(text.encode("utf-8")).decode("utf-8")
}
}]
}
response = requests.put(endpoint, headers=HEADERS, json=body)
Hierfür wird die REST API von IONOS genutzt und der Text wird direkt in eine Vektordatenbank in unserem Rechenzentrum in Berlin gespeichert. Wichtig dabei: Die Übertragung der Daten erfolgt verschlüsselt und Ihre Daten verlassen Deutschland nicht. Nach diesem Schritt ist der übergebene „Text“ in der Vektordatenbank abgelegt und kann in Anfragen genutzt werden.
Dieser Schritt sollte regelmäßig, also immer dann wenn sich an den Ausgangsdateien etwas ändert, wiederholt werden. So ist sichergestellt, dass in der Vektordatenbank immer aktuelle Informationen enthalten sind.
Nutzerabfrage und Dokumentenabruf
Wenn nun ein Nutzer über das Frontend eine Anfrage abschickt (hier gespeichert in der Variable ‚query_string‘), werden zunächst die relevanten Texte aus der Vektordatenbank extrahiert. Das erfolgt mit folgendem Quellcode:
# Siehe vectordb.py (Zeile 117ff)
endpoint = f"https://inference.de-txl.ionos.com/collections/{id}/query"
body = {"query": query_string, "limit": num_documents }
relevant_documents = requests.post(endpoint, json=body, headers=HEADERS)
return [{
'file_name': entry['document']['properties']['name'],
'content': base64.b64decode(entry['document']['properties']['content']).decode()
} for entry in relevant_documents.json()['properties']['matches']]
Dabei passieren verschiedene Dinge: Zunächst werden in der Vektordatenbank die Dokumente identifiziert, die der Anfrage am ähnlichsten sind, und dann zu einer Liste bestehend aus allen Dokumenten zusammengefügt.
Generierung des LLM-Prompts
Anschließend werden alle Fragmente zu einem Prompt kombiniert:
# Siehe history.py (Zeile 50ff)
CHAT_INSTRUCTIONS = """
You are helpful assistant who always answers in German.
You only answer question concering the Magnificent Hoster.
If you get any other questions politly answer that you cannot help.
"""
CHAT_INITIAL_QUESTION = "Hallo! Wie kann ich dir helfen?"
prompt = [
{'role': 'developer', 'content': CHAT_INSTRUCTIONS, 'sent': False},
{
'role': 'system',
'content': '; '.join([entry['content'] for entry in relevant_docs])
}
]
prompt.extend(history)
Der resultierende Prompt besteht aus mehreren Nachrichten:
- Einer Anweisung (CHAT_INSTRUCTIONS) an das Large Language Model, wie es sich bei der Beantwortung von Anfragen verhalten soll. Hier kann beispielsweise spezifiziert werden, dass Antworten nur in einer bestimmten Sprache verfasst werden dürfen oder dass nur Fragen zu einem bestimmten Thema erzeugt werden können.
- Einer Liste aller Dokumente aus der Vektordatenbank (relevant_docs). Diese dienen als Kontext, den das Large Language Modell für die Beantwortung nutzen darf.
- Der bisherige Chatverlauf (history) bestehend aus allen Nachrichten den Nutzers und der Chatlösung. Dies erlaubt es dem LLM auf vorherige Nachrichten zu referenzieren oder diese bei der Beantwortung zu nutzen.
Erstellen der Antwort mit einem LLM
Der Prompt wird danach an ein LLM geschickt. Dieses gibt dann die Antwort zurück. Damit der Nutzer nicht auf die vollständige Generierung der Antwort warten muss, wird bei der Ausgabe das „streaming“ Feature genutzt. Das heißt, die Antworten werden nach und nach aufgebaut.
# Siehe components.py (Zeile 129ff)
llm = ChatOpenAI(
model_name=LLM_NAME,
streaming=True,
base_url=LLM_BASE_URL,
openai_api_key=IONOS_API_TOKEN
)
async for chunk in llm.astream(promt):
print(chunk.content)
Auf diese Weise ermöglicht es der AI Model Hub dem Nutzer relativ einfach einen Chatbot zu entwickeln, der mit dem Nutzer interagiert und Antworten auf seine Fragen ausgibt.
Mögliche KI-Chatbot-Verbesserungen
Wie schon der Screenshot oben illustriert, ist das Ergebnis noch nicht perfekt. Schließlich halluziniert der KI-Chatbot noch. Es gibt verschiedene Möglichkeiten um diesen Effekt zu reduzieren:
Nutzen eines anderen LLMs: Im vorliegenden Beispiel wird Llama 3.1 mit 8 Milliarden Parametern genutzt um die Antworten zu generieren. Dieses sehr kleine Modell hat den Vorteil, dass es Antworten ausgesprochen schnell generiert. Durch größere Modelle wird die Dauer der Generierung verlängert, die Wahrscheinlichkeit von Halluzinationen aber weiter reduziert (eine Anpassung ist im Quellcode einfach in config.py, Zeile 30 möglich).
Die Anweisungen an das LLM, wie es sich zu verhalten hat (siehe config.py, Zeile 37) haben einen großen Einfluss auf das Ergebnis. Hier lässt sich auch angeben, dass das Modell gründlicher Nachdenken soll ehe es antwortet oder es kann aufgefordert werden nur auf Englisch zu antworten. Da die meisten Modelle primär auf englischen Texten trainiert wurden, verbessert dies meist die Qualität der Antworten.
Das Embedding Model (siehe config.py, Zeile 23, im Quellcode) steuert wie die „ähnlichsten“ Dokumente in der Vektordatenbank gefunden werden. Durch eine Anpassung der Zeilen lassen sich die Ergebnisse auch verbessern.
Wenn diese Optimierungen abgeschlossen sind, ist es an der Zeit den Code mit eigenen Dokumenten zu befüllen und zu testen. Dazu werden einfach die Dateien im Ordner „Input“ gelöscht und durch eigene Dateien ersetzt. Dann werden die bestehende Vektordatenbank gelöscht und neu erstellt und schon antwortet der KI-Chatbot mit den eigenen Daten.
So schnell kann ein Chatbot mit KI entwickelt werden. Der Fortschritt wartet nicht!
Setzen Sie eine entsprechende Lösung für ihr Unternehmen mit dem AI Model Hub von IONOS um! Noch bis Ende Juni können Sie dafür unser Angebot gratis nutzen.