Sprawdzone metody zarządzania sesjami AI za pomocą interfejsu Prompt API

Data publikacji: 27 stycznia 2025 r.

Interfejs Prompt API to jeden z wbudowanych interfejsów API AI, które zespół Chrome testuje. Możesz przetestować go lokalnie w swoich aplikacjach, dołączając do programu wczesnej wersji zapoznawczej, lub w wersji produkcyjnej w rozszerzeniach do Chrome, rejestrując się w ramach trybu Prompt API dla rozszerzeń do Chrome. Jedną z kluczowych funkcji interfejsu Prompt API są sesje. Umożliwiają one prowadzenie jednej lub wielu rozmów z modelem AI bez utraty kontekstu wypowiedzi. Z tego przewodnika dowiesz się, jak zarządzać sesjami za pomocą modelu językowego.

Zastosowania zarządzania sesjami w przypadku co najmniej 1 równoległej sesji to na przykład klasyczne chatboty, w których użytkownik wchodzi w interakcję z AI, lub systemy zarządzania relacjami z klientem, w których jeden pracownik obsługi klienta równolegle obsługuje wielu klientów i korzysta z AI, aby móc śledzić różne rozmowy.

Inicjowanie sesji za pomocą promptu systemowego

Pierwszą kwestią, o której warto pamiętać, jest prompt systemu. Na początku sesji ustawia ogólny kontekst. Możesz na przykład użyć prompta systemowego, aby poinformować model, jak ma reagować.

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

Klonowanie sesji głównej

Jeśli po zakończeniu jednej sesji chcesz rozpocząć nową lub jeśli chcesz prowadzić równolegle niezależne rozmowy w różnych sesjach, możesz skorzystać z klonowania sesji głównej. Klon dziedziczy parametry sesji, takie jak temperature lub topK, z pierwotnego obiektu, a także potencjalną historię interakcji z sesją. Jest to przydatne, jeśli sesja główna została zainicjowana za pomocą promptu systemowego. Dzięki temu aplikacja musi wykonać tę czynność tylko raz, a wszystkie klony odziedziczą sesję główną.

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

Przywracanie poprzedniej sesji

Trzecią koncepcją, którą należy poznać, jest koncepcja początkowych promptów. Pierwotnym przeznaczeniem tego modelu jest stosowanie go do n-shot prompting, czyli do wstępnego wytrenowania modelu za pomocą zbioru n przykładowych promptów i odpowiedzi, dzięki czemu jego odpowiedzi na rzeczywiste prompty są dokładniejsze. Jeśli śledzisz trwające rozmowy z modelem, możesz „nadużyć” koncepcji początkowych promptów, aby przywrócić sesję, np. po ponownym uruchomieniu przeglądarki, aby użytkownik mógł kontynuować pracę z modelem w miejscu, w którym ją przerwał. Poniższy fragment kodu pokazuje, jak to zrobić, zakładając, że śledzisz historię sesji w 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);
}

Zachowanie limitu sesji przez umożliwienie użytkownikowi zatrzymania modelu, gdy jego odpowiedź nie jest przydatna

Każda sesja ma okno kontekstowe, które możesz otworzyć, gdy otworzysz odpowiednie pola sesji maxTokens, tokensLefttokensSoFar.

const { maxTokens, tokensLeft, tokensSoFar } = languageModel;

Gdy to okno kontekstu zostanie przekroczone, sesja przestaje śledzić najstarsze wiadomości, co może być niepożądane, ponieważ ten kontekst może być ważny. Aby zachować limit, jeśli po przesłaniu promptu użytkownik stwierdzi, że odpowiedź nie będzie przydatna, pozwól mu zatrzymać odpowiadanie przez model językowy, używając polecenia AbortController. Zarówno metoda prompt(), jak i metoda promptStreaming() akceptują opcjonalny drugi parametr z polem signal, który umożliwia użytkownikowi przerwanie sesji odpowiedzi.

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

Prezentacja

Zobacz, jak działa zarządzanie sesjami z wykorzystaniem AI, w demonstracji zarządzania sesjami z wykorzystaniem AI. Możesz prowadzić wiele równoległych rozmów z użyciem interfejsu Prompt API, ponownie wczytywać kartę lub nawet ponownie uruchomić przeglądarkę i kontynuować od miejsca, w którym przerwano rozmowę. Zapoznaj się z kodem źródłowym na GitHubie.

Podsumowanie

Dzięki przemyślanemu zarządzaniu sesjami AI za pomocą tych technik i sprawdzonych metod możesz w pełni wykorzystać potencjał interfejsu Prompt API, tworząc wydajniejsze, responsywne i skierowane na użytkownika aplikacje. Możesz też łączyć te podejścia, na przykład umożliwiając użytkownikowi sklonowanie przywróconej sesji z przeszłości, aby mógł przetestować różne scenariusze. Udanego pisania promptów!

Podziękowania

Ten przewodnik został sprawdzony przez Sebastiana Benza, Andre Bandarrę, Françoisa Beauforta i Aleksandrę Klepper.