Best practices voor sessiebeheer met de Prompt API

Thomas Steiner
Thomas Steiner

Gepubliceerd: 27 januari 2025

Uitlegger Web Uitbreidingen Chrome-status Intentie
GitHub Oorsprongsproef In Origin-proef Chroom 138 Weergave Intentie om te experimenteren

Een belangrijke functie van de Prompt API zijn sessies. Hiermee kunt u een of meerdere lopende gesprekken met het AI-model voeren, zonder dat het model de context van wat er gezegd is, uit het oog verliest. Deze handleiding introduceert best practices voor sessiebeheer met het taalmodel.

Je kunt sessiebeheer voor een of meer parallelle sessies overwegen als je een klassieke chatbot bouwt, waarbij één gebruiker met AI communiceert. Of als je een CRM-systeem hebt waarbij één supportmedewerker meerdere klanten parallel behandelt en AI gebruikt om de verschillende gesprekken bij te houden.

Initialiseer sessies met een initiële prompt

Een initiële prompt stelt aan het begin de context van de sessie in. U kunt de initiële prompt bijvoorbeeld gebruiken om het model te laten weten hoe het moet reageren.

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'

Een hoofdsessie klonen

Als u een nieuwe sessie wilt starten nadat een sessie is beëindigd, of als u meerdere onafhankelijke gesprekken parallel wilt voeren, kunt u een hoofdsessie klonen.

De kloon erft sessieparameters, zoals temperature of topK , en eventuele sessie-interactiegeschiedenis. Dit is bijvoorbeeld handig als u de hoofdsessie hebt geïnitialiseerd met een initiële prompt. Op deze manier hoeft uw app dit werk slechts één keer te doen: alle klonen erven de initiële prompt van de hoofdsessie.

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.');

Een eerdere sessie herstellen

Met initiële prompts kunt u het model voorbereiden met een set voorbeeldprompts en -reacties om betere resultaten te genereren. Dit wordt vaak gebruikt bij n-shot-prompts om reacties te creëren die uw verwachtingen weerspiegelen.

Als u lopende gesprekken met het model bijhoudt, kunt u deze methode gebruiken om een ​​sessie te herstellen. Zo kunt u uw gebruiker bijvoorbeeld helpen om na het herstarten van een browser verder te gaan met het model waar hij/zij gebleven was. Een mogelijke aanpak is om de sessiegeschiedenis lokaal op te slaan.

// 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);
}

Behoud sessiequota door de gebruiker het model te laten stoppen

Elke sessie heeft een contextvenster dat u kunt zien door de relevante velden inputQuota en inputUsage van de sessie te openen.

const { inputQuota, inputUsage } = languageModel;
const inputQuotaLeft = inputQuota - inputUsage;

Wanneer dit contextvenster wordt overschreden, verliest de sessie de oudste berichten. Dit kan leiden tot slechtere resultaten als de context belangrijk was. Om het quotum te behouden, kunt u de sessie beëindigen met AbortController als een gebruiker vaststelt dat het antwoord van het model niet nuttig is.

Zowel de prompt() - als de promptStreaming() methode accepteren een optionele tweede parameter met een signal , zodat de gebruiker de sessie kan stoppen.

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);
  }
}

Ongebruikte sessies verwijderen

Elke sessie verbruikt geheugen. Als u meerdere grote sessies hebt gestart, kan dit een probleem vormen. Verwijder ongebruikte sessies om de beschikbaarheid van resources te verhogen.

Demonstratie

Zie AI-sessiebeheer in actie in de AI-sessiebeheerdemo . Maak meerdere parallelle conversaties met de Prompt API, herlaad het tabblad of start zelfs je browser opnieuw op en ga verder waar je gebleven was. Bekijk de broncode op GitHub .

Ontgrendel het volledige potentieel van de Prompt API

Door AI-sessies zorgvuldig te beheren met deze technieken en best practices, kunt u het volledige potentieel van de Prompt API benutten en efficiëntere, responsievere en gebruikersgerichte applicaties leveren. U kunt deze benaderingen ook combineren, bijvoorbeeld door de gebruiker een herstelde eerdere sessie te laten klonen, zodat ze 'wat als'-scenario's kunnen uitvoeren.

Dankbetuigingen

Deze gids is beoordeeld door Sebastian Benz , Andre Bandarra , François Beaufort en Alexandra Klepper .