KI, die einem Arbeit abnimmt
KI-gestützter persönlicher Assistent mit No-Code-Plattform n8n
In diesem Artikel habe ich eine Idee zur Erstellung eines KI-gestützten, persönlichen Assistenten zusammengestellt. Dieser Assistent kann eine Vielzahl von Aufgaben übernehmen, von der Verwaltung des Kalenders und der E-Mails bis hin zur Aktualisierung von CRM- und Projektmanagement-Tools. Ich werde kurz beschreiben, wie ich diesen Assistenten mit der No-Code-Plattform n8n aufgebaut habe, und dabei auf ein paar Konfigurations-Ideen eingehen.
Einrichtung eines eigenen KI-gestützten persönlichen Assistenten
Um den Umfang zu erkennen, ist hier ein kleiner Ausschnitt der Verbindungen zu den angeschlossenen Diensten zu sehen, die die KI steuern kann.
Die No-Code-Plattform n8n
Für die Entwicklung dieses Assistenten habe ich die No-Code-Plattform n8n verwendet. Diese Plattform ermöglicht es, komplexe Automatisierungen ohne Programmierkenntnisse zu erstellen. Ich habe mich für n8n entschieden, um die Möglichkeiten der Plattform auszuloten und später ein anspruchsvolleres Projekt zu realisieren.
Installation
Ich nutze, wie immer, eine Docker Umgebung. So muss ich nur die docker-compose.yml
-Datei erstellen und kann n8n direkt nutzen:
volumes:
n8n_storage:
postgres_storage:
qdrant_storage:
networks:
n8n-net:
x-n8n: &service-n8n
image: n8nio/n8n:latest
networks: ['n8n-net']
environment:
- GENERIC_TIMEZONE=Europe/Berlin
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_USER=${POSTGRES_USER}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
- N8N_SECURE_COOKIE=false
- N8N_DIAGNOSTICS_ENABLED=false
- N8N_PERSONALIZATION_ENABLED=false
- N8N_ENCRYPTION_KEY
- N8N_USER_MANAGEMENT_JWT_SECRET
links:
- postgres
services:
postgres:
image: postgres:16-alpine
networks: ['n8n-net']
restart: unless-stopped
environment:
- POSTGRES_USER
- POSTGRES_PASSWORD
- POSTGRES_DB
volumes:
- postgres_storage:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}']
interval: 5s
timeout: 5s
retries: 10
n8n-import:
<<: *service-n8n
container_name: n8n-import
entrypoint: /bin/sh
command:
- "-c"
- "n8n import:credentials --separate --input=/backup/credentials && n8n import:workflow --separate --input=/backup/workflows"
volumes:
- ./n8n/backup:/backup
depends_on:
postgres:
condition: service_healthy
n8n:
<<: *service-n8n
container_name: n8n
restart: unless-stopped
ports:
- 5678:5678
volumes:
- n8n_storage:/home/node/.n8n
- ./n8n/backup:/backup
- ./shared:/data/shared
depends_on:
postgres:
condition: service_healthy
n8n-import:
condition: service_completed_successfully
qdrant:
image: qdrant/qdrant
container_name: qdrant
networks: ['n8n-net']
restart: unless-stopped
ports:
- 6333:6333
volumes:
- qdrant_storage:/qdrant/storage
Dies stellt die folgenden Container zur Verfügung:
1. n8n
- Aufgabe:
Hauptcontainer der n8n-Automatisierungsplattform, in dem Workflows erstellt und ausgeführt werden.
2. n8n-import
- Aufgabe:
Importiert zuvor exportierte Workflows und Credentials in n8n.
3. postgres
- Aufgabe:
Bereitstellung der Datenbank, in der n8n alle persistenten Daten speichert.
4. qdrant
- Aufgabe:
Vektorbasiertes Suchsystem für Machine-Learning- und ähnliche Anwendungsfälle. Ich nutze es als Gedächtnis für die KI. So lassen sich eigene Dokumente, Kalendereinträge, Mails etc. dem verwendeten Modell hinzufügen.
Packages von n8n
n8n hat eine aktive Community, die für viele Programme oder Dienste sogenannte Packages entwickelt hat. Später, wenn die Mails und Kalendereinträge etc. mit Google funktionieren, werde ich die Packages austauschen, sodass sie nurnoch meine eigenen Ressourcen nutzen. Diese Reihenfolge macht für mich Sinn, da ich fast keine Daten bei Google/Apple/Microsoft habe.
Die Liste ist riesig. Ich kann hier nur einen kleinen Teil vorstellen.
Diese lassen sich sehr leicht aneinanderreihen und z.B. die Felder des vorherigen Blockes schnell in den Text des Prompts ziehen. Und schon entsteht ein neuer Output, der vom nächsten Block weiterverarbeitet wird:
Die Nutzung ist dann sehr intuitiv:
Will ich dies in eine Webseite einbauen, ist auch das nur ein weiterer Klick:
Dann muss ich lediglich die Chat-URL auf meiner Webseite einbauen - die richtige IP des Containers eingetragen versteht sich.
Doch nun zurück zu meinem Experiment, einen eigenen Assistenten zu erstellen, der später auch Kontrolle über meine Hausautomation bekommen soll, damit ich diese nicht über Cloud-Dienste abwickeln muss. Aktuell benötige ich noch ein VPN, um in mein Haus zu kommen.
Aufgaben des neuen Assistenten
Der Test-Assistent ist in der Lage, verschiedene Aufgaben auszuführen, je nachdem, welche Anweisung er erhält. Er kann beispielsweise E-Mails von einem bestimmten Tag abrufen, E-Mails an bestimmte Kontakte senden, Termine erstellen oder Aufgaben in einem Projektmanagement-Tool hinzufügen. Für den Prototyp habe ich ausnahmsweise ChatGPT
genutzt, um schnell Ergebnisse zu erzielen. Später, wenn alles stabil läuft, stelle ich es wieder zurück auf Ollama
.
Abrufen von E-Mails
Um E-Mails abzurufen, habe ich den Assistenten so konfiguriert, dass er auf Textnachrichten oder Sprachbefehle reagiert. Wenn ich beispielsweise sage: "Hey Jarvis, kannst du meine E-Mails von gestern abrufen?", sendet der Assistent eine Nachricht an die Plattform n8n, die dann die E-Mails abruft und eine Zusammenfassung an mein Telefon sendet. Da ich zugegebenermaßen vieles aus Vorlagen zusammengestellt habe, teste ich das zunächst mit einem unwichtigen Google-Account, bevor ich die Module an meinen Nextcloud-Account lasse.
Senden von E-Mails
Der Assistent kann auch E-Mails senden. Ich habe ihm Zugriff auf Kontakte (Google-Sheets) gegeben, sodass er E-Mails an bestimmte Personen senden kann. Wenn ich beispielsweise sage: "Sende eine E-Mail an Anna Lytisch und sage ihr, dass wir mit den Dienstleistungen zufrieden sind", erstellt der Assistent einen E-Mail-Entwurf, den ich dann überprüfen und senden kann.
Erstellen von Terminen
Der Assistent kann auch Termine erstellen. Wenn ich beispielsweise sage: "Erstelle einen Termin mit Anna Bolika für kommenden Donnerstag um 13:00 Uhr. Wir wollen die Logfiles des PDC anschauen.", erstellt der Assistent automatisch einen Termin in meinem Kalender und lädt die entsprechenden Personen ein.
Aktualisieren von Projektmanagement-Tools
Der Assistent kann auch Aufgaben in meinem Projektmanagement-Tool "Notion" erstellen. Wenn ich beispielsweise sage: "Erstelle eine Aufgabe für mich, am Dienstag zum Neuaufsetzen des Thinclients.", erstellt der Assistent automatisch eine Aufgabe in einem Notion-Konto. Später sollen es dann mal Nextcloud-Decks werden.
Schritt-für-Schritt-Anleitung zur Erstellung des Assistenten
Ich habe gerade erst angefangen den obigen Assistenten mit n8n zu erstellen. Die Plattform verwendet Module, die miteinander verbunden werden können, um komplexe Automatisierungen zu erstellen.
Trigger
Alles beginnt mit einem Trigger. Ich habe Twilio für erste Tests verwendet. Es scheint aber auf ntfy hinauszulaufen, da ich vom Smartphone aus per Tasker besonders leicht Aktionen auslösen kann.
Open AI Modul
Nach Auslösen des Triggers wird die Nachricht an ein Open AI
/Ollama
Modul gesendet. Dieses Modul analysiert die Nachricht und entscheidet, welche Aktionen ausgeführt werden sollen. Dazu habe ich die folgenden Anweisungen gegeben:
Deine Aufgabe ist es, die Nachricht zu analysieren und zu entscheiden, welche Aktionen auszuführen sind. Es gibt fünf mögliche Aktionen, und deine Ausgabe sollte auf dem Inhalt der Nachricht basieren und gesunden Menschenverstand anwenden, um die richtigen Aktionen zu bestimmen. Du musst sicherstellen, dass deine Ausgabe nur relevante Aktionen enthält, die auf der spezifischen Nachricht basieren.
Die fünf Aktionen sind:
- Kalender abrufen
- E-Mails abrufen
- Aufgaben erstellen
- E-Mails senden
- Termine erstellen
Datums- und Zeitmodul
Nach der Analyse der Nachricht werden Filter verwendet, um die Aktionen zu steuern. Wenn die Nachricht beispielsweise das Wort "E-Mails" enthält, wird der Filter für das Abrufen von E-Mails aktiviert. Folgender Prompt befindet sich in diesem Modul:
Heute ist {{ $json.nowFormatted }}. Du sollst das Datum bestimmen, das abgerufen werden soll. Gib das Datum aus, um das die Textnachricht bittet.
Textnachricht: {{ $json.twilioInput }}
Datums- und Zeitmodul
Um das Datum und die Uhrzeit zu bestimmen, verwende ich ein Datums- und Zeitmodul. Dieses Modul extrahiert das aktuelle Datum und die Uhrzeit und verwendet diese Informationen, um die richtigen Aktionen auszuführen.
Gmail Modul
Um E-Mails abzurufen, verwende ich ein Gmail Modul. Dieses Modul verbindet sich mit meinem Gmail-Konto und ruft die E-Mails ab, die den angegebenen Kriterien entsprechen.
Im Gmail Modul habe ich die folgenden Filter konfiguriert:
Label-Namen oder IDs: inbox, unread
Empfangen nach: [Datum aus dem Datums- und Zeitmodul]
Google Sheets Modul
Um auf meine Kontakte zuzugreifen, verwende ich ein während meiner Tests ein Google Sheets Modul. Ich habe dort eine Excel-Tabelle mit Kontakten abgelegt, solange ich noch keinen Zugriff auf meine Nextcloud-Kontakte gestatte. Das Modul verbindet sich mit dieser Excel-Tabelle und ruft die Informationen ab, die ich benötige.
Im Google Sheets Modul habe ich die folgenden Einstellungen konfiguriert:
Aktion: Zeilen abrufen
Tabelle: [Meine Google Sheets-Datei]
Filter: [Nachname aus der Nachricht]
Hier wird die eMail-Adresse eines Kontaktes ausgelesen. Zum Testen hatte ich diese ja in der dritten Spalte der Excel-Tabelle platziert.
Twilio Modul
Um Nachrichten zu senden, verwende ich testweise ein Twilio Modul. Dieses Modul sendet eine Textnachricht an mein Telefon mit den angeforderten Informationen.
Im Twilio Modul habe ich die folgenden Einstellungen konfiguriert:
Von: [Meine Twilio-Telefonnummer]
An: [Meine Telefonnummer]
Nachricht: [Zusammenfassung der angeforderten Informationen]
Mit ntfy wird dies einfacher, denke ich. Denn wie schon in meinem Post über einen eigenen Push-Server erwähnt, lassen sich Nachrichten leicht auslesen und senden.
Google Calendar Modul
Um Termine zu erstellen, verwende ich ein Google Calendar Modul. Dieses Modul verbindet sich mit meinem Google Kalender und erstellt die Termine, die ich anfordere. Hier ist ebenso ein CalDav Modul möglich.
Im Google Calendar Modul habe ich die folgenden Einstellungen konfiguriert:
Aktion: Ereignis erstellen
Startzeit: [Startzeit aus der Nachricht]
Endzeit: [Endzeit aus der Nachricht]
Teilnehmer: [E-Mail-Adresse aus Google Sheets]
Zusammenfassung: [Name des Ereignisses]
Fazit
Einen eigenen Assistent zu entwickeln ist ein extrem interessantes Projekt. Doch ich habe beim Testen gelernt, dass sich auch Alarme aus meinem SIEM automatisch auswerten lassen. So kann ein Alarm eine Analyse des Incidents durch KI anstoßen. Aber auch Informationen über den Threat-Actor beschaffen. Auch die Erstellung des Incident-Reports kann angestoßen werden, sobald alle Informationen unterhalb eines Ordners gesammelt wurden.
Jeder, der als Kind mit Lego-Mindstorms gespielt hat, kann mit der lokalen KI Ablaufpläne beliebiger Komplexität erstellen. Your Mind is the Limit...