Skip to content

Vaynerov Technologies

Wir entwickeln nicht einfach — wir zaubern jede Codezeile und jeden Pixel.

Alle ArtikelBaugeschichten

Ein Concierge, der alles gelesen hat, was wir je veröffentlicht haben

Jede Agenturseite hat eine Chat-Blase. Die meisten sind ein Formular im Kostüm. Unsere musste die Arbeit kennen, den Aufenthaltsort der Preise, die Grenzen des Gründers und alle einundzwanzig Essays in diesem Journal – also haben wir sie gebaut, wie wir alles andere bauen, und aufgeschrieben, was es gekostet hat.

Edward AmirainGründer, Vaynerov Technologies
Veröffentlicht 7 Min. Lesezeit
Auf dieser Seite
  1. Identität ohne Account
  2. Immer 200
  3. Die Datei, die wir für andere Roboter geschrieben haben
  4. Ihm das Journal beibringen
  5. Wenn uns jemand beauftragen will
  6. Zahlen, die wir drucken können
  7. Grenzen, laut ausgesprochen

In der Ecke dieser Seite sitzt eine kleine Pille mit der Aufschrift das Studio fragen. Dahinter steckt das, was jede Beratungswebsite seit 2016 verspricht und fast keine geliefert hat: ein Chatfenster, das die Firma, für die es steht, tatsächlich kennt. Fragen Sie es, was ein Webplattform-Engagement umfasst, und es zählt die echten Liefergegenstände auf. Fragen Sie es, was wir von generiertem Code halten, und es zitiert den Essay. Fragen Sie es, wo Edward wohnt, und es lehnt höflich ab, denn wir haben ihm neben den Fakten auch Manieren beigebracht.

Wir hätten ein Drittanbieter-Widget über den Footer kleben und weiterziehen können. Aber wir haben we conjure every line of code & pixel unter unserem eigenen Namen gedruckt, und eine gemietete Chat-Blase, die fremdes Branding durch unsere Ecke streamt, hätte gegen jede Seite argumentiert, über der sie schwebte. Also gehört der Concierge uns von Ende zu Ende: eine Supabase Edge Function, ein OpenAI-Modell, ein Client von der Größe einer Visitenkarte und eine Wissensschicht mit einer Geschichte, die wir nicht zu erzählen erwartet hatten.

Identität ohne Account

Die erste Designentscheidung war, wer der Besucher ist. Der Chatverlauf sollte einen Seiten-Reload überleben – das Gespräch zu verlieren, weil man kurz auf der Preisseite war, ist Amateurstunde –, aber niemand will ein Konto anlegen, um eine Frage zu stellen, und wir wollten keine anonyme Authentifizierung betreiben für etwas, das strukturell ein Gästebuch mit Meinungen ist.

Identität ist deshalb ein Token: Das Widget prägt eine zufällige Thread-ID und ein Geheimnis im Speicher Ihres Browsers, und der Server behält nur einen Hash des Geheimnisses. Legen Sie das Paar vor, geht das Gespräch weiter; verlieren Sie es, fangen Sie schlicht neu an. Die Thread-Tabellen sind auf die Service-Rolle verriegelt – es existiert überhaupt keine öffentliche Lese-Policy, also gibt es nichts, was man falsch konfigurieren könnte. Es ist dieselbe Form wie die Share-Tokens, die unsere Angebotsseiten seit dem ersten Tag verwenden, und genau deshalb haben wir ihr vertraut.

Immer 200

Antworten streamen Token für Token über Server-Sent Events, und der Transport hat eine Regel, geerbt vom /blueprint-Generator: Die Antwort ist immer ein HTTP-200-Eventstream, auch wenn sie schlechte Nachrichten trägt. Rate-limitiert? Das ist ein error-Event. Thread-Token ungültig? Ein error-Event. Die Alternative – ein blankes 4xx, nachdem der CORS-Preflight bereits gelungen ist – ist ein Fehler, den der Browser sehen, Ihr JavaScript aber nicht lesen kann, das Schlechteste aus beiden Welten.

