Best Practices für die Sitzungsverwaltung mit der Prompt API

Thomas Steiner
Thomas Steiner

Veröffentlicht am 27. Januar 2025

Erklärung Web Erweiterungen Chrome-Status Absicht
GitHub Experimentell Im EPP Chrome 138 Ansicht Absicht, Tests durchzuführen

Ein wichtiges Feature der Prompt API sind Sitzungen. Sie ermöglichen es Ihnen, eine oder mehrere laufende Unterhaltungen mit dem KI-Modell zu führen, ohne dass das Modell den Kontext der Aussagen verliert. In diesem Leitfaden werden Best Practices für die Sitzungsverwaltung mit dem Sprachmodell vorgestellt.

Die Sitzungsverwaltung für eine oder mehrere parallele Sitzungen kann sinnvoll sein, wenn Sie einen klassischen Chatbot entwickeln, bei dem ein Nutzer mit KI interagiert. Oder wenn Sie ein CRM-System (Customer Relationship Management) haben, in dem ein Supportmitarbeiter mehrere Kunden gleichzeitig betreut und KI nutzt, um den Überblick über die verschiedenen Unterhaltungen zu behalten.

Sitzungen mit einem ersten Prompt initialisieren

Mit einem ersten Prompt wird zu Beginn der Sitzung der Kontext festgelegt. Sie können beispielsweise mit dem ursprünglichen Prompt dem Modell mitteilen, wie es reagieren soll.

const languageModel = await LanguageModel.create({
  initialPrompts: [{
    role: 'system',
    content: 'You are a helpful assistant and you speak like a pirate.'
  }],
});
console.log(await languageModel.prompt('Tell me a joke.'));
// 'Avast ye, matey! What do you call a lazy pirate?\n\nA **sail-bum!**\n\nAhoy
// there, me hearties!  Want to hear another one? \n'

Hauptsitzung klonen

Wenn Sie nach dem Ende einer Sitzung eine neue Sitzung starten oder mehrere unabhängige Unterhaltungen parallel führen möchten, können Sie eine Hauptsitzung klonen.

Der Klon übernimmt Sitzungsparameter wie temperature oder topK sowie den gesamten Sitzungsinteraktionsverlauf. Das ist beispielsweise nützlich, wenn Sie die Hauptsitzung mit einem ersten Prompt initialisiert haben. So muss Ihre App diese Arbeit nur einmal ausführen. Alle Klone übernehmen den ursprünglichen Prompt aus der Hauptsitzung.

const languageModel = await LanguageModel.create({
  initialPrompts: [{
    role: 'system',
    content: 'You are a helpful assistant and you speak like a pirate.'
  }]
});

// The original session `languageModel` remains unchanged, and
// the two clones can be interacted with independently from each other.
const firstClonedLanguageModel = await languageModel.clone();
const secondClonedLanguageModel = await languageModel.clone();
// Interact with the sessions independently.
await firstClonedLanguageModel.prompt('Tell me a joke about parrots.');
await secondClonedLanguageModel.prompt('Tell me a joke about treasure troves.');
// Each session keeps its own context.
// The first session's context is jokes about parrots.
await firstClonedLanguageModel.prompt('Tell me another.');
// The second session's context is jokes about treasure troves.
await secondClonedLanguageModel.prompt('Tell me another.');

Frühere Sitzung wiederherstellen

Mit ersten Prompts können Sie das Modell mit einer Reihe von Beispiel-Prompts und ‑Antworten vorbereiten, um bessere Ergebnisse zu erzielen. Das wird häufig beim n-shot-Prompting verwendet, um Antworten zu erstellen, die Ihren Erwartungen entsprechen.

Wenn Sie den Überblick über laufende Unterhaltungen mit dem Modell behalten, können Sie diese Methode verwenden, um eine Sitzung wiederherzustellen. Wenn ein Browser beispielsweise neu gestartet wird, können Sie dem Nutzer helfen, die Interaktion mit dem Modell dort fortzusetzen, wo er aufgehört hat. Eine Möglichkeit besteht darin, den Sitzungsverlauf im lokalen Speicher zu verfolgen.

