แนวทางปฏิบัติแนะนำสำหรับการจัดการเซสชันด้วย Prompt API

เผยแพร่เมื่อวันที่ 27 มกราคม 2025

วิดีโออธิบาย เว็บ ส่วนขยาย สถานะ Chrome ความตั้งใจ
GitHub Chrome 148 Chrome 138 ดู ความตั้งใจที่จะเผยแพร่
GitHub ช่วงทดลองใช้จากต้นทาง ช่วงทดลองใช้จากต้นทางสำหรับพารามิเตอร์การสุ่มตัวอย่าง Chrome 148 ดู ความตั้งใจที่จะทดลอง

ฟีเจอร์หลักอย่างหนึ่งของ Prompt API คือเซสชัน ซึ่งช่วยให้คุณสนทนากับโมเดล AI ได้ครั้งละ 1 รายการหรือหลายรายการโดยไม่ให้โมเดลลืมบริบทของสิ่งที่พูด คู่มือนี้จะแนะนำแนวทางปฏิบัติแนะนำสำหรับการจัดการเซสชันด้วยโมเดลภาษา

คุณอาจต้องการจัดการเซสชันสำหรับเซสชันแบบขนานอย่างน้อย 1 รายการหากคุณกำลังสร้างแชทบอตแบบคลาสสิกที่ผู้ใช้ 1 รายโต้ตอบกับ AI หรือหากคุณมีระบบการจัดการลูกค้าสัมพันธ์ที่ตัวแทนฝ่ายสนับสนุน 1 รายจัดการกับลูกค้าหลายรายแบบขนานและใช้ AI เพื่อช่วยตัวแทนฝ่ายสนับสนุนติดตามการสนทนาต่างๆ

เริ่มต้นเซสชันด้วยพรอมต์เริ่มต้น

พรอมต์เริ่มต้นจะตั้งค่าบริบทของเซสชันเมื่อเริ่มต้น เช่น คุณสามารถใช้พรอมต์เริ่มต้นเพื่อบอกโมเดลว่าควรตอบสนองอย่างไร

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'

โคลนเซสชันหลัก

หากต้องการเริ่มเซสชันใหม่หลังจากเซสชันสิ้นสุดลง หรือหากต้องการมีการสนทนาแบบอิสระหลายรายการแบบขนาน คุณสามารถโคลนเซสชันหลักได้

โคลนจะรับช่วงพรอมต์เริ่มต้นและพรอมต์ระบบที่เป็นไปได้ รวมถึงประวัติการโต้ตอบของเซสชัน ซึ่งจะเป็นประโยชน์ เช่น หากคุณเริ่มต้นเซสชันหลักด้วยพรอมต์เริ่มต้น วิธีนี้ทำให้แอปของคุณต้องทำงานนี้เพียงครั้งเดียว เนื่องจากโคลนทั้งหมดจะรับช่วงพรอมต์เริ่มต้นจากเซสชันหลัก

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

กู้คืนเซสชันที่ผ่านมา

ด้วยพรอมต์เริ่มต้น คุณสามารถเตรียมโมเดลด้วยชุดพรอมต์ตัวอย่าง และคำตอบเพื่อสร้างผลลัพธ์ที่ดีขึ้น ซึ่งมักใช้ใน การพรอมต์แบบ n-shot เพื่อสร้างคำตอบที่ตรงกับความคาดหวังของคุณ

หากคุณติดตามการสนทนาที่กำลังดำเนินอยู่กับโมเดล คุณสามารถใช้แนวทางปฏิบัตินี้เพื่อกู้คืนเซสชันได้ เช่น หลังจากรีสตาร์ทเบราว์เซอร์ คุณสามารถช่วยให้ผู้ใช้โต้ตอบกับโมเดลต่อจากจุดที่ค้างไว้ได้ วิธีหนึ่งคือการติดตามประวัติเซสชันในพื้นที่เก็บข้อมูลในเครื่อง

// 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) {  
  sessionData = {
    initialPrompts: [],
  };
}

// Initialize the session with the (previously stored or new) session data.
const languageModel = await LanguageModel.create(sessionData);

// Keep track of the ongoing conversation 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);
}

รักษาโควต้าเซสชันโดยให้ผู้ใช้หยุดโมเดล

แต่ละเซสชันมีหน้าต่างบริบทที่คุณดูได้โดยเข้าถึงช่องที่เกี่ยวข้องของเซสชัน contextWindow และ contextUsage

const { contextWindow, contextUsage } = languageModel;
const contextWindowLeft = contextWindow - contextUsage;

เมื่อหน้าต่างบริบทนี้มีขนาดเกินขีดจำกัด เซสชันจะลืมข้อความที่เก่าที่สุด ซึ่งอาจทำให้ผลลัพธ์แย่ลงหากบริบทมีความสำคัญ หากต้องการรักษาโควต้าไว้ หากผู้ใช้เห็นว่าคำตอบของโมเดลไม่มีประโยชน์ ให้ผู้ใช้หยุดเซสชันด้วย AbortController

ทั้งเมธอด prompt() และ promptStreaming() ยอมรับพารามิเตอร์ที่ 2 ที่ไม่บังคับซึ่งมีช่อง signal เพื่อให้ผู้ใช้หยุดเซสชันได้

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

นำเซสชันที่ไม่ได้ใช้ออก

แต่ละเซสชันใช้หน่วยความจำ หากคุณเริ่มเซสชันขนาดใหญ่หลายเซสชัน ปัญหานี้อาจเกิดขึ้นได้ ทำลายเซสชันที่ไม่ได้ใช้ เพื่อเพิ่ม ความพร้อมใช้งานของทรัพยากร

สาธิต

ดูการจัดการเซสชัน AI ในการทำงานจริงได้ใน การสาธิตการจัดการเซสชัน AI สร้างการสนทนาแบบขนานหลายรายการด้วย Prompt API, โหลดแท็บซ้ำ หรือ แม้แต่รีสตาร์ทเบราว์เซอร์ แล้วดำเนินการต่อจากจุดที่ค้างไว้ ดู ซอร์สโค้ดได้ใน GitHub

ปลดล็อกศักยภาพสูงสุดของ Prompt API

การจัดการเซสชัน AI อย่างรอบคอบด้วยเทคนิคและแนวทางปฏิบัติแนะนำเหล่านี้จะช่วยให้คุณปลดล็อกศักยภาพสูงสุดของ Prompt API และสร้างแอปพลิเคชันที่มีประสิทธิภาพ ตอบสนองได้ดี และเน้นผู้ใช้เป็นศูนย์กลางมากขึ้น นอกจากนี้ คุณยังรวมแนวทางเหล่านี้เข้าด้วยกันได้ด้วย เช่น การอนุญาตให้ผู้ใช้โคลนเซสชันที่ผ่านมาที่กู้คืนแล้ว เพื่อให้ผู้ใช้สามารถเรียกใช้สถานการณ์ "จะเกิดอะไรขึ้นหาก" ได้

คำขอบคุณ

คู่มือนี้ได้รับการตรวจสอบโดย Sebastian Benz, Andre Bandarra, François Beaufort และ Alexandra Klepper