Рекомендации по управлению сеансами ИИ с помощью Prompt API

Опубликовано: 27 января 2025 г.

Prompt API — это один из встроенных AI API, который изучает команда Chrome. Вы можете протестировать его локально со своими приложениями, присоединившись к программе ранней предварительной версии , или в рабочей версии своих расширений Chrome, подписавшись на пробную версию Prompt API Origin для расширений Chrome . Одной из ключевых особенностей Prompt API являются сеансы. Они позволяют вам вести один или несколько текущих разговоров с моделью ИИ, при этом модель не теряет контекст сказанного. В этом руководстве представлены лучшие практики управления сеансами с помощью языковой модели.

Случаями использования управления сеансами для одного или нескольких параллельных сеансов являются, например, классические чат-боты, в которых один пользователь взаимодействует с искусственным интеллектом, или системы управления взаимоотношениями с клиентами, где один агент поддержки параллельно работает с несколькими клиентами и использует искусственный интеллект для помощи службе поддержки. агент отслеживает различные разговоры.

Инициализировать сеанс с помощью системного приглашения

Первое, о чем следует знать, — это системная подсказка. Он устанавливает общий контекст сеанса в его начале. Например, вы можете использовать системную подсказку, чтобы сообщить модели, как она должна реагировать.

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

Клонировать основной сеанс

Если у вас есть приложение, в котором после завершения одного сеанса вы хотите начать новый, или если у вас есть приложение, в котором вы хотите параллельно вести независимые разговоры в разных сеансах, вы можете использовать концепцию клонирования основного сессия. Клон наследует параметры сеанса, такие как temperature или topK , от оригинала, а также историю потенциального взаимодействия с сеансом. Это полезно, например, если вы инициализировали основной сеанс с помощью системного приглашения. Таким образом, вашему приложению нужно выполнить эту работу только один раз, и все клоны будут наследовать от основного сеанса.

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

Восстановить прошлый сеанс

Третья концепция, которую необходимо изучить, — это концепция первоначальных подсказок. Его первоначальная цель — использовать его для n -кратных подсказок, то есть для наполнения модели набором из n примеров подсказок и ответов, чтобы ее ответы на фактические подсказки были более точными. Если вы отслеживаете текущие разговоры с моделью, вы можете «злоупотреблять» концепцией начальных подсказок для восстановления сеанса, например, после перезапуска браузера, чтобы пользователь мог продолжить работу с моделью с того места, где он остановился. Следующий фрагмент кода показывает, как это можно сделать, предполагая, что вы отслеживаете историю сеансов в 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);
}

Сохраняйте квоту сеанса, позволяя пользователю останавливать модель, когда ее ответ бесполезен.

Каждый сеанс имеет контекстное окно, которое вы можете увидеть, обратившись к соответствующим полям сеанса maxTokens , tokensLeft и tokensSoFar .

const { maxTokens, tokensLeft, tokensSoFar } = languageModel;

Когда это окно контекста превышено, сеанс теряет отслеживание самых старых сообщений, что может быть нежелательно, поскольку этот контекст мог быть важным. Чтобы сохранить квоту, если после отправки запроса пользователь видит, что ответ бесполезен, разрешите ему остановить ответ языковой модели, используя AbortController . Оба метода prompt() и promptStreaming() принимают необязательный второй параметр с полем signal , который позволяет пользователю прекратить ответ сеанса.

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

Демо

См. управление сеансами AI в действии в демонстрации управления сеансами AI . Создайте несколько параллельных диалогов с помощью Prompt API, перезагрузите вкладку или даже перезапустите браузер и продолжайте с того места, на котором остановились. Смотрите исходный код на GitHub .

Выводы

Вдумчиво управляя сеансами ИИ с помощью этих методов и передовых практик, вы сможете раскрыть весь потенциал Prompt API, предоставляя более эффективные, отзывчивые и ориентированные на пользователя приложения. Вы также можете комбинировать эти подходы, например, разрешив пользователю клонировать восстановленный прошлый сеанс, чтобы он мог запускать сценарии «что, если». Приятного подсказки!

Благодарности

Рецензентами этого руководства выступили Себастьян Бенц , Андре Бандарра , Франсуа Бофор и Александра Клеппер .