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 Teste de origem Em Teste de origem Chrome 138 Ver Intenção de experimentar

Um recurso importante da API de comandos são as sessões. Eles 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 gerenciamento de sessões com o modelo de linguagem.

Talvez você queira fazer o 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 gestão 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 sessões com um comando inicial

Um comando inicial define o contexto da sessão no início. Por exemplo, você pode usar o comando inicial para dizer 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 quiser iniciar uma nova sessão depois que uma terminar 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 todo o histórico de interações da sessão. Isso é útil se, por exemplo, você inicializou a sessão principal com um comando inicial. Assim, 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 os comandos iniciais, é possível preparar o modelo com um conjunto de exemplos de comandos e respostas para gerar resultados melhores. Isso é usado com frequência em comandos de n exemplos para criar respostas que atendam às 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) {
  // 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 LanguageModel.params();
  sessionData = {
    initialPrompts: [],
    topK: defaultTopK,
    temperature: defaultTemperature,
  };
}

// Initialize the session with the (previously stored or new) session data.
const languageModel = await 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);
}

Preserve 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 nos campos relevantes inputQuota e inputUsage.

const { inputQuota, inputUsage } = languageModel;
const inputQuotaLeft = inputQuota - inputUsage;

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

Remover sessões não usadas

Cada sessão consome memória. Se você tiver iniciado várias sessões grandes, isso pode se tornar um problema. Exclua sessões não usadas 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 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 focados no usuário. Você também pode combinar essas abordagens, por exemplo, permitindo que o usuário clone uma sessão anterior restaurada para executar cenários de simulação.

Agradecimentos

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