Prácticas recomendadas para la administración de sesiones de IA con la API de Prompt

Fecha de publicación: 27 de enero de 2025

La API de Prompt es una de las APIs de IA integradas que está explorando el equipo de Chrome. Puedes probarlo localmente con tus apps si te unes al programa de versión preliminar anticipada o en producción en tus extensiones de Chrome si te registras en la prueba de origen de la API de Prompt para extensiones de Chrome. Una función clave de la API de Prompt son las sesiones. Te permiten tener una o varias conversaciones en curso con el modelo de IA, sin que este pierda el seguimiento del contexto de lo que se dijo. En esta guía, se presentan las prácticas recomendadas para la administración de sesiones con el modelo de lenguaje.

Los casos de uso de la administración de sesiones para una o más sesiones en paralelo son, por ejemplo, los chatbots clásicos en los que un usuario interactúa con una IA o los sistemas de administración de relaciones con los clientes en los que un agente de atención al cliente se ocupa de varios clientes en paralelo y usa la IA para ayudar a hacer un seguimiento de las diversas conversaciones.

Cómo inicializar una sesión con una instrucción del sistema

El primer concepto que debes tener en cuenta es la instrucción del sistema. Establece el contexto general de una sesión al comienzo. Por ejemplo, puedes usar la instrucción del sistema para indicarle al modelo cómo debe 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'

Cómo clonar una sesión principal

Si tienes una app en la que, cuando finaliza una sesión, quieres iniciar una nueva, o si tienes una app en la que quieres tener conversaciones independientes en diferentes sesiones en paralelo, puedes usar el concepto de clonar una sesión principal. El clon hereda parámetros de sesión, como temperature o topK, del original, así como el posible historial de interacción de la sesión. Esto es útil, por ejemplo, si inicializaste la sesión principal con un mensaje del sistema. De esta manera, tu app solo debe realizar este trabajo una vez, y todos los clones heredarán de la sesión 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.');

Cómo restablecer una sesión anterior

El tercer concepto que debes aprender es el de las indicaciones iniciales. Su propósito original es usarlo para la instrucción de n tomas, es decir, para preparar el modelo con un conjunto de n instrucciones y respuestas de ejemplo, de modo que sus respuestas a las instrucciones reales sean más precisas. Si llevas un registro de las conversaciones en curso con el modelo, puedes “abusar” del concepto de instrucciones iniciales para restablecer una sesión, por ejemplo, después de reiniciar un navegador, de modo que el usuario pueda continuar con el modelo donde lo dejó. En el siguiente fragmento de código, se muestra cómo podrías abordar esto, siempre y cuando lleves un registro del historial de la sesión en 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);
}

Permite que el usuario detenga el modelo cuando su respuesta no sea útil para preservar la cuota de la sesión.

Cada sesión tiene una ventana de contexto que puedes ver si accedes a los campos relevantes de la sesión maxTokens, tokensLeft y tokensSoFar.

const { maxTokens, tokensLeft, tokensSoFar } = languageModel;

Cuando se supera esta ventana de contexto, la sesión pierde el seguimiento de los mensajes más antiguos, lo que puede ser indeseable porque este contexto podría haber sido importante. Para preservar la cuota, si después de enviar una instrucción el usuario ve que una respuesta no será útil, permítele detener el modelo de lenguaje para que no responda con AbortController. Tanto el método prompt() como el método promptStreaming() aceptan un segundo parámetro opcional con un campo signal, que permite que el usuario impida que la sesión responda.

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

Demostración

Mira cómo funciona la administración de sesiones de IA en la demostración de administración de sesiones de IA. Crea varias conversaciones en paralelo con la API de Prompt, vuelve a cargar la pestaña o incluso reinicia el navegador y continúa desde donde lo dejaste. Consulta el código fuente en GitHub.

Conclusiones

Si administras las sesiones de IA con estas técnicas y prácticas recomendadas, puedes aprovechar todo el potencial de la API de Prompt y ofrecer aplicaciones más eficientes, responsivas y centradas en el usuario. También puedes combinar estos enfoques, por ejemplo, permitiendo que el usuario clone una sesión anterior restaurada para que pueda ejecutar situaciones de "qué pasaría si". ¡Sigue creando instrucciones!

Agradecimientos

Esta guía fue revisada por Sebastian Benz, Andre Bandarra, François Beaufort y Alexandra Klepper.