Prompt API

เผยแพร่: 11 พฤศจิกายน 2024

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

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

Prompt API พร้อมใช้งานในช่วงทดลองใช้จากต้นทางสําหรับส่วนขยาย Chrome นักพัฒนาเว็บสามารถใช้ Exploratory API ซึ่งมีไว้สำหรับการสร้างต้นแบบและการค้นพบ Use Case เพิ่มเติมได้โดยเข้าร่วมโปรแกรมเวอร์ชันตัวอย่างก่อนเปิดตัว

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

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

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

เริ่มต้นใช้งาน

หากต้องการใช้ Prompt API ในส่วนขยาย Chrome ให้เพิ่มสิทธิ์ "aiLanguageModelOriginTrial" ลงใน manifest.json ของส่วนขยาย พร้อมกับสิทธิ์อื่นๆ ที่จําเป็นต่อส่วนขยาย

{
  "manifest_version": 3,
  "name": "YOUR_EXTENSION_NAME",
  "key": "YOUR_EXTENSION_KEY",
  "permissions": ["aiLanguageModelOriginTrial"]
}

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

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

เข้าร่วมการทดลองใช้จากต้นทาง

วิธีเพิ่ม Prompt API ลงในส่วนขยาย Chrome

  1. เข้าร่วมช่วงทดลองใช้ต้นทาง Prompt API ซึ่งทำงานใน Chrome เวอร์ชัน 131 ถึง 136
  2. ใช้ URL chrome-extension://YOUR_EXTENSION_ID ของส่วนขยายเป็นต้นทางของเว็บ เช่น chrome-extension://ljjhjaakmncibonnjpaoglbhcjeolhkk

  3. อัปเดตไฟล์ Manifest เพื่อเพิ่มโทเค็นช่วงทดลองใช้เป็นอาร์เรย์

    {
      "manifest_version": 3,
      "name": "YOUR_EXTENSION_NAME",
      "key": "YOUR_EXTENSION_KEY",
      "permissions": ["aiLanguageModelOriginTrial"],
      "trial_tokens": ["GENERATED_TOKEN"],
    }
    

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

เมื่อขอสิทธิ์ใช้ Prompt API แล้ว คุณจะสร้างส่วนขยายได้ ฟังก์ชันส่วนขยายที่คุณใช้ได้ในเนมสเปซ chrome.aiOriginTrial.languageModel มี 2 รายการดังนี้

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

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

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

หากต้องการตรวจสอบว่าโมเดลพร้อมใช้งานหรือไม่ ให้เรียกใช้ฟังก์ชันแบบแอซิงโครนัส chrome.aiOriginTrial.languageModel.capabilities() โดยจะแสดงผลออบเจ็กต์ AILanguageModelCapabilities ที่มีฟิลด์ available ซึ่งมีค่าที่เป็นไปได้ 3 ค่า ดังนี้

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

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

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

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

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

await chrome.aiOriginTrial.languageModel.capabilities();
// {available: 'readily', defaultTopK: 3, maxTopK: 8, defaultTemperature: 1}

สร้างเซสชัน

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

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

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

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

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

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

const session = await chrome.aiOriginTrial.languageModel.create({
  signal: controller.signal,
})
พรอมต์ของระบบ

พรอมต์ของระบบช่วยให้คุณระบุบริบทบางอย่างให้กับโมเดลภาษาได้

const session = await chrome.aiOriginTrial.languageModel.create({
  systemPrompt: 'You are a helpful and friendly assistant.',
});
await session.prompt('What is the capital of Italy?');
// 'The capital of Italy is Rome.'

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

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

const session = await chrome.aiOriginTrial.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 chrome.aiOriginTrial.languageModel.create({
  systemPrompt: '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 chrome.aiOriginTrial.languageModel.capabilities();

if (available !== 'no') {
  const session = await chrome.aiOriginTrial.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 chrome.aiOriginTrial.languageModel.capabilities();

if (available !== 'no') {
  const session = await chrome.aiOriginTrial.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

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

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