Der Stream trägt auch mehr als Text. Wenn das Modell fertig ist, liefert ein done-Event die ID der gespeicherten Antwort – das ist es, was die kleinen Daumen unter der Antwort funktionieren lässt. Wird mitten im Gespräch ein Lead erfasst, meldet ein lead-Event es der Seite, damit unsere Analytik ihn zählen kann. Das Protokoll bleibt drei Verben breit, und dabei soll es bleiben.

Missbrauch wird von Arithmetik begrenzt statt von Optimismus: zehn Anfragen pro Minute und Adresse durch denselben dauerhaften Rate-Limiter, den auch die Kontaktformulare verwenden, zweitausend Zeichen pro Nachricht, ein Kontextfenster von zwanzig Nachrichten, tausend Tokens Antwort. Ein Bot, der unser Inferenzbudget ausgeben will, muss sich hinter dem curl aller anderen anstellen.

Die Datei, die wir für andere Roboter geschrieben haben

Das interessante Problem war das Wissen. Ein Concierge, der aus dem allgemeinen Training eines Modells antwortet, ist ein Haftungsrisiko im schönen Anzug: Er erfindet Leistungen, die wir nicht verkaufen, und Preise, die wir nie genannt haben. Alles, was er über das Studio sagt, muss aus dem Studio kommen.

Hier der Teil, den wir nicht geplant hatten. Vor Monaten haben wir /llms-full.txt veröffentlicht – einen maschinenlesbaren Auszug der ganzen Seite, automatisch gepflegt aus demselben Inhalt, den die Seiten rendern, damit die KI-Assistenten anderer Leute uns korrekt beschreiben. Als wir für unseren eigenen Concierge nach einem Grounding-Korpus suchten, lag er schon da: aktuell, vollständig und ein halbes Jahr lang von den Robotern Fremder getestet. Die Function holt ihn, cacht ihn kurz und reicht ihn dem Modell mit jeder Frage. Die Datei, die wir für andere Roboter geschrieben haben, entpuppte sich als das Gehirn unseres eigenen.

Drei Schichten, eine Antwort: der feste Kanon, der Live-Auszug der Seite und was auch immer das Journal zu Ihrer Frage zu sagen hat.

Über dem Auszug sitzen zwei weitere Schichten. Ein kurzer, handgeschriebener Kanon trägt die Regeln, die nie driften dürfen: die verbotenen Wörter der Marke, die Weigerung, Zahlen zu erfinden, und ein Gründerprofil mit einer expliziten Grenze – alles, was der Concierge über Edward persönlich sagen darf, passt in sechs Stichpunkte, und der siebte ist ihm ausdrücklich zu verweigern aufgetragen. Nicht weil das Modell sonst tratschen würde, sondern weil die Grenzen eines öffentlichen Bots eine Designentscheidung sein sollten, aufgeschrieben, keine emergente Eigenschaft.

Ihm das Journal beibringen

Die dritte Schicht ist dieses Journal. Einundzwanzig Essays darüber, wie wir Dinge bauen, sind genau das Material, das die härtesten Fragen eines Besuchers verlangen – wie habt ihr Safari schnell gemacht, was ging im Museum kaputt, warum überhaupt Preise veröffentlichen –, aber bei rund sechzigtausend Wörtern kann es nicht in jeder Anfrage mitfahren.

Also werden die Essays in Passagen geschnitten und in Vektoren eingebettet, und jede eingehende Frage wird auf dieselbe Weise eingebettet und gegen sie abgeglichen. Die vier nächstliegenden Passagen, oberhalb einer Ähnlichkeitsschwelle, reisen mit dem Prompt; das Modell ist angewiesen, frei zu zitieren und die Quelle zu verlinken. Fragen Sie, wie wir Mobile Safari schnell gemacht haben, und der Concierge antwortet mit den tatsächlichen Zahlen aus /articles/making-mobile-safari-fast – der TTFB von 250 bis 950 Millisekunden, der einstellig wurde, den 91 Kilobytes JavaScript, die das initiale Bundle verließen –, weil er dieselben Absätze liest, die Sie lesen würden.

