Prompt API

เผยแพร่: 11 พฤศจิกายน 2024 อัปเดตล่าสุด: 20 พฤษภาคม 2025

วิดีโออธิบาย เว็บ ส่วนขยาย สถานะ Chrome ความตั้งใจ
GitHub ทดลอง ใน EPP Chrome เบต้า Chrome 137 เบต้า ดู ความตั้งใจที่จะทดสอบ

Prompt API ช่วยให้คุณส่งคําขอเป็นภาษาธรรมชาติไปยัง Gemini Nano ในเบราว์เซอร์ได้

คุณใช้ Prompt API ในส่วนขยาย Chrome ได้หลายวิธี เช่น

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

ตัวอย่างข้างต้นเป็นเพียงตัวอย่างบางส่วนเท่านั้น เราหวังว่าจะได้ดูผลงานที่คุณสร้างสรรค์

ใช้ Prompt API ในส่วนขยาย

ฟังก์ชันส่วนขยายที่คุณใช้ได้ในเนมสเปซ LanguageModel มี 2 รายการดังนี้

  • availability() เพื่อดูความสามารถของโมเดลและดูว่าพร้อมใช้งานหรือไม่
  • create() เพื่อเริ่มเซสชันโมเดลภาษา

การดาวน์โหลดโมเดล

Prompt API ใช้โมเดล Gemini Nano ใน Chrome แม้ว่า API จะฝังอยู่ใน Chrome แต่ระบบจะดาวน์โหลดโมเดลแยกต่างหากเมื่อส่วนขยายใช้ API เป็นครั้งแรก

หากต้องการตรวจสอบว่าโมเดลพร้อมใช้งานหรือไม่ ให้เรียกใช้ฟังก์ชัน LanguageModel.availability() แบบแอซิงโครนัส ซึ่งควรแสดงผลลัพธ์อย่างใดอย่างหนึ่งต่อไปนี้

  • 'no': เบราว์เซอร์รองรับ Prompt API แต่ใช้งานไม่ได้ในขณะนี้ ซึ่งอาจเกิดจากสาเหตุหลายประการ เช่น พื้นที่ในดิสก์ไม่เพียงพอที่จะดาวน์โหลดโมเดล
  • 'readily': เบราว์เซอร์รองรับ Prompt API และพร้อมใช้งานทันที
  • 'after-download': เบราว์เซอร์รองรับ Prompt API แต่ต้องดาวน์โหลดโมเดลก่อน

หากต้องการเรียกให้ดาวน์โหลดโมเดลและสร้างเซสชันโมเดลภาษา ให้เรียกใช้ฟังก์ชัน LanguageModel.availability() แบบแอซิงโครนัส หากคําตอบสําหรับ availability() คือ 'after-download' แนวทางปฏิบัติแนะนําคือให้ฟังความคืบหน้าของการดาวน์โหลด วิธีนี้จะช่วยให้คุณแจ้งผู้ใช้ได้ในกรณีที่การดาวน์โหลดใช้เวลานาน

const session = await LanguageModel.create({
  monitor(m) {
    m.addEventListener("downloadprogress", (e) => {
      console.log(`Downloaded ${e.loaded} of ${e.total} bytes.`);
    });
  },
});

ความสามารถของโมเดล

ฟังก์ชัน availability() จะบอกความสามารถของโมเดลภาษาให้คุณทราบด้วย นอกจาก available แล้ว ออบเจ็กต์ยังมีช่องต่อไปนี้ด้วย

await LanguageModel.availability();
// {available: 'readily', defaultTopK: 3, maxTopK: 8, defaultTemperature: 1}

สร้างเซสชัน

เมื่อ Prompt API ทำงานได้ คุณก็สร้างเซสชันด้วยฟังก์ชัน create() คุณสามารถแจ้งให้โมเดลทราบด้วยฟังก์ชัน prompt() หรือ promptStreaming()

ปรับแต่งเซสชัน

คุณสามารถปรับแต่งเซสชันแต่ละรายการด้วย topK และ temperature โดยใช้ออบเจ็กต์ตัวเลือก (ไม่บังคับ) ระบบจะแสดงค่าเริ่มต้นสำหรับพารามิเตอร์เหล่านี้จาก LanguageModel.availability()

const capabilities = await LanguageModel.availability();
// Initializing a new session must either specify both `topK` and
// `temperature` or neither of them.
const slightlyHighTemperatureSession = await LanguageModel.create({
  temperature: Math.max(availability.defaultTemperature * 1.2, 2.0),
  topK: capabilities.defaultTopK,
});

ออบเจ็กต์ตัวเลือกที่ไม่บังคับของฟังก์ชัน create() ยังใช้ฟิลด์ signal ด้วย ซึ่งช่วยให้คุณส่ง AbortSignal เพื่อทำลายเซสชันได้

const controller = new AbortController();
stopButton.onclick = () => controller.abort();

const session = await LanguageModel.create({
  signal: controller.signal,
})

พรอมต์เริ่มต้น

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

