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

Publicado em 27 de janeiro de 2025

A API Prompt é uma das APIs de IA integradas que a equipe do Chrome está testando. É possível testá-lo localmente com seus apps participando do programa de pré-lançamento ou na produção nas suas extensões do Chrome, inscrevendo-se no teste de origem da API Prompt para extensões do Chrome. 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 contexto do que foi dito. Este guia apresenta as práticas recomendadas para gerenciamento de sessões com o modelo de linguagem.

Os casos de uso para o gerenciamento de sessões de uma ou mais sessões paralelas são, por exemplo, chatbots clássicos em que um usuário interage com uma IA ou sistemas 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 a acompanhar as várias conversas.

Inicializar uma sessão com uma solicitação do sistema

O primeiro conceito a ser considerado é a solicitação do sistema. Ele configura o contexto geral de uma sessão no início dela. Por exemplo, você pode 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ê tiver um app em que, quando uma sessão terminar, você quiser iniciar uma nova ou se você tiver um app em que quiser ter conversas independentes em diferentes sessões em paralelo, use o conceito de clonagem de uma sessão principal. O clone herda parâmetros de sessão, como temperature ou topK, do original, além do possível histórico de interação da sessão. Isso é útil, por exemplo, se você tiver inicializado a sessão principal com uma solicitação do sistema. Dessa forma, o app precisa fazer isso apenas uma vez, e todos os clones herdarão 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

O terceiro conceito a ser aprendido é o de comandos iniciais. A finalidade original é usá-lo para comandos n-shot, ou seja, para preparar o modelo com um conjunto de comandos e respostas de exemplo n, para que as respostas aos comandos reais sejam mais precisas. Se você acompanhar as conversas em andamento com o modelo, poderá "abusar" do conceito de comandos iniciais para restaurar uma sessão, por exemplo, após uma reinicialização do navegador, para que o usuário possa continuar com o modelo de onde parou. O snippet de código a seguir mostra como você pode fazer isso, supondo que acompanhe o histórico de sessões no 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);
}

Preservar a cota de sessão permitindo que o usuário pare o modelo quando a resposta dele não for útil

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 instruçã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, que permite que o usuário pare a resposta da 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". Divirta-se criando comandos!

Agradecimentos

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