Der Index baut sich bei jedem Deploy automatisch neu. Was einen Satz ergibt, den wir gern tippen: Wenn Sie das hier lesen, hat der Concierge es auch schon gelesen. Artikel über die Maschine werden Teil der Maschine – fragen Sie ihn, wie er funktioniert, und er zitiert Ihnen genau diese Seite.

Wenn uns jemand beauftragen will

Ein Studio-Chatfenster hat einen einzigen kommerziellen Auftrag: zu bemerken, wenn ein Gespräch aufhört, Neugier zu sein, und anfängt, ein Projekt zu sein. Das Modell trägt dafür genau ein Tool – es kann einen Lead mit Name, E-Mail und einem Einzeiler-Brief ablegen, und es ist angewiesen, das höchstens einmal zu tun, nur mit Angaben, die der Besucher tatsächlich getippt hat, und nie zweimal zu fragen. Der Lead landet in derselben Tabelle wie die Leads des Kontaktformulars, das Studio wird angepingt, und der Besucher bekommt einen Satz Bestätigung statt einer Follow-up-Sequenz.

Mechanisch ist das der unglamouröseste Teil des Baus und der lehrreichste: Mitten im Stream pausiert das Modell die eigene Antwort, ruft das Tool auf, erhält das Ergebnis und spricht weiter – zwei Upstream-Anfragen, über eine einzige Verbindung zum Browser zusammengenäht, unsichtbar, solange man nicht auf die Leitung schaut. Der Besucher erlebt einen Satz. Diese Asymmetrie ist das meiste von dem, was Engineering ist.

Zahlen, die wir drucken können

~5,800
Prompt-Tokens, die mit jeder Frage mitfahren
130
Journal-Passagen im Vektorindex
6
Sprachen, in denen der Concierge Sie begrüßt
10/min
Anfragen pro Besucher, bevor der Limiter widerspricht

Am Tag der Auslieferung gemessen, nicht geschätzt – die Antwort, die die Token-Zahl erzeugte, lautete vollständig: „OK“.

Jede Antwort schreibt ihre eigenen Token-Quittungen in die Datenbank, die Monatskosten des Concierge sind also eine Query, keine Schätzung. Wir sehen auch, welche Antworten sich den Daumen nach oben darunter verdienen und welche nicht – die Bewertungen landen neben den Quittungen. Ein Feature, das man nicht messen kann, ist ein Feature, das man nicht verteidigen kann; dieses hier wird mit eigenem Kassenbuch ausgeliefert.

Grenzen, laut ausgesprochen

  • Der Journal-Index ist vorerst nur englisch. Sprachübergreifendes Matching funktioniert öfter, als es sollte, aber eine russische Frage trifft auf englische Passagen; die übersetzten Essays einzubetten ist die ehrliche Lösung, und sie steht auf der Liste.
  • Das Modell sieht die letzten zwanzig Nachrichten eines Threads. Der Anfang eines langen Gesprächs fällt irgendwann aus dem Blick; eine rollierende Zusammenfassung ist entworfen, aber nicht gebaut.
  • Das Rate-Limit gilt pro Adresse, ein Büro hinter einem Router teilt sich also ein Kontingent. Getroffen hat es noch niemand; an dem Tag, an dem es jemand tut, wird der Schlüssel klüger.
  • Der Concierge spricht für das Studio, aber er bleibt ein Sprachmodell. Er ist geerdet, begrenzt und vermessen – und sollte er je etwas sagen, was die Seite nicht sagt, gewinnt die Seite.

Ob ein Chatfenster überhaupt auf eine Studioseite gehört, ist eine faire Frage – wir haben einen ganzen Essay über Werkzeuge geschrieben, die einen respektieren, und ein schlechter Concierge ist das Gegenteil davon. Unsere Antwort war, ihn an dieselbe Latte zu halten wie alles andere hier: Er streamt, weil Warten unhöflich ist; er lehnt ab, weil Grenzen Inhalt sind; er zitiert, weil er die Quellen gelesen hat; und er geht, wenn Sie auf einer Seite sind, die ihre eigenen Möbel hat. Das Museum behält seinen eigenen Chat; unserer bleibt außerhalb des Rahmens.