const session = await LanguageModel.create({
  initialPrompts: [
    { role: 'system', content: 'You are a helpful and friendly assistant.' },
    { role: 'user', content: 'What is the capital of Italy?' },
    { role: 'assistant', content: 'The capital of Italy is Rome.'},
    { role: 'user', content: 'What language is spoken there?' },
    { role: 'assistant', content: 'The official language of Italy is Italian. [...]' }
  ]
});

ขีดจำกัดเซสชัน

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

console.log(`${session.tokensSoFar}/${session.maxTokens}
(${session.tokensLeft} left)`);

การเก็บเซสชันไว้

โดยแต่ละเซสชันจะติดตามบริบทของการสนทนา ระบบจะพิจารณาการโต้ตอบก่อนหน้านี้สําหรับการโต้ตอบในอนาคตจนกว่ากรอบเวลาบริบทของเซสชันจะเต็ม

const session = await LanguageModel.create({
  initialPrompts: [{
    role: "system",
    content: "You are a friendly, helpful assistant specialized in clothing choices."
  }]
});

const result1 = await session.prompt(
  "What should I wear today? It is sunny. I am unsure between a t-shirt and a polo."
);
console.log(result1);

const result2 = await session.prompt(
  "That sounds great, but oh no, it is actually going to rain! New advice?"
);
console.log(result2);

โคลนเซสชัน

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

const controller = new AbortController();
stopButton.onclick = () => controller.abort();

const clonedSession = await session.clone({
  signal: controller.signal,
});

พรอมต์โมเดล

คุณสามารถแจ้งให้โมเดลทราบด้วยฟังก์ชัน prompt() หรือ promptStreaming()

เอาต์พุตแบบไม่สตรีม

หากต้องการผลลัพธ์สั้นๆ คุณสามารถใช้ฟังก์ชัน prompt() ซึ่งจะแสดงผลลัพธ์เมื่อพร้อมใช้งาน

// Start by checking if it's possible to create a session based on the
// availability of the model, and the characteristics of the device.
const {available, defaultTemperature, defaultTopK, maxTopK } =
  await LanguageModel.availability();

if (available !== 'no') {
  const session = await LanguageModel.create();

  // Prompt the model and wait for the whole result to come back.
  const result = await session.prompt("Write me a poem!");
  console.log(result);
}

เอาต์พุตสตรีมมิง

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

const {available, defaultTemperature, defaultTopK, maxTopK } =
  await LanguageModel.availability();

if (available !== 'no') {
  const session = await LanguageModel.create();

  // Prompt the model and stream the result:
  const stream = session.promptStreaming('Write me an extra-long poem!');
  for await (const chunk of stream) {
    console.log(chunk);
  }
}

promptStreaming() จะแสดงผล ReadableStream ที่มีกลุ่มคำซ้อนทับกัน เช่น "Hello,", "Hello world,", "Hello world I am,", "Hello world I am an AI." ซึ่งไม่ใช่ลักษณะการทำงานที่ต้องการ เราตั้งใจที่จะปรับให้สอดคล้องกับ API สตรีมมิงอื่นๆ ในแพลตฟอร์ม โดยที่แต่ละกลุ่มเป็นชิ้นส่วนที่สอดคล้องกันของสตรีมยาวรายการเดียว ซึ่งหมายความว่าเอาต์พุตจะเป็นลําดับ เช่น "Hello", " world", " I am", " an AI"

ในระหว่างนี้ คุณสามารถทําตามวิธีการต่อไปนี้เพื่อให้ได้ผลลัพธ์ที่ต้องการ ซึ่งใช้ได้กับทั้งลักษณะการทํางานแบบมาตรฐานและแบบไม่มาตรฐาน

let result = '';
let previousChunk = '';

for await (const chunk of stream) {
  const newChunk = chunk.startsWith(previousChunk)
      ? chunk.slice(previousChunk.length) : chunk;
  console.log(newChunk);
  result += newChunk;
  previousChunk = chunk;
}
console.log(result);

หยุดแสดงพรอมต์

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

const controller = new AbortController();
stopButton.onclick = () => controller.abort();

const result = await session.prompt(
  'Write me a poem!',
  { signal: controller.signal }
);

สิ้นสุดเซสชัน

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

await session.prompt(
  "You are a friendly, helpful assistant specialized in clothing choices."
);

session.destroy();

// The promise is rejected with an error explaining that
// the session is destroyed.
await session.prompt(
  "What should I wear today? It is sunny, and I am unsure between a
  t-shirt and a polo."
);

สาธิต

หากต้องการทดสอบ Prompt API ในส่วนขยาย Chrome ให้ติดตั้งส่วนขยายเดโม ซอร์สโค้ดส่วนขยายมีอยู่ใน GitHub

อินเทอร์เฟซสาธิตสําหรับ Prompt API

เข้าร่วมและแชร์ความคิดเห็น

ความคิดเห็นของคุณจะส่งผลโดยตรงต่อวิธีที่เราสร้างและใช้งาน API เวอร์ชันอนาคตของ API นี้และ API AI ในตัวทั้งหมด