Zurück zum Blog ·

Ein Produktberater für den eigenen Shop

Ein Shop hat ein Problem, das mit der Zahl der Artikel wächst: Kunden wissen, was sie suchen, aber nicht, wie es bei dir heißt. Die eingebaute Suche vergleicht Zeichenketten. Wer „etwas Warmes für den Herbst in Dunkelgrün" eintippt, bekommt nichts – obwohl du genau das im Sortiment hast.

Genau dafür ist Vektorsuche gemacht. Ich beschreibe hier den Aufbau, den ich für meinen eigenen Shop gebaut habe: zwei n8n-Workflows, eine Vektordatenbank, ein Sprachmodell, und Telegram als Oberfläche.

Der Aufbau in zwei Teilen

Es sind bewusst zwei getrennte Workflows, weil sie in völlig verschiedenen Rhythmen laufen.

Der Sync holt den Katalog und schreibt ihn als Vektoren in die Datenbank. Er läuft selten – bei Katalogänderungen oder nach Zeitplan.

Der Chat beantwortet einzelne Fragen. Er läuft bei jeder Nachricht.

Diese Trennung ist kein Stilfrage. Ein Embedding zu erzeugen kostet Zeit und Geld; das für jede Suchanfrage über den gesamten Katalog zu tun, wäre absurd. Der Katalog wird einmal übersetzt und liegt dann bereit.

Was in ein Produktdokument gehört

Der Schritt, der über die Qualität des Ganzen entscheidet, ist unscheinbar: Was genau vektorisierst du eigentlich?

Die naive Antwort lautet „die Produktbeschreibung". Die ist bei Shopify aber HTML, voller Markup, Größentabellen und Versandhinweisen, die bei jedem Artikel identisch sind. Vektorisierst du das mit, ähneln sich alle Produkte – der gemeinsame Ballast überstimmt die Unterschiede.

Besser ist ein bewusst gebauter Text pro Produkt: Titel, bereinigte Beschreibung, Produkttyp, Tags, Varianten. Kurz, dicht, ohne Wiederholungen. Preis und Lagerbestand gehören nicht in den vektorisierten Text, sondern als Metadaten daneben – sie ändern sich, und sie sind für die Bedeutung eines Produkts irrelevant. Niemand sucht semantisch nach „19,90 Euro".

Warum die Suche ein Werkzeug ist und kein fester Schritt

Der naheliegende Aufbau wäre: Frage rein, suchen, Treffer an das Sprachmodell, Antwort raus. Fester Ablauf, immer gleich.

Ich habe die Vektorsuche stattdessen als Werkzeug an einen Agenten gehängt. Das Modell entscheidet selbst, ob es sucht. Auf „Hallo" sucht es nicht. Auf „Habt ihr das auch in Blau?" sucht es mit dem Kontext aus der vorigen Nachricht. Auf „Wie lange dauert der Versand?" sucht es gar nicht, weil das keine Produktfrage ist.

Der Preis dafür ist ein Modellaufruf mehr pro Anfrage. Der Gewinn ist ein Gespräch, das sich nicht anfühlt wie ein Formular.

Der Fehler, den ich beim Nachsehen gefunden habe

Als ich die beiden Workflows nebeneinandergelegt habe, ist mir aufgefallen: Der Sync erzeugt seine Vektoren mit einem Modell von OpenAI, der Chat sucht mit einem lokalen Modell über Ollama. Zwei verschiedene Modelle, ein gemeinsamer Vektorraum – das kann nicht funktionieren, und im schlimmsten Fall fällt es nicht einmal auf.

Weil dieser Fehler generell ist und nicht nur meinen Aufbau betrifft, habe ich ihm einen eigenen Beitrag gewidmet.

Zwei Details, die man leicht übersieht

Das Gedächtnis braucht einen Schlüssel. Der Speicher für den Gesprächsverlauf muss pro Nutzer getrennt sein, und der Schlüssel dafür ist die Telegram-Chat-ID. Ohne diese Zuordnung teilen sich alle Nutzer einen gemeinsamen Verlauf – Nutzer B bekommt Antworten, die auf dem Gespräch von Nutzer A aufbauen. In einem Shop-Kontext ist das kein Schönheitsfehler, sondern ein Datenleck.

Die Zahl der Treffer ist ein Kompromiss. Zu wenige, und das passende Produkt ist nicht dabei. Zu viele, und das Modell ertrinkt in Auswahl und wird beliebig. Zehn ist ein brauchbarer Startwert für einen überschaubaren Katalog – aber es ist eine Stellschraube, die man mit echten Fragen justiert, nicht mit Vermutungen.

Was mir am Ergebnis nicht gefällt

Zwei Dinge, die man vor dem Nachbauen wissen sollte.

Das Modell antwortet flüssig, auch wenn die Treffer nichts taugen. Es gibt keinen eingebauten Zweifel. Wenn die Suche nichts Passendes liefert, erfindet ein Sprachmodell im Zweifel eine plausible Empfehlung, statt „habe ich nicht" zu sagen. Das muss man ihm ausdrücklich vorgeben – und selbst dann prüfen.

Und der Katalog altert. Zwischen zwei Sync-Läufen empfiehlt der Bot Artikel, die ausverkauft sein können. Bei Preisen und Beständen führt kein Weg daran vorbei, sie zur Antwortzeit frisch abzufragen, statt sich auf den Stand des letzten Imports zu verlassen.

Ein Produktberater dieser Art ist keine Zauberei, sondern eine Kette aus Bausteinen, die einzeln unspektakulär sind. Interessant wird er dort, wo die Kette reißt – und sie reißt fast immer an den unscheinbaren Stellen: beim Dokument, beim Schlüssel für das Gedächtnis, beim Modell für die Embeddings.