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 Chrome 148 Chrome 138 Ver Intenção de envio
GitHub Teste de origem Teste de origem para parâmetros de amostragem Chrome 148 Ver Intenção de teste

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

Você pode se envolver no gerenciamento de sessões para 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 agente de suporte lida com vários clientes em paralelo e usa a IA para ajudar o agente de suporte a acompanhar as várias conversas.

Inicializar sessões com um comando inicial

Um comando inicial configura o contexto da sessão no início. Por exemplo, você pode usar o comando inicial para informar ao modelo como ele deve responder.

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'

Clonar uma sessão principal

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

O clone herda comandos iniciais e do sistema em potencial e qualquer histórico de interação da sessão. Isso é útil se, por exemplo, você inicializou a sessão principal com um comando inicial. Dessa forma, seu app só precisa fazer esse trabalho uma vez. Todos os clones herdam o comando inicial da sessão principal.

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

Restaurar uma sessão anterior

Com comandos iniciais, você pode preparar o modelo com um conjunto de comandos de exemplo e respostas para gerar resultados melhores. Isso é usado com frequência no comando n-shot para criar respostas que reflitam suas expectativas.

Se você acompanhar as conversas em andamento com o modelo, poderá 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 parou. Uma abordagem é acompanhar o histórico da sessão no armazenamento local.

// 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) {  
  sessionData = {
    initialPrompts: [],
  };
}

// Initialize the session with the (previously stored or new) session data.
const languageModel = await LanguageModel.create(sessionData);

// Keep track of the ongoing conversation 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 interrompa o modelo

Cada sessão tem uma janela de contexto que pode ser acessada pelos campos relevantes da sessão contextWindow e contextUsage.

const { contextWindow, contextUsage } = languageModel;
const contextWindowLeft = contextWindow - contextUsage;

Quando essa janela de contexto é excedida, a sessão perde o controle das mensagens mais antigas. Isso pode levar a resultados piores se o contexto for importante. Para preservar a cota, se um usuário determinar que a resposta do modelo não é útil, permita que ele interrompa a sessão com AbortController.

Os métodos prompt() e promptStreaming() aceitam um segundo parâmetro opcional com um campo signal para permitir que o usuário interrompa 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);
  }
}

Remover sessões não utilizadas

Cada sessão consome memória. Se você iniciou várias sessões grandes, isso pode se tornar um problema. Destrua sessões não utilizadas para aumentar a disponibilidade de recursos.

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, recarregue a guia ou até mesmo reinicie o navegador e continue de onde parou. Consulte o código-fonte no GitHub.

Aproveite todo o potencial da API Prompt

Ao gerenciar cuidadosamente as sessões de IA com essas técnicas e práticas recomendadas, você pode aproveitar todo o potencial da API Prompt, oferecendo aplicativos mais eficientes, responsivos e centrados no usuário. Você também pode combinar essas abordagens, por exemplo, permitindo que o usuário clone uma sessão anterior restaurada para que ele possa executar cenários hipotéticos.

Agradecimentos

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