Praktik terbaik untuk pengelolaan sesi dengan Prompt API

Dipublikasikan: 27 Januari 2025

Penjelasan Web Ekstensi Status Chrome Intent
GitHub Uji coba origin Di Uji coba origin Chrome 138 View Niat untuk Bereksperimen

Salah satu fitur utama Prompt API adalah sesi. Dengan fitur ini, Anda dapat melakukan satu atau beberapa percakapan berkelanjutan dengan model AI, tanpa model kehilangan konteks percakapan. Panduan ini memperkenalkan praktik terbaik untuk pengelolaan sesi dengan model bahasa.

Anda mungkin ingin melakukan pengelolaan sesi untuk satu atau beberapa sesi paralel jika Anda membuat chatbot klasik, tempat satu pengguna berinteraksi dengan AI. Atau, jika Anda memiliki sistem pengelolaan hubungan pelanggan yang memungkinkan satu agen dukungan menangani beberapa pelanggan secara paralel dan menggunakan AI untuk membantu agen dukungan melacak berbagai percakapan.

Menginisialisasi sesi dengan perintah awal

Perintah awal menyiapkan konteks sesi di awal. Misalnya, Anda dapat menggunakan perintah awal untuk memberi tahu model cara merespons.

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'

Meng-clone sesi utama

Jika Anda ingin memulai sesi baru setelah sesi berakhir, atau jika Anda ingin melakukan beberapa percakapan independen secara paralel, Anda dapat meng-clone sesi utama.

Klon mewarisi parameter sesi, seperti temperature atau topK, dan histori interaksi sesi. Hal ini berguna jika, misalnya, Anda menginisialisasi sesi utama dengan perintah awal. Dengan begitu, aplikasi Anda hanya perlu melakukan tugas ini satu kali—semua clone mewarisi perintah awal dari sesi utama.

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

Memulihkan sesi sebelumnya

Dengan perintah awal, Anda dapat memicu model dengan serangkaian contoh perintah dan respons untuk menghasilkan hasil yang lebih baik. Hal ini sering digunakan dalam perintah dalam pengambilan gambar, untuk membuat respons yang sesuai dengan ekspektasi Anda.

Jika melacak percakapan yang sedang berlangsung dengan model, Anda dapat menggunakan latihan ini untuk memulihkan sesi. Misalnya, setelah browser dimulai ulang, Anda dapat membantu pengguna melanjutkan interaksi dengan model dari tempat terakhir mereka berhenti. Salah satu caranya adalah dengan melacak histori sesi di penyimpanan lokal.

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

Mempertahankan kuota sesi dengan mengizinkan pengguna menghentikan model

Setiap sesi memiliki jendela konteks yang dapat Anda lihat dengan mengakses kolom yang relevan inputQuota dan inputUsage sesi.

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

Jika jendela konteks ini terlampaui, sesi akan kehilangan jejak pesan terlama. Hal ini dapat menghasilkan hasil yang lebih buruk jika konteksnya penting. Untuk menghemat kuota, jika pengguna menentukan bahwa jawaban model tidak berguna, izinkan mereka menghentikan sesi dengan AbortController.

Metode prompt() dan promptStreaming() menerima parameter kedua opsional dengan kolom signal, untuk memungkinkan pengguna menghentikan sesi.

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

Menghapus sesi yang tidak digunakan

Setiap sesi menggunakan memori. Jika Anda telah memulai beberapa sesi besar, hal ini dapat menjadi masalah. Hapus sesi yang tidak digunakan untuk meningkatkan ketersediaan resource.

Demo

Lihat cara kerja pengelolaan sesi AI di demo pengelolaan sesi AI. Buat beberapa percakapan paralel dengan Prompt API, muat ulang tab atau bahkan mulai ulang browser Anda, dan lanjutkan dari tempat Anda berhenti. Lihat kode sumber di GitHub.

Memanfaatkan potensi penuh Prompt API

Dengan mengelola sesi AI secara cermat menggunakan teknik dan praktik terbaik ini, Anda dapat mewujudkan potensi penuh Prompt API, sehingga menghasilkan aplikasi yang lebih efisien, responsif, dan berfokus pada pengguna. Anda juga dapat menggabungkan pendekatan ini, misalnya, dengan mengizinkan pengguna meng-clone sesi sebelumnya yang dipulihkan, sehingga mereka dapat menjalankan skenario "bagaimana jika".

Ucapan terima kasih

Panduan ini ditinjau oleh Sebastian Benz, Andre Bandarra, François Beaufort, dan Alexandra Klepper.