Práticas recomendadas para o gerenciamento de sessões com a API Prompt

Publicado em 27 de janeiro de 2025

Explicação Web Extensões Status do Chrome Intenção
GitHub Experimental No EPP Atrás de uma sinalização Teste do Origin Não relevante Não relevante

As sessões são um recurso importante da API Prompt. Elas permitem que você tenha uma ou várias conversas em andamento com o modelo de IA, sem que ele perca o controle do contexto do que foi dito. Este guia apresenta as práticas recomendadas para gerenciamento de sessões com o modelo de linguagem.

Talvez você queira se envolver no gerenciamento de uma ou mais sessões paralelas se estiver criando um chatbot clássico, em que um usuário interage com a IA. Ou, se você tiver um sistema de gerenciamento de relacionamento com o cliente em que um representante de suporte lida com vários clientes em paralelo e usa a IA para ajudar o representante a acompanhar as várias conversas.

Inicializar uma sessão com um comando do sistema

Uma solicitação do sistema configura o contexto da sessão no início. Por exemplo, é possível usar o comando do sistema para informar ao modelo como ele deve responder.

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

Clonar uma sessão principal

Se você quiser iniciar uma nova sessão após o término de uma ou ter várias conversas independentes em paralelo, clone uma sessão principal.

O clone herda parâmetros de sessão, como temperature ou topK, e qualquer histórico de interação da sessão. Isso é útil se, por exemplo, você inicializou a sessão principal com uma solicitação do sistema. Dessa forma, seu app só precisa fazer isso uma vez. Todos os clones herdam a solicitação do sistema da sessão principal.

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

Restaurar uma sessão anterior

Com os comandos iniciais, você pode preparar o modelo com um conjunto de comandos e respostas de exemplo para gerar melhores resultados. Isso é usado com frequência em comandos de uma única foto para criar respostas que reflitam suas expectativas.

Se você mantém o controle das conversas em andamento com o modelo, pode usar essa prática para restaurar uma sessão. Por exemplo, depois que um navegador é reiniciado, você pode ajudar o usuário a continuar interagindo com o modelo de onde ele parou. Uma abordagem é acompanhar o histórico de sessões no armazenamento local.

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

Preservar a cota de sessão permitindo que o usuário pare o modelo

Cada sessão tem uma janela de contexto que pode ser acessada ao acessar os campos relevantes da sessão maxTokens, tokensLeft e tokensSoFar.

const { maxTokens, tokensLeft, tokensSoFar } = languageModel;

Quando essa janela de contexto é excedida, a sessão perde o controle das mensagens mais antigas, o que pode ser indesejável porque esse contexto pode ter sido importante. Para preservar a cota, se, após enviar uma solicitação, o usuário perceber que uma resposta não será útil, permita que ele impeça o modelo de linguagem de responder usando o AbortController.

Os métodos prompt() e promptStreaming() aceitam um segundo parâmetro opcional com um campo signal para permitir que o usuário pare a sessão.

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

Demonstração

Confira o gerenciamento de sessões de IA em ação na demonstração de gerenciamento de sessões de IA. Crie várias conversas paralelas com a API Prompt, recarregando a guia ou até mesmo reiniciando o navegador e continue de onde parou. Consulte o código-fonte no GitHub.

Conclusões

Ao gerenciar cuidadosamente as sessões de IA com essas técnicas e práticas recomendadas, você pode desbloquear todo o potencial da API Prompt, oferecendo aplicativos mais eficientes, responsivos e centrados no usuário. Também é possível combinar essas abordagens, por exemplo, permitindo que o usuário clone uma sessão restaurada para executar cenários "e se".

Agradecimentos

Este guia foi revisado por Sebastian Benz, Andre Bandarra, François Beaufort e Alexandra Klepper.