Best practices voor AI-sessiebeheer met de Prompt API

Gepubliceerd: 27 januari 2025

De Prompt API is een van de ingebouwde AI API’s die het Chrome-team onderzoekt. U kunt het lokaal testen met uw apps door deel te nemen aan het vroege preview-programma , of in productie in uw Chrome-extensies door u aan te melden voor de Prompt API Origin-proefversie voor Chrome-extensies . Een belangrijk kenmerk van de Prompt API zijn sessies. Ze laten je één of meerdere lopende gesprekken voeren met het AI-model, zonder dat het model de context van wat er gezegd wordt uit het oog verliest. Deze handleiding introduceert best practices voor sessiebeheer met het taalmodel.

Use cases voor sessiebeheer voor een of meer parallelle sessies zijn bijvoorbeeld klassieke chatbots waarbij één gebruiker communiceert met een AI, of klantrelatiebeheersystemen waarbij één supportagent meerdere klanten parallel behandelt en gebruik maakt van AI om de ondersteuning te helpen. agent houdt de verschillende gesprekken bij.

Initialiseer een sessie met een systeemprompt

Het eerste concept waar u rekening mee moet houden, is de systeemprompt. Het bepaalt aan het begin de algemene context van een sessie. U kunt bijvoorbeeld de systeemprompt gebruiken om het model te vertellen hoe het moet reageren.

// Make this work in web apps and in extensions.
const aiNamespace = self.ai || chrome.aiOriginTrial || chrome.ai;
const languageModel = await aiNamespace.languageModel.create({
  systemPrompt: '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'

Kloon een hoofdsessie

Als je een app hebt waarmee je, wanneer een sessie voorbij is, een nieuwe wilt starten, of als je een app hebt waarin je onafhankelijke gesprekken in verschillende sessies parallel wilt voeren, kun je gebruik maken van het concept van het klonen van een hoofdsessie. sessie. De kloon neemt sessieparameters zoals de temperature of de topK over van het origineel, evenals de potentiële sessie-interactiegeschiedenis. Dit is bijvoorbeeld handig als u de hoofdsessie hebt geïnitialiseerd met een systeemprompt. Op deze manier hoeft uw app dit werk slechts één keer te doen en nemen alle klonen over van de hoofdsessie.

// Make this work in web apps and in extensions.
const aiNamespace = self.ai || chrome.aiOriginTrial || chrome.ai;
const languageModel = await aiNamespace.languageModel.create({
  systemPrompt: '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

Het derde concept dat we moeten leren is het concept van de initiële aanwijzingen. Het oorspronkelijke doel is om het te gebruiken voor n -shot prompts, dat wil zeggen om het model te primen met een set van n voorbeeldprompts en -reacties, zodat de reacties op daadwerkelijke prompts nauwkeuriger zijn. Als u lopende gesprekken met het model bijhoudt, kunt u het concept van de initiële prompts voor het herstellen van een sessie 'misbruiken', bijvoorbeeld nadat de browser opnieuw is opgestart, zodat de gebruiker verder kan gaan met het model waar hij was gebleven. Het volgende codefragment laat zien hoe u dit kunt aanpakken, ervan uitgaande dat u de sessiegeschiedenis in localStorage bijhoudt.

// Make this work in web apps and in extensions.
const aiNamespace = self.ai || chrome.aiOriginTrial || chrome.ai;

// 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 aiNamespace.languageModel.capabilities();
  sessionData = {
    systemPrompt: '',
    initialPrompts: [],
    topK: defaultTopK,
    temperature: defaultTemperature,
  };
}

// Initialize the session with the (previously stored or new) session data.
const languageModel = await aiNamespace.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 het sessiequotum door de gebruiker het model te laten stoppen als het antwoord niet nuttig is

Elke sessie heeft een contextvenster dat u kunt zien door toegang te krijgen tot de relevante velden maxTokens , tokensLeft en tokensSoFar van de sessie.

const { maxTokens, tokensLeft, tokensSoFar } = languageModel;

Wanneer dit contextvenster wordt overschreden, raakt de sessie de oudste berichten kwijt, wat ongewenst kan zijn omdat deze context belangrijk kan zijn geweest. Om de quota te behouden, als de gebruiker na het indienen van een prompt ziet dat een antwoord niet nuttig zal zijn, kunt u hem/haar toestaan ​​het taalmodel te laten stoppen met antwoorden door gebruik te maken van de AbortController . Zowel de methoden prompt() als promptStreaming() accepteren een optionele tweede parameter met een signal , waardoor de gebruiker kan voorkomen dat de sessie antwoordt.

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

Demo

Zie AI-sessiebeheer in actie in de demo van AI-sessiebeheer . Creëer meerdere parallelle gesprekken met de Prompt API, laad het tabblad opnieuw of start zelfs uw browser opnieuw op en ga verder waar u was gebleven. Zie de broncode op GitHub .

Conclusies

Door AI-sessies zorgvuldig te beheren met deze technieken en best practices, kunt u het volledige potentieel van de Prompt API ontsluiten, waardoor efficiëntere, responsievere en gebruikersgerichte applicaties worden geleverd. U kunt deze benaderingen ook combineren, bijvoorbeeld door de gebruiker een herstelde eerdere sessie te laten klonen, zodat hij 'wat als'-scenario's kan uitvoeren. Veel plezier met vragen!

Dankbetuigingen

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