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

Data publikacji: 27 stycznia 2025 r.

Wyjaśnienie Sieć Rozszerzenia Stan Chrome Intencja
GitHub Wersja próbna originokresie próbnym Chrome 138 Wyświetl Zamiar przeprowadzenia eksperymentu

Jedną z kluczowych funkcji interfejsu Prompt API są sesje. Umożliwiają one prowadzenie jednej lub kilku rozmów z modelem AI bez utraty kontekstu. Ten przewodnik zawiera sprawdzone metody zarządzania sesjami za pomocą modelu językowego.

Zarządzanie sesjami może być przydatne w przypadku co najmniej jednej sesji równoległej, jeśli tworzysz klasycznego czatbota, z którym wchodzi w interakcję jeden użytkownik. Możesz też mieć system zarządzania relacjami z klientami, w którym jeden pracownik obsługi klienta zajmuje się równolegle wieloma klientami i korzysta z AI, aby śledzić różne rozmowy.

Inicjowanie sesji za pomocą prompta początkowego

Początkowy prompt określa kontekst sesji na początku. Możesz na przykład użyć początkowego prompta, aby poinformować model, jak ma odpowiadać.

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'

Klonowanie sesji głównej

Jeśli po zakończeniu sesji chcesz rozpocząć nową lub prowadzić równolegle kilka niezależnych rozmów, możesz sklonować sesję główną.

Sklonowana sesja dziedziczy parametry sesji, takie jak temperature lub topK, oraz historię interakcji w sesji. Jest to przydatne, jeśli np. zainicjowano główną sesję za pomocą początkowego prompta. Dzięki temu aplikacja musi wykonać tę czynność tylko raz – wszystkie klony dziedziczą początkowy prompt z sesji głównej.

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

Przywracanie poprzedniej sesji

Prompty początkowe umożliwiają przygotowanie modelu za pomocą zestawu przykładowych promptów i odpowiedzi, aby generować lepsze wyniki. Jest to często używane w promptach n-shot, aby tworzyć odpowiedzi zgodne z Twoimi oczekiwaniami.

Jeśli śledzisz trwające rozmowy z modelem, możesz użyć tej metody, aby przywrócić sesję. Na przykład po ponownym uruchomieniu przeglądarki możesz pomóc użytkownikowi w dalszym korzystaniu z modelu od miejsca, w którym skończył. Jednym ze sposobów jest śledzenie historii sesji w pamięci lokalnej.

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

Zachowaj limit sesji, umożliwiając użytkownikowi zatrzymanie modelu

Każda sesja ma okno kontekstu, które możesz wyświetlić, uzyskując dostęp do odpowiednich pól sesji inputQuotainputUsage.

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

Gdy ten zakres kontekstu zostanie przekroczony, sesja przestanie śledzić najstarsze wiadomości. Jeśli kontekst był ważny, może to pogorszyć wyniki. Aby zachować limit, jeśli użytkownik uzna, że odpowiedź modelu nie jest przydatna, pozwól mu zakończyć sesję za pomocą AbortController.

Zarówno metoda prompt(), jak i promptStreaming() akceptują opcjonalny drugi parametr z polem signal, który umożliwia użytkownikowi zatrzymanie sesji.

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

Usuwanie nieużywanych sesji

Każda sesja zużywa pamięć. Jeśli rozpoczęto kilka dużych sesji, może to stanowić problem. Usuń nieużywane sesje, aby zwiększyć dostępność zasobów.

Prezentacja

Zobacz, jak działa zarządzanie sesjami AI, w demonstracji zarządzania sesjami AI. Twórz wiele równoległych rozmów za pomocą interfejsu Prompt API, odświeżaj kartę lub nawet ponownie uruchamiaj przeglądarkę i kontynuuj w miejscu, w którym skończyłeś(-aś). Zobacz kod źródłowy na GitHubie.

Wykorzystaj pełny potencjał interfejsu Prompt API

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, bardziej responsywne i skoncentrowane na użytkowniku aplikacje. Możesz też połączyć te podejścia, np. zezwolić użytkownikowi na sklonowanie przywróconej sesji z przeszłości, aby mógł przeprowadzić scenariusze „co by było, gdyby”.

Podziękowania

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