Data publikacji: 11 listopada 2024 r., ostatnia aktualizacja: 20 maja 2025 r.
Objaśnienie | Sieć | Rozszerzenia | Stan Chrome | Intencja |
---|---|---|---|---|
GitHub | Wyświetl | Intencja przeprowadzenia eksperymentu |
Dzięki interfejsowi Prompt API możesz wysyłać żądania w języku naturalnym do Gemini Nano w przeglądarce.
Prompt API można używać w rozszerzeniach do Chrome na wiele sposobów. Na przykład:
- Natychmiastość wydarzeń w kalendarzu. Utwórz rozszerzenie Chrome, które automatycznie wyodrębnia szczegóły wydarzeń ze stron internetowych, aby użytkownicy mogli tworzyć wpisy w kalendarzu w zaledwie kilku krokach.
- Bezproblemowe wyodrębnianie kontaktów. Utwórz rozszerzenie, które wyodrębnia dane kontaktowe z witryn, ułatwiając użytkownikom kontakt z firmą lub dodanie szczegółów do listy kontaktów.
- Filtrowanie dynamiczne treści. Utwórz rozszerzenie do Chrome, które analizuje artykuły informacyjne i automatycznie zaciera lub ukrywa treści na podstawie zdefiniowanych przez użytkownika tematów.
To tylko kilka możliwości, ale z niecierpliwością czekamy na Twoje projekty.
Korzystanie z interfejsu Prompt API w rozszerzeniach
W przestrzeni nazw LanguageModel
dostępne są 2 funkcje rozszerzenia:
availability()
, aby sprawdzić, co potrafi model i czy jest dostępny.create()
, aby rozpocząć sesję modelu językowego.
Pobieranie modelu
Interfejs Prompt API korzysta w Chrome z modelu Gemini Nano. Interfejs API jest wbudowany w Chrome, ale model jest pobierany osobno przy pierwszym użyciu interfejsu API przez rozszerzenie.
Aby sprawdzić, czy model jest gotowy do użycia, wywołaj asynchroniczną funkcję LanguageModel.availability()
. Powinien on zwrócić jedną z tych odpowiedzi:
'no'
: przeglądarka obsługuje interfejs Prompt API, ale obecnie nie można z niego korzystać. Może to być spowodowane wieloma czynnikami, np. niewystarczającą ilością wolnego miejsca na dysku do pobrania modelu.'readily'
: przeglądarka obsługuje interfejs Prompt API i można go od razu używać.'after-download'
: przeglądarka obsługuje interfejs Prompt API, ale musi najpierw pobrać model.
Aby wywołać pobieranie modelu i utworzyć sesję modelu językowego, wywołaj asynchroniczną funkcję LanguageModel.availability()
. Jeśli odpowiedź na availability()
to 'after-download'
, zalecamy sprawdzenie postępu pobierania. Dzięki temu możesz poinformować użytkownika, jeśli pobieranie trwa.
const session = await LanguageModel.create({
monitor(m) {
m.addEventListener("downloadprogress", (e) => {
console.log(`Downloaded ${e.loaded} of ${e.total} bytes.`);
});
},
});
Możliwości modelu
Funkcja availability()
informuje też o możliwościach modelu językowego. Oprócz pola available
obiekt zawiera też te pola:
defaultTopK
: domyślna wartość top-K (domyślnie3
).maxTopK
: maksymalna wartość top-K (8
).defaultTemperature
: domyślna temperatura (1.0
). Wartość temperatury musi mieścić się w zakresie od0.0
do2.0
.
await LanguageModel.availability();
// {available: 'readily', defaultTopK: 3, maxTopK: 8, defaultTemperature: 1}
Tworzenie sesji
Gdy interfejs Prompt API będzie gotowy do użycia, utwórz sesję za pomocą funkcji create()
.
Model możesz wywołać za pomocą funkcji prompt()
lub promptStreaming()
.
Dostosowywanie sesji
Każdą sesję można dostosować za pomocą opcjonalnego obiektu topK
i temperature
. Wartości domyślne tych parametrów są zwracane z poziomu 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,
});
Opcjonalny obiekt options funkcji create()
przyjmuje też pole signal
, które umożliwia przekazanie wartości AbortSignal
, aby zniszczyć sesję.
const controller = new AbortController();
stopButton.onclick = () => controller.abort();
const session = await LanguageModel.create({
signal: controller.signal,
})
Początkowe prompty
Za pomocą początkowych promptów możesz przekazać modelowi językowemu kontekst poprzednich interakcji, aby umożliwić użytkownikowi wznowienie zapisanej sesji po ponownym uruchomieniu przeglądarki.
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. [...]' }
]
});
Ograniczenia sesji
Dana sesja modelu językowego ma maksymalną liczbę tokenów, które może przetworzyć. Aby sprawdzić zużycie i postępy w kierunku osiągnięcia tego limitu, użyj tych właściwości obiektu sesji:
console.log(`${session.tokensSoFar}/${session.maxTokens}
(${session.tokensLeft} left)`);
Trwałość sesji
Każda sesja śledzi kontekst rozmowy. Wpływ na przyszłe interakcje mają poprzednie interakcje, dopóki okno kontekstu sesji nie zostanie wypełnione.
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);
Klonowanie sesji
Aby zachować zasoby, możesz sklonować istniejącą sesję za pomocą funkcji clone()
. Kontekst rozmowy jest resetowany, ale początkowe prompt pozostaje nienaruszony. Funkcja clone()
przyjmuje opcjonalny obiekt opcji z polem signal
, co umożliwia przekazanie wartości AbortSignal
, aby zniszczyć sklonowaną sesję.
const controller = new AbortController();
stopButton.onclick = () => controller.abort();
const clonedSession = await session.clone({
signal: controller.signal,
});
Prośba o model
Model możesz wywołać za pomocą funkcji prompt()
lub promptStreaming()
.
Dane wyjściowe niebędące strumieniem
Jeśli oczekujesz krótkiego wyniku, możesz użyć funkcji prompt()
, która zwraca odpowiedź, gdy tylko będzie ona dostępna.
// 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);
}
Wyjście strumieniowe
Jeśli oczekujesz dłuższej odpowiedzi, użyj funkcji promptStreaming()
, która pozwala wyświetlać częściowe wyniki w miarę ich generowania przez model.
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);
}
}
Funkcja promptStreaming()
zwraca ReadableStream
, którego elementy są nakładane na siebie. Przykłady: "Hello,"
, "Hello world,"
, "Hello world I am,"
, "Hello world I am an AI."
. Nie jest to zamierzone działanie. Chcemy dostosować się do innych interfejsów API strumieniowania na platformie, w których przypadku fragmenty to kolejne części jednego długiego strumienia. Oznacza to, że dane wyjściowe będą miały postać sekwencji "Hello"
, " world"
, " I am"
, " an AI"
.
Aby osiągnąć pożądane działanie, możesz wdrożyć te rozwiązania. Ta funkcja działa zarówno w przypadku standardowego, jak i niestandardowego zachowania.
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);
Zatrzymywanie promptu
Zarówno prompt()
, jak i promptStreaming()
akceptują opcjonalny drugi parametr z polem signal
, który umożliwia zatrzymanie wyświetlania promptów.
const controller = new AbortController();
stopButton.onclick = () => controller.abort();
const result = await session.prompt(
'Write me a poem!',
{ signal: controller.signal }
);
Zakończ sesję
Jeśli nie potrzebujesz już sesji, zadzwoń pod numer destroy()
, aby zwolnić zasoby. Po zniszczeniu sesji nie można jej już używać, a każde trwające wykonywanie zostanie przerwane. Jeśli zamierzasz często korzystać z modela, możesz zachować sesję, ponieważ jej utworzenie może zająć trochę czasu.
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."
);
Prezentacja
Aby przetestować interfejs Prompt API w rozszerzeniach Chrome, zainstaluj rozszerzenie demonstracyjne. Kod źródłowy rozszerzenia jest dostępny na GitHubie.
Udział w badaniu i przesyłanie opinii
Twoje opinie mogą mieć bezpośredni wpływ na sposób tworzenia i wdrażania przyszłych wersji tego interfejsu API oraz wszystkich wbudowanych interfejsów API AI.
- Aby przekazać opinię na temat implementacji Chrome, prześlij raport o błędzie lub prośbę o dodanie funkcji.
- Przekaż opinię na temat kształtu interfejsu API, komentując istniejące zgłoszenie lub otwierając nowe w repozytorium Prompt API na GitHubie.
- Pobierz przykładowe rozszerzenie Prompt API na GitHubie.
- Aby wziąć udział w tworzeniu standardów, dołącz do grupy społecznościowej Web Incubator Community Group.