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

Data publikacji: 27 stycznia 2025 r.

Objaśnienie Sieć Rozszerzenia Stan Chrome Intencja
GitHub Eksperymentalna W EPP Chrome Beta Chrome 137 beta Wyświetl Intencja przeprowadzenia eksperymentu

Jedną z kluczowych funkcji interfejsu Prompt API są sesje. Umożliwiają one prowadzenie jednej lub wielu trwających rozmów z modelem AI bez utraty kontekstu wypowiedzi. W tym przewodniku znajdziesz sprawdzone metody zarządzania sesjami z użyciem modelu językowego.

Jeśli tworzysz klasycznego chatbota, w którym jeden użytkownik wchodzi w interakcję z AI, możesz zająć się zarządzaniem sesjami w przypadku co najmniej 2 sesji równoległych. Możesz też mieć system zarządzania relacjami z klientami, w którym jeden pracownik obsługi klienta obsługuje jednocześnie wielu klientów i korzysta z AI, aby śledzić różne rozmowy.

Inicjowanie sesji za pomocą promptu początkowego

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

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 chcesz rozpocząć nową sesję po zakończeniu poprzedniej lub chcesz prowadzić kilka niezależnych rozmów jednocześnie, możesz sklonować sesję główną.

Klon dziedziczy parametry sesji, takie jak temperature lub topK, oraz całą historię interakcji z sesją. Jest to przydatne, jeśli na przykład sesję główną zainicjowano za pomocą początkowego prompta. Dzięki temu aplikacja musi wykonać tę czynność tylko raz – wszystkie kopie dziedziczą początkowe 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

Dzięki wstępnych promptom możesz przygotować model za pomocą zestawu przykładowych promptów i odpowiedzi, aby uzyskać lepsze wyniki. Jest to często używane w promptach wieloujęcikowych, aby tworzyć odpowiedzi, które odzwierciedlają Twoje oczekiwania.

Jeśli śledzisz bieżące rozmowy z modelem, możesz użyć tej metody, aby przywrócić sesję. Po ponownym uruchomieniu przeglądarki możesz na przykład pomóc użytkownikowi w kontynuowaniu pracy z modelem od miejsca, w którym przerwał. Jednym z podejść 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);
}

Zachowanie limitu sesji przez umożliwienie użytkownikowi zatrzymania modelu

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

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 AbortController.

Zarówno metoda prompt(), jak i metoda promptStreaming() akceptują opcjonalny drugi parametr z polem signal, aby umożliwić użytkownikowi zakończenie 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);
  }
}

Prezentacja

Zarządzanie sesjami za pomocą AI w praktyce możesz zobaczyć w demonstracji zarządzania sesjami za pomocą 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.

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, 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.

Podziękowania

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