เผยแพร่: 11 พฤศจิกายน 2024 อัปเดตล่าสุด: 20 พฤษภาคม 2025
วิดีโออธิบาย | เว็บ | ส่วนขยาย | สถานะ Chrome | ความตั้งใจ |
---|---|---|---|---|
GitHub | ดู | ความตั้งใจที่จะทดสอบ |
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
แล้ว ออบเจ็กต์ยังมีช่องต่อไปนี้ด้วย
defaultTopK
: ค่าเริ่มต้นของรายการยอดนิยม K อันดับแรก (ค่าเริ่มต้น:3
)maxTopK
: ค่า top-K สูงสุด (8
)defaultTemperature
: อุณหภูมิเริ่มต้น (1.0
) ค่าอุณหภูมิต้องอยู่ระหว่าง0.0
ถึง2.0
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
เข้าร่วมและแชร์ความคิดเห็น
ความคิดเห็นของคุณจะส่งผลโดยตรงต่อวิธีที่เราสร้างและใช้งาน API เวอร์ชันอนาคตของ API นี้และ API AI ในตัวทั้งหมด
- หากต้องการแสดงความคิดเห็นเกี่ยวกับการใช้งาน Chrome ให้ส่งรายงานข้อบกพร่องหรือคำขอฟีเจอร์
- แชร์ความคิดเห็นเกี่ยวกับรูปแบบ API โดยแสดงความคิดเห็นในปัญหาที่มีอยู่ หรือเปิดปัญหาใหม่ในที่เก็บ GitHub ของ Prompt API
- ดาวน์โหลดส่วนขยายตัวอย่าง Prompt API ใน GitHub
- มีส่วนร่วมในมาตรฐานโดยเข้าร่วมกลุ่มชุมชน Web Incubator