Best practice per la gestione delle sessioni con l'API Prompt

Data di pubblicazione: 27 gennaio 2025

Spiegazione Web Estensioni Stato di Chrome Intenzione
GitHub Sperimentale In EPP Dietro una bandiera Prova di Origin Non applicabile Non applicabile

Una funzionalità chiave dell'API Prompt sono le sessioni. Ti consentono di avere una o più conversazioni in corso con il modello di IA, senza che il modello perda il contesto di ciò che è stato detto. Questa guida illustra le best practice per la gestione delle sessioni con il modello linguistico.

Ti consigliamo di utilizzare la gestione delle sessioni per una o più sessioni parallele se stai creando un chatbot classico in cui un utente interagisce con l'IA. In alternativa, se hai un sistema di gestione del rapporto con i clienti in cui un agente dell'assistenza si occupa di più clienti in parallelo e utilizza l'IA per tenere traccia delle varie conversazioni.

Inizializzare una sessione con un prompt di sistema

Un prompt del sistema configura il contesto della sessione all'avvio. Ad esempio, puoi utilizzare il prompt di sistema per indicare al modello come deve rispondere.

// 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'

Clona una sessione principale

Se vuoi avviare una nuova sessione al termine di una o se vuoi avere più conversazioni indipendenti in parallelo, puoi clonare una sessione principale.

Il clone eredita i parametri della sessione, ad esempio temperature o topK, e qualsiasi cronologia delle interazioni con la sessione. Questo è utile se, ad esempio, hai inizializzato la sessione principale con una richiesta di sistema. In questo modo, l'app deve eseguire questa operazione solo una volta: tutti i cloni ereditano il prompt del sistema dalla sessione principale.

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

Ripristinare una sessione precedente

Con i prompt iniziali, puoi preparare il modello con un insieme di prompt e risposte di esempio per generare risultati migliori. Questo approccio viene spesso utilizzato nel prompting con più foto per creare risposte che rispecchino le tue aspettative.

Se tieni traccia delle conversazioni in corso con il modello, puoi utilizzare questa procedura per ripristinare una sessione. Ad esempio, dopo il riavvio di un browser, puoi aiutare l'utente a continuare a interagire con il modello da dove aveva interrotto. Un approccio è tenere traccia della cronologia delle sessioni nello spazio di archiviazione locale.

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

Mantieni la quota di sessione consentendo all'utente di interrompere il modello

Ogni sessione ha una finestra di contesto che puoi visualizzare accedendo ai campi pertinenti della sessione maxTokens, tokensLeft e tokensSoFar.

const { maxTokens, tokensLeft, tokensSoFar } = languageModel;

Se questa finestra di contesto viene superata, la sessione perde il controllo dei messaggi più vecchi, il che può essere spiacevole perché questo contesto potrebbe essere stato importante. Per preservare la quota, se dopo aver inviato un prompt l'utente ritiene che una risposta non sia utile, consenti di interrompere la risposta del modello linguistico utilizzando AbortController.

Sia il metodo prompt() sia il metodo promptStreaming() accettano un secondo parametro facoltativo con un campo signal per consentire all'utente di interrompere la sessione.

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

Guarda la gestione delle sessioni AI in azione nella demo di gestione delle sessioni AI. Crea più conversazioni parallele con l'API Prompt, ricarica la scheda o persino riavvia il browser e continua da dove avevi interrotto. Consulta il codice sorgente su GitHub.

Conclusioni

Gestendo attentamente le sessioni di AI con queste tecniche e best practice, puoi sfruttare tutto il potenziale dell'API Prompt, offrendo applicazioni più efficienti, rispondibili e incentrate sull'utente. Puoi anche combinare questi approcci, ad esempio consentendo all'utente di clonare una sessione passata ripristinata, in modo da eseguire scenari "what if".

Ringraziamenti

Questa guida è stata esaminata da Sebastian Benz, Andre Bandarra, François Beaufort e Alexandra Klepper.