Das Projekt
Nova ist ein interaktiver KI-Assistent für Websites. Er sitzt als Knopf unten rechts, öffnet ein Chatfenster und beantwortet Fragen zu den Inhalten der Website in natürlicher Sprache. Unter jeder Antwort stehen die Seiten, auf die sie sich stützt.
Wir haben Nova zuerst für unsere eigene Website gebaut – dieselbe Seite, die Sie gerade lesen. Was hier läuft, ist also keine Vorführung, sondern der Betriebszustand.
Ausgangslage
Eine Website mit über hundert Seiten hat ein Auffindbarkeitsproblem, kein Inhaltsproblem. Wer wissen will, ob jemand Barrierefreiheit prüft, bekommt von einer klassischen Volltextsuche eine Liste von Seiten, die das Wort enthalten – und muss anschließend selbst lesen, vergleichen und entscheiden.
Das ist Arbeit, die der Besucher nicht leisten will. Die naheliegende Alternative, ein Kontaktformular, kostet ihn eine Wartezeit von Stunden bis Tagen für eine Frage, deren Antwort längst auf der Website steht.
Aufgabenstellung
Gesucht war ein Assistent, der aus den vorhandenen Inhalten antwortet – und sonst nichts. Drei Vorgaben waren nicht verhandelbar:
- Keine Erfindungen. Die Antwort darf ausschließlich auf den gelieferten Auszügen beruhen. Deckt die Website eine Frage nicht ab, muss das offen gesagt werden.
- Nachprüfbarkeit. Jede Antwort nennt ihre Quellen, damit der Besucher nachlesen kann.
- Kein Datenabfluss aus dem Browser. Der Besucher spricht mit unserem Server, nicht mit einem Dienst Dritter.
Dazu zwei Randbedingungen, die in der Praxis über den Betrieb entscheiden: die Kosten müssen vorher begrenzbar sein, und das Fenster muss mit der Tastatur und mit einem Screenreader vollständig bedienbar sein.
Umsetzung
Serverseitiger Mittler statt Direktverbindung
Das Bedienteil im Browser spricht mit genau einer Adresse: einer eigenen Route auf derselben Domain. Diese Route prüft die Frage, begrenzt sie, zählt sie – und ruft erst dann das Sprachmodell, serverseitig.
Daraus folgen zwei Eigenschaften, die sich mit einer Direktverbindung aus dem Browser nicht erreichen lassen: Der Zugriffsschlüssel bleibt auf dem Server, er liegt in einer Konfigurationsdatei und in keinem Panel-Feld, in keiner Nutzlast und in keinem Protokoll. Und die IP-Adresse des Besuchers erreicht den Modellanbieter nicht, weil die Verbindung zwischen unserem Server und dem Anbieter besteht, nicht zwischen dem Browser und dem Anbieter.
Wählbare Wissensgrundlage
Was das Modell zu sehen bekommt, entscheidet eine Einstellung im Panel – drei Stufen:
| Wissensgrundlage | Umfang | geeignet für |
|---|
| Passende Seiten | die zur Frage ermittelten Seiten | sparsamster Betrieb, schnellste Antwort |
|---|
| Gesamter Inhaltsbestand | alle veröffentlichten Seiten | die genauesten Antworten |
|---|
| Nur die Übersicht | die Kurzfassung der Website | sehr sparsamer Betrieb |
|---|
Die Auswahl der passenden Seiten läuft über den vorhandenen Suchindex der Website. Ein Vektorspeicher kommt hinzu, wenn der Bestand das verlangt – bei einigen hundert Seiten löst er ein Problem, das noch nicht existiert.
Prompt-Caching als Bedingung, nicht als Feinschliff
Beim gesamten Inhaltsbestand geht derselbe, gleichbleibende Text in jede Anfrage. Ohne Zwischenspeicherung wird dieser Text jedes Mal voll berechnet und voll bezahlt. Der Prompt ist deshalb so aufgebaut, dass der unveränderliche Teil vorn steht und der Haltepunkt für den Zwischenspeicher genau an seinem Ende sitzt: gleichbleibende Anweisung und Bestand davor, Gesprächsverlauf und aktuelle Frage danach.
Zusätzlich wird der Bestand nicht bei jeder Anfrage neu aus allen Seiten zusammengesetzt, sondern lokal zwischengespeichert. Neu gebaut wird er unter anderem dann, wenn sich der Fingerabdruck der Inhalte ändert – eine im Panel geänderte Seite wirkt damit sofort, unabhängig von der Verfallszeit.
Kostenbremsen vor dem ersten Aufruf
Drei Grenzen greifen, bevor überhaupt ein Modell gerufen wird: ein Tageslimit für die gesamte Website, eine Ratenbegrenzung je Besucher und eine Obergrenze für die Länge der Frage. Ist das Tageskontingent erschöpft, antwortet die Route mit dem hinterlegten Ausweichtext – ohne Aufruf und ohne Kosten.
Eine vierte Grenze begrenzt den Kontext. Reißt sie, werden vollständige Seiten weggelassen und namentlich benannt, nie mitten im Satz abgeschnitten. Begründung: ein halber Satz lässt das Modell eine halbe Frist lesen und daraus eine vollständig klingende Antwort bauen. Eine ganz fehlende Seite erkennt es als Lücke.
Gezählt wird in einer eigenen Datei, und zwar ausschließlich Tag, Zahl der Anfragen und die vier Tokenzahlen. Keine Fragetexte, keine IP-Adressen, keine Kennungen – auch dann nicht, wenn das Gesprächsprotokoll abgeschaltet ist. Eine abschaltbare Kostenbremse wäre keine Bremse; ein Zähler, der Fragen speichert, wäre kein Datenschutz. Deshalb zwei getrennte Dateien.
Quellen, die geprüft werden
Der Bestand ist seitenweise aufbereitet, jeder Abschnitt trägt seine Adresse. Das Modell ist angewiesen, die benutzten Adressen in einer festen Schlussform zu nennen. Diese Zeile wird aus der Antwort entfernt, jede Adresse gegen die Liste der wirklich vorhandenen Seiten geprüft und verworfen, was dort nicht steht. Der angezeigte Titel kommt aus der eigenen Liste, nicht aus der Antwort. Eine erfundene Quelle ist schlimmer als keine.
Offenlegung als KI-Assistent
Wird Nova gefragt, ob dort ein Mensch antwortet, legt sie offen, dass sie ein KI-Assistent und keine Person ist. Diese Regel steht im festen Teil der Anweisung und nicht in einem Panel-Feld – ein versehentlich überschriebener Text darf sie nicht aufheben. Name und Rolle stehen zusätzlich sichtbar im Fensterkopf und bilden den zugänglichen Namen des Dialogs.
Bei Störungen keine Fehlerseite
Fehlt der Zugriffsschlüssel, antwortet der Dienst nicht oder liefert ein unerwartetes Format, sieht der Besucher immer denselben hinterlegten Ausweichtext – nie eine technische Meldung. Die Begründung geht ins Panel und in die Prüfläufe. Bei erkannten Bots wird kein Erfolg vorgetäuscht und auch keine Antwort erfunden.
Barrierefreiheit
Chatfenster sind der Ort, an dem Barrierefreiheit regelmäßig liegen bleibt. Hier ist sie Teil der Zusage:
- Das Fenster ist ein echter Dialog mit Rolle, modalem Zustand und Beschriftung; der Fokus springt beim Öffnen auf die Überschrift und beim Schließen zurück auf den Knopf.
- Eine Fokusfalle hält die Tastaturbedienung im Fenster, solange es offen ist. ESC schließt.
- Neue Antworten erscheinen in einer höflich angesagten Region, damit ein Screenreader sie mitbekommt. Auch der Ladezustand ist dort ein Text, keine reine Animation.
- Auf dem Handy nimmt das Fenster die volle Fläche ein; gerechnet wird mit der tatsächlich sichtbaren Höhe, damit das Eingabefeld nicht unter die Adressleiste rutscht.
- Ohne JavaScript bleibt kein toter Knopf zurück: der Knopf wird erst durch das Skript sichtbar, und ein Hinweis verweist auf das Kontaktformular.
- Der Datenschutzhinweis steckt in einer Einblendung, die per Zeiger, Fokus und Tastatur erreichbar ist; ein kurzer Satz über dem Eingabefeld bleibt immer stehen und hängt per Beschreibung am Feld. Verstecken ist zulässig, verschweigen nicht.
Geprüft wird mit axe-core, und zwar am geöffneten Fenster. Eine Prüfung am verborgenen Markup wäre eine Aussage über ein unsichtbares Element, nicht über das Bedienteil. Der Lauf meldet für alle geprüften Zustände null Verstöße.
Verfügbarkeit
Nova gibt es als Plugin für Kirby und für WordPress. Eine Fassung für Joomla ist in Vorbereitung; einen Termin nennen wir erst, wenn er hält.
In allen Fassungen bleibt die Trennung dieselbe: Einstellungen in der Oberfläche des jeweiligen Systems, Zugriffsschlüssel in der Konfiguration, und der Inhaltsbestand kommt aus dem eigenen Seitenbaum.
Was uns wichtig war
Der Assistent muss „weiß ich nicht“ sagen können. Ein Assistent, der auf jede Frage etwas antwortet, ist gefährlicher als gar keiner. Deckt die Website eine Frage nicht ab, lautet die Antwort, dass das nicht auf der Website steht, mit Verweis auf das Kontaktformular.
Der Schlüssel gehört nicht in den Inhaltsbestand. Felder der Oberfläche landen in versionierten Dateien, in jeder Sicherung und in jedem Deploy-Paket. Die Oberfläche fragt deshalb an keiner Stelle nach einem Schlüssel; sie meldet nur, ob einer hinterlegt ist.
Eine Kostenobergrenze ist eine Betriebsbedingung. Ein Assistent ohne Tageslimit ist eine offene Rechnung. Die Grenzen greifen vor dem Aufruf, nicht danach.
Was noch nicht gemessen ist, behaupten wir nicht. Wie stark Nova die Zahl der Rückfragen über das Kontaktformular verändert, steht hier erst, wenn wir es über einen längeren Zeitraum gemessen haben.
Übertragbarkeit
Der Nutzen wächst mit dem Umfang der Inhalte. Besonders geeignet ist Nova für Websites, auf denen Antworten verstreut über viele Seiten liegen: Hersteller mit Produkt- und Anwendungsdokumentation, Verbände mit Regelwerken und Merkblättern, Bildungsträger mit Kursbeständen, Kommunen und Behörden mit Formularen und Zuständigkeiten.
Für Stellen, die der Barrierefreiheitspflicht unterliegen, ist der zweite Punkt der entscheidende: ein zugekaufter Chat-Knopf bringt häufig genau die Verstöße mit, die man gerade abgestellt hat.