Integrierte KI-APIs: Tipps

Veröffentlicht am 30. April 2026

Mit der integrierten KI kann Ihre Website oder Webanwendung KI-gestützte Aufgaben ausführen, ohne dass Sie Modelle bereitstellen, verwalten oder selbst hosten müssen. Es kann schwierig sein, von einer Demo zu einer produktionsreifen Funktion zu wechseln. In diesem Dokument werden technische und UX-Überlegungen behandelt, die Ihnen helfen, häufige Fehler zu vermeiden.

Modell frühzeitig vorbereiten

Gilt für: alle APIs, z. B. Summarizer, Translator und Writer.

Empfehlung:Initialisieren Sie die Sitzung, sobald Sie die Nutzerabsicht erkennen. Da die Nutzeraktivierung erforderlich ist, um eine Sitzung zu initialisieren, können Sie jede Interaktion verwenden, z. B. einen Klick an einer beliebigen Stelle auf der Seite, die eine KI-gestützte Funktion bietet. Dadurch werden das Modell und die Laufzeit vorbereitet, während der Nutzer mit der Benutzeroberfläche interagiert. Starten Sie bei Bedarf die nächste wahrscheinlichste KI-Aufgabe, sobald Sie mit dem Rendern des Ergebnisses beginnen.

Nicht empfehlenswert: Warten Sie nicht, bis der Nutzer auf „Generieren“ klickt, um die Sitzung zu initialisieren. Dies führt zu einer Kaltstartverzögerung von mehreren Sekunden, da das Modell zuerst in den Arbeitsspeicher geladen und die Ausführungspipeline vorbereitet werden muss.

Anfängliche Prompts bei der Erstellung festlegen

Gilt für: Prompt API.

Empfehlung:Geben Sie bei der Sitzungsinitialisierung Systemanweisungen an, um die Geschwindigkeit des ersten Prompts zu verbessern.

Nicht empfehlenswert: Beginnen Sie nicht mit einer leeren Sitzung und senden Sie Systemanweisungen als Teil des ersten prompt()-Aufrufs. Dadurch erhöht sich die Latenz, da das Modell diese Anweisungen erst im letzten Moment verarbeiten muss.

// ✅ DO: Create the session as early as possible (tip on warming up the model early) and use initialPrompts for system instructions in the create call
const session = await LanguageModel.create({
  initialPrompts: [
    { role: 'system', content: 'You are a helpful assistant specialized in code reviews.' }
  ]
});

// A few moments later, when the user triggers the AI feature
const review = await session.prompt(`Review the following code:\n\n${code}`);

// ❌ DON'T: Send instructions using prompt() after creation
// const slowerSession = await LanguageModel.create();
// await slowerSession.prompt(`You are a helpful assistant specialized in code reviews.\n\nReview the following code:\n\n${code}`); // Higher latency

Sitzungen für wiederholte Aufgaben klonen

Gilt für: Prompt API.

Bei der Prompt API wird in jeder Sitzung der Kontext der Unterhaltung erfasst, und alle vorherigen Interaktionen berücksichtigt. Da ein Klon alles von der übergeordneten Sitzung erbt, einschließlich der anfänglichen Prompts und des gesamten Interaktionsverlaufs bis zum Zeitpunkt des Klonens, sollten Sie die Nutzung so strukturieren, dass nur das übernommen wird, was Sie benötigen.

Empfehlung :

  • Basissitzung erstellen: Um nicht zusammenhängende Aufgaben effizient zu bearbeiten, erstellen Sie eine Basissitzung, die nur Ihre Systemanweisungen und keinen vorherigen Unterhaltungskontext enthält.
  • Basissitzung klonen: Verwenden Sie clone() für diese Basissitzung für neue Aufgaben, um den Aufwand für das erneute Parsen umfangreicher Systemanweisungen zu vermeiden. So können Sie parallele Unterhaltungen erstellen oder eine Aufgabe auf die Basissitzung zurücksetzen.

Nicht empfehlenswert:

  • Verwenden Sie nicht dieselbe Sitzung für nicht zusammenhängende Aufgaben und klonen Sie keine Sitzung, die bereits einen unnötigen Interaktionsverlauf enthält. Beide Muster können dazu führen, dass nicht zusammenhängender vorheriger Kontext die aktuelle Aufgabe beeinträchtigt.
  • Rufen Sie create() nicht wiederholt mit identischen, umfangreichen Systemanweisungen auf. Verwenden Sie stattdessen das Klonmuster, um die Leistung zu optimieren.
// ✅ DO: Create a baseline session and clone it for each new task
const baseSession = await LanguageModel.create({
  initialPrompts: [{
    role: 'system',
    content: 'You are a technical editor...',
  }],
});

// Clone the base session once for the first task
const task1 = await baseSession.clone();
const response1 = await task1.prompt("Review this first draft...");
// ... Repeat the cloning pattern for subsequent independent tasks
// Each task starts fresh from the baseline system instructions

// ❌ DON'T:
// Bad performance pattern: repeated create() calls for identical tasks.
// This forces the model to re-parse instructions every time, increasing latency.
// const sessionA = await LanguageModel.create({ initialPrompts: [...] });
// await sessionA.prompt("Task 1...");
// const sessionB = await LanguageModel.create({ initialPrompts: [...] });
// await sessionB.prompt("Task 2...");
// Bad quality pattern: reusing the same session for unrelated tasks.
// const session = await LanguageModel.create();
// await session.prompt("Analyze this financial report...");
// Unrelated task in the same session:
// await session.prompt("Now write a children's story...");

Nicht verwendete Sitzungen beenden

Gilt für: alle APIs.

Empfehlung: Rufen Sie destroy() explizit für Sitzungen auf, die Sie nicht mehr benötigen, um Arbeitsspeicher freizugeben, wenn eine Funktion nicht mehr verwendet wird. Wenn Sie ein Klonmuster verwenden, behalten Sie die Basissitzung bei und beenden Sie die Klone, die Sie nicht mehr benötigen.

Nicht empfehlenswert: Lassen Sie nicht mehrere große Sitzungen aktiv. Jede Sitzung belegt Arbeitsspeicher, was zu einer unnötigen Ressourcennutzung führt und zu einem Problem werden kann. Sitzungen werden automatisch vom Garbage Collector bereinigt, aber durch den Aufruf von destroy() wird Arbeitsspeicher schneller freigegeben.

// ✅ DO: Use the clone and destroy it immediately after
const clone = await baseSession.clone();
const response = await clone.prompt("Quick task...");
// Free memory right away: destry the clone, keep the baseSession
clone.destroy();

Streaming-Antworten sicher und effizient rendern

Gilt für: alle APIs mit Streaming-Unterstützung (Prompt, Summarizer, Writer, Rewriter und Translator).

Empfehlung:Behandeln Sie alle LLM-Ausgaben als nicht vertrauenswürdige Inhalte. Bereinigen Sie die gesamte kombinierte Ausgabe und nicht nur Chunks, da bösartiger Code auf mehrere Updates verteilt sein kann. Verwenden Sie vor dem Rendern die Sanitizer API sofern sie unterstützt wird. Um eine Leistungseinbuße zu vermeiden, verwenden Sie einen Streaming-Markdown-Parser wie streaming-markdown.

Nicht empfehlenswert: Legen Sie innerHTML nicht direkt bei jedem Chunk-Update fest. Das ist langsam, insbesondere bei komplexer Formatierung wie der Syntaxhervorhebung, und anfällig für Injection.

import * as smd from "streaming-markdown";
// Set up virtual buffer and Sanitizer API
const sanitizer = new Sanitizer({
  allowElements: ['figure', 'figcaption', 'p', 'br', 'strong', 'em', 'img', 'a'],
  allowAttributes: {
    'loading': ['img'], 'decoding': ['img'], 'src': ['img'], 'href': ['a']
  }
});

// Create an off-screen fragment so the parser doesn't cause flicker
// or trigger XSS in the live DOM during the building process.
const buffer = new DocumentFragment();
const parser = smd.parser_new(buffer);

// Use sanitizer as a gatekeeper / cleaner function so we can combine it with the streaming Markdown parser
function syncSanitized(target, sourceFragment) {
  // .sanitize() returns a fresh, clean DocumentFragment
  const cleanFragment = sanitizer.sanitize(sourceFragment);
  // replaceChildren is the modern high-performance way to swap DOM content
  target.replaceChildren(cleanFragment);
}

// Streaming Logic
// `chunks` keeps track of the raw string (useful for logs/debug)
chunks += chunk;
// Let the parser build the DOM incrementally in the buffer.
// This is high-performance because the buffer is not live
smd.parser_write(parser, chunk);
// Use the Sanitizer API to port the content safely to the container.
syncSanitized(container, buffer);

Eingabe für Geschwindigkeit optimieren

Gilt für: alle APIs.

Empfehlung:Übergeben Sie nur das an das Modell, was unbedingt erforderlich ist. Entfernen Sie alles, was für die aktuelle Aufgabe irrelevant ist. Geben Sie bei großen Datasets eine kurze Übersicht und eine kleine Auswahl relevanter Elemente an.

Nicht empfehlenswert: Senden Sie keine rohen, unverarbeiteten Texte, unnötigen Metadaten, HTML-Tags oder großen ungefilterten Listen an die APIs. Die Latenz nimmt mit der Eingabegröße erheblich zu, wodurch die KI-Funktion auf vielen Geräten fehlerhaft erscheinen kann.

// ✅ DO: Send only relevant text
const cleanText = document.querySelector('#article').innerText;
const summary = await Summarizer.summarize(cleanText);

// ❌ DON'T: Send the entire DOM structure
// const dirtyText = document.querySelector('#article').innerHTML;

Strukturierte Ausgabe für vorhersagbare Ergebnisse verwenden

Gilt für: Prompt API.

Empfehlung: Wenn das Modell Daten in einem bestimmten Format zurückgeben soll, verwenden Sie eine strukturierte Ausgabe, indem Sie ein responseConstraint Feld mit einem JSON-Schema angeben. So ist die Ausgabe vorhersagbar und Sie benötigen keine komplexe Nachbearbeitung oder manuelle Analyse.

Nicht empfehlenswert: Verlassen Sie sich nicht nur auf Anweisungen in natürlicher Sprache (z. B. „Nur JSON ausgeben“) allein. Modelle können Unterhaltungsfüller enthalten, die Ihren Parser beschädigen.

// ✅ DO: Use a JSON Schema for predictable results
const schema = {
  type: "object",
  properties: {
    isTopicCats: { type: "boolean" }
  }
};

const result = await session.prompt(`Is this post about cats?\n\n${post}`, {
  responseConstraint: schema,
});
console.log(JSON.parse(result).isTopicCats);

Generierung von Längenbeschränkungen entkoppeln

Gilt für: Prompt API, da sie die einzige API ist, die strukturierte Ausgabeschemas unterstützt.

Empfehlung:Lassen Sie das Modell die Antwort auf natürliche Weise generieren und kürzen Sie den Text dann mit clientseitiger Logik, damit er in die Benutzeroberfläche passt.

Nicht empfehlenswert: Erzwingen Sie keine strengen Zeichenlimits wie maxLength: 125 mit strukturierten Ausgabeschemas. Wenn die Antwort eines Modells länger als das von Ihnen festgelegte Limit ist, wechselt das Modell möglicherweise zu Token mit hoher Dichte wie Fremdsprachen oder Emojis, um die Bedeutung zu komprimieren, was zu unsinnigen Ausgaben führt.

/*  DO: Handle overflow using CSS */
.result {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis; /* Displays '…' */
}
// ❌ DON'T: Force length in the prompt
const result = await session.prompt("Write a bio in exactly 50 characters.");

Geduld der Nutzer berücksichtigen

Gilt für: alle APIs.

Empfehlung:Verwenden Sie Animationen und UI-Techniken, um die Geduld der Nutzer zu berücksichtigen. Der optimale Ansatz hängt von Ihrem Anwendungsfall und der erwarteten Länge der API-Ausgabe ab. Vorschläge:

  • Streaming für lange Inhalte: Bei Zusammenfassungen oder Chats wird standardmäßig ein Schreibmaschineneffekt pro Token erstellt. Das kann sich natürlich anfühlen und sofortiges Feedback geben.
  • Nicht-Streaming für kurze Aufgaben (oder lange asynchrone Aufgaben): Bei kurzen Ausgaben, z. B. Alt-Text, kann Nicht-Streaming eine elegantere Benutzeroberfläche erstellen. Außerdem haben Sie Zeit, die nächste KI-Aufgabe spekulativ vorzubereiten, während die aktuelle Aufgabe gerendert wird. Dieser Ansatz funktioniert auch für längere asynchrone oder Hintergrundaufgaben. Wenn der Nutzer nicht durch die Ausgabe blockiert wird, um fortzufahren, ist es nicht dringend erforderlich, die Ausgabe sofort zu erstellen. Signalisieren Sie auf der Benutzeroberfläche, dass der Vorgang läuft.
  • Visuelle Übergänge für Updates: Verwenden Sie beim Übersetzen oder Umschreiben von Text Animationen, z. B. Wortmorphing.

Nicht empfehlenswert: Aktualisieren Sie die Benutzeroberfläche ohne visuelle Hinweise.

An das mentale Modell des Nutzers von Zeit und Arbeit anpassen

Gilt für: alle APIs.

Empfehlung:Erwägen Sie eine künstliche Verzögerung von ein oder zwei Sekunden, wenn eine Antwort fast sofort erfolgt. Paradoxerweise finden Nutzer Ergebnisse möglicherweise vertrauenswürdiger, wenn sie einen Generierungsprozess wahrnehmen, der mit der von ihnen wahrgenommenen Schwierigkeit der Aufgabe übereinstimmt. Verwenden Sie Animationen, um zu signalisieren, dass ein KI-Prozess stattgefunden hat.

Nicht empfehlenswert: Überraschen Sie Nutzer nicht mit sofortigen UI-Ersetzungen.

Nutzern ermöglichen, schnell zu navigieren und KI-Bearbeitungen rückgängig zu machen

Gilt für: alle APIs.

Empfehlung:Statten Sie Ihre Benutzeroberfläche mit einem Stepper oder einem Navigationsverlauf aus, mit dem Nutzer verschiedene Ergebnisse sicher erkunden und KI-Bearbeitungen schnell rückgängig machen können. So sind verschiedene Versionen weiterhin leicht verfügbar.

Nicht empfehlenswert: Überschreiben Sie nicht den vorherigen Entwurf des Nutzers oder ein KI-Ergebnis, das ihm gefallen hat, ohne die Möglichkeit, zurückzugehen, die Änderungen rückgängig zu machen oder Versionen zu vergleichen.

Stepper-UI-Element mit Navigationsverlauf.
UI-Muster: Vorschlag ablehnen / annehmen (Google Docs)
Schaltfläche zum Rückgängigmachen aller Änderungen durch den Kundenservicemitarbeiter in einer Google Antigravity-Benutzeroberfläche.
UI-Muster: Alle Bearbeitungen des KI-Agents rückgängig machen (Google Antigravity)
Mit den Schaltflächen „Vorschlag ablehnen“ oder „Vorschlag annehmen“ in Google Docs können Sie Vorschläge ablehnen oder annehmen.
UI-Muster: Stepper (Alt-Text-Demo)

Nutzerkontrolle und Überschreibungen ermöglichen

Gilt für: alle APIs.

Empfehlung:Lassen Sie den Nutzer immer das letzte Wort haben. Bieten Sie eine Möglichkeit, Vorschläge manuell zu überschreiben. Die APIs können falsche Ergebnisse liefern.

Nicht empfehlenswert: Erzwingen Sie ein KI-generiertes Ergebnis als einzige Option.

Ergebnisse für wiederholte Aufgaben im Cache speichern

Gilt für: alle APIs.

Empfehlung:Implementieren Sie einen lokalen Ergebnis-Cache (z. B. mit sessionStorage oder IndexedDB) für wiederholte Eingaben oder Abfragen. Normalisieren Sie die Eingabe, indem Sie Leerzeichen entfernen und Kleinbuchstaben verwenden, um die Cache-Treffer zu erhöhen. Generieren Sie für umfangreiche Eingaben, z. B. Bilder, einen Hash, der als Cache-Schlüssel verwendet werden kann. Legen Sie eine konservative Gültigkeitsdauer (Time to Live, TTL) für Ihren Cache fest (oder stellen Sie im Cache gespeicherte Ergebnisse bereit, während Sie sie im Hintergrund aktualisieren). Ermöglichen Sie dem Nutzer, eine neue Inferenz auszulösen, wenn das Ergebnis nicht zufriedenstellend ist.

Nicht empfehlenswert: Führen Sie nicht dieselbe Inferenz für eine wiederholte Suchanfrage oder identische Dateneingabe aus, z. B. wenn ein Nutzer zwischen Suchergebnissen hin und her navigiert. Die Inferenz auf dem Gerät ist zwar in Bezug auf die Cloud-Kosten kostenlos, aber teuer in Bezug auf die Nutzerzeit und die Akkulaufzeit.

// ✅ DO: Check a local cache before running inference
async function getAiResponse(userInput, forceRefresh = false) {
  // Normalize the query to increase cache hits
  const query = userInput.trim().toLowerCase();
  const cacheKey = `ai_results_${query}`;
  const TTL_MS = 3600000; // 1 hour conservative TTL

  if (!forceRefresh) {
    const itemStr = localStorage.getItem(cacheKey);
    if (itemStr) {
      const item = JSON.parse(itemStr);
      const now = Date.now();

      // Check if the item has expired
      if (now < item.expiry) {
        // Lightweight safety check before rendering
        if (isValid(item.value)) return item.value;
      } else {
        // Delete the stale entry if the TTL has passed
        localStorage.removeItem(cacheKey);
      }
    }
  }

  // Fallback: Run inference if no valid cache exists
  const session = await LanguageModel.create();
  const response = await session.prompt(userInput);

  // Store the result for future use (with an expiration)
  const cacheData = {
    value: response,
    expiry: Date.now() + TTL_MS
  };
  localStorage.setItem(cacheKey, JSON.stringify(cacheData));

  return response;
}