// Restore the session from localStorage, or initialize a new session.
// The UUID is hardcoded here, but would come from a
// session picker in your user interface.
const uuid = '7e62c0e0-6518-4658-bc38-e7a43217df87';

function getSessionData(uuid) {
  try {
    const storedSession = localStorage.getItem(uuid);
    return storedSession ? JSON.parse(storedSession) : false;
  } catch {
    return false;
  }
}

let sessionData = getSessionData(uuid);

// Initialize a new session.
if (!sessionData) {
  // Get the current default parameters so they can be restored as they were,
  // even if the default values change in the future.
  const { defaultTopK, defaultTemperature } =
    await LanguageModel.params();
  sessionData = {
    initialPrompts: [],
    topK: defaultTopK,
    temperature: defaultTemperature,
  };
}

// Initialize the session with the (previously stored or new) session data.
const languageModel = await LanguageModel.create(sessionData);

// Keep track of the ongoing conversion and store it in localStorage.
const prompt = 'Tell me a joke';
try {
  const stream = languageModel.promptStreaming(prompt);
  let result = '';
  // You can already work with each `chunk`, but then store
  // the final `result` in history.
  for await (const chunk of stream) {
    // In practice, you'd render the chunk.
    console.log(chunk);
    result = chunk;
  }

  sessionData.initialPrompts.push(
    { role: 'user', content: prompt },
    { role: 'assistant', content: result },
  );

  // To avoid growing localStorage infinitely, make sure to delete
  // no longer used sessions from time to time.
  localStorage.setItem(uuid, JSON.stringify(sessionData));
} catch (err) {
  console.error(err.name, err.message);
}

Sitzungskontingent schonen, indem der Nutzer das Modell beenden kann

Jede Sitzung hat ein Kontextfenster, das Sie aufrufen können, indem Sie auf die relevanten Felder der Sitzung zugreifen: maxTokens, tokensLeft und tokensSoFar.

const { maxTokens, tokensLeft, tokensSoFar } = languageModel;

Wenn dieses Kontextfenster überschritten wird, gehen die ältesten Nachrichten in der Sitzung verloren. Wenn der Kontext wichtig war, kann dies zu schlechteren Ergebnissen führen. Um das Kontingent zu schonen, sollten Nutzer die Sitzung mit AbortController beenden können, wenn sie die Antwort des Modells nicht für nützlich halten.

Sowohl die Methode prompt() als auch die Methode promptStreaming() akzeptieren einen optionalen zweiten Parameter mit einem signal-Feld, damit der Nutzer die Sitzung beenden kann.

const controller = new AbortController();
stopButton.onclick = () => controller.abort();

try {
  const stream = languageModel.promptStreaming('Write me a poem!', {
    signal: controller.signal,
  });
  for await (const chunk of stream) {
    console.log(chunk);
  }
} catch (err) {
  // Ignore `AbortError` errors.
  if (err.name !== 'AbortError') {
    console.error(err.name, err.message);
  }
}

Nicht verwendete Sitzungen entfernen

Jede Sitzung belegt Arbeitsspeicher. Wenn Sie mehrere große Sitzungen gestartet haben, kann dies zu einem Problem werden. Löschen Sie nicht verwendete Sitzungen, um die Ressourcenverfügbarkeit zu erhöhen.

Demo

Demo zur KI-Sitzungsverwaltung Sie können mehrere parallele Unterhaltungen mit der Prompt API erstellen, den Tab neu laden oder sogar den Browser neu starten und dort weitermachen, wo Sie aufgehört haben. Quellcode auf GitHub

Das volle Potenzial der Prompt API nutzen

Wenn Sie KI-Sitzungen mit diesen Techniken und Best Practices sorgfältig verwalten, können Sie das volle Potenzial der Prompt API nutzen und effizientere, reaktionsschnellere und nutzerorientiertere Anwendungen entwickeln. Sie können diese Ansätze auch kombinieren, indem Sie dem Nutzer beispielsweise erlauben, eine wiederhergestellte vergangene Sitzung zu klonen, damit er „Was wäre wenn“-Szenarien ausführen kann.

Danksagungen

Diese Anleitung wurde von Sebastian Benz, Andre Bandarra, François Beaufort und Alexandra Klepper geprüft.