Praktik terbaik untuk pengelolaan sesi AI dengan Prompt API

Dipublikasikan: 27 Januari 2025

Prompt API adalah salah satu API AI bawaan yang sedang dieksplorasi oleh tim Chrome. Anda dapat mengujinya secara lokal dengan aplikasi Anda dengan bergabung ke program pratinjau awal, atau dalam produksi di Ekstensi Chrome Anda dengan mendaftar ke uji coba origin Prompt API untuk Ekstensi Chrome. Salah satu fitur utama Prompt API adalah sesi. Fitur ini memungkinkan Anda melakukan satu atau beberapa percakapan berkelanjutan dengan model AI, tanpa model kehilangan jejak konteks dari apa yang diucapkan. Panduan ini memperkenalkan praktik terbaik untuk pengelolaan sesi dengan model bahasa.

Kasus penggunaan untuk pengelolaan sesi untuk satu atau beberapa sesi paralel, misalnya, chatbot klasik tempat satu pengguna berinteraksi dengan AI, atau sistem pengelolaan hubungan pelanggan tempat satu agen dukungan menangani beberapa pelanggan secara paralel dan memanfaatkan AI untuk membantu agen dukungan melacak berbagai percakapan.

Melakukan inisialisasi sesi dengan perintah sistem

Konsep pertama yang harus diperhatikan adalah perintah sistem. Fungsi ini menyiapkan konteks keseluruhan sesi di awal. Misalnya, Anda dapat menggunakan perintah sistem untuk memberi tahu model cara merespons.

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

Meng-clone sesi utama

Jika Anda memiliki aplikasi yang ingin memulai sesi baru setelah satu sesi berakhir, atau jika Anda memiliki aplikasi yang ingin melakukan percakapan independen dalam sesi yang berbeda secara paralel, Anda dapat menggunakan konsep cloning sesi utama. Clone mewarisi parameter sesi seperti temperature, atau topK dari yang asli, serta potensi histori interaksi sesi. Hal ini berguna, misalnya, jika Anda telah menginisialisasi sesi utama dengan perintah sistem. Dengan cara ini, aplikasi Anda hanya perlu melakukan pekerjaan ini sekali, dan semua clone akan diwarisi dari sesi utama.

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

Memulihkan sesi sebelumnya

Konsep ketiga yang perlu dipelajari adalah konsep perintah awal. Tujuan awalnya adalah menggunakannya untuk perintah n-shot, yaitu untuk menyiapkan model dengan kumpulan contoh perintah dan respons n, sehingga responsnya terhadap perintah sebenarnya lebih akurat. Jika melacak percakapan yang sedang berlangsung dengan model, Anda dapat "menyalahgunakan" konsep perintah awal untuk memulihkan sesi, misalnya, setelah browser dimulai ulang, sehingga pengguna dapat melanjutkan dengan model yang mereka tinggalkan. Cuplikan kode berikut menunjukkan cara Anda dapat melakukannya, dengan asumsi Anda melacak histori sesi di 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);
}

Mempertahankan kuota sesi dengan mengizinkan pengguna menghentikan model saat jawabannya tidak berguna

Setiap sesi memiliki jendela konteks yang dapat Anda lihat dengan mengakses kolom yang relevan dari sesi maxTokens, tokensLeft, dan tokensSoFar.

const { maxTokens, tokensLeft, tokensSoFar } = languageModel;

Jika periode konteks ini terlampaui, sesi akan kehilangan jejak pesan terlama, yang dapat tidak diinginkan karena konteks ini mungkin penting. Untuk mempertahankan kuota, jika setelah mengirimkan perintah, pengguna melihat bahwa jawaban tidak akan berguna, izinkan mereka menghentikan model bahasa agar tidak menjawab dengan menggunakan AbortController. Metode prompt() dan promptStreaming() menerima parameter kedua opsional dengan kolom signal, yang memungkinkan pengguna menghentikan sesi untuk menjawab.

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

Demo

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

Kesimpulan

Dengan mengelola sesi AI dengan cermat menggunakan teknik dan praktik terbaik ini, Anda dapat memaksimalkan potensi 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". Selamat menulis perintah!

Ucapan terima kasih

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