Pubblicato il 27 gennaio 2025
L'API Prompt è una delle API di IA integrate che il team di Chrome sta esplorando. Puoi testarlo localmente con le tue app partecipando al programma di anteprima o in produzione nelle estensioni di Chrome registrandoti alla prova dell'origine dell'API Prompt per le estensioni di Chrome. 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.
I casi d'uso per la gestione delle sessioni per una o più sessioni parallele sono, ad esempio, i chatbot classici in cui un utente interagisce con un'IA o i sistemi di gestione del rapporto con i clienti in cui un agente dell'assistenza gestisce più clienti in parallelo e utilizza l'IA per tenere traccia delle varie conversazioni.
Inizializzare una sessione con un prompt di sistema
Il primo concetto da conoscere è il prompt del sistema. Imposta il contesto complessivo di una sessione all'inizio. 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 hai un'app in cui, al termine di una sessione, vuoi avviarne una nuova o se hai un'app in cui vuoi avere conversazioni indipendenti in sessioni diverse in parallelo, puoi utilizzare il concetto di clonazione di una sessione principale. Il clone eredita i parametri della sessione come temperature
o
topK
dall'originale, nonché la potenziale cronologia delle interazioni con la sessione.
Questo è utile, ad esempio, se hai inizializzato la sessione principale con un prompt di sistema. In questo modo, l'app deve eseguire questa operazione una sola volta e tutti i cloni erediteranno la 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
Il terzo concetto da apprendere è quello dei prompt iniziali. Il suo scopo originale è utilizzarlo per i prompt n, ovvero per preparare il modello con un insieme di n prompt e risposte di esempio, in modo che le sue risposte ai prompt effettivi siano più accurate. Se tieni traccia delle conversazioni in corso con il modello, puoi "abusare" del concetto di prompt iniziale per ripristinare una sessione, ad esempio dopo il riavvio di un browser, in modo che l'utente possa continuare con il modello da dove aveva interrotto. Lo snippet di codice seguente mostra come puoi procedere, supponendo che tu tenga traccia della cronologia della sessione in localStorage.
// 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 quando la sua risposta non è utile
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
che consente all'utente di interrompere la sessione di risposta.
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". Buon lavoro con i prompt!
Ringraziamenti
Questa guida è stata esaminata da Sebastian Benz, Andre Bandarra, François Beaufort e Alexandra Klepper.