Prompt API trong tiện ích của Chrome

Ngày xuất bản: 11 tháng 11 năm 2024

Prompt API for Extensions (API lời nhắc cho tiện ích) hiện đã có trong bản dùng thử theo nguyên gốc. Nhờ đó, bạn có thể tạo các tiện ích Chrome sử dụng Gemini Nano, mô hình ngôn ngữ hiệu quả nhất của chúng tôi, trong trình duyệt.

Có nhiều trường hợp sử dụng Prompt API với Tiện ích Chrome. Dưới đây là một số ví dụ:

  • Sự kiện tức thì trên lịch. Phát triển một tiện ích Chrome tự động trích xuất thông tin chi tiết về sự kiện từ các trang web để người dùng có thể tạo mục trên lịch chỉ bằng vài bước.
  • Trích xuất thông tin liên hệ liền mạch. Tạo một tiện ích trích xuất thông tin liên hệ từ các trang web, giúp người dùng dễ dàng liên hệ với một doanh nghiệp hoặc thêm thông tin chi tiết vào danh bạ của họ.
  • Lọc nội dung động. Tạo một Tiện ích Chrome phân tích các bài báo và tự động làm mờ hoặc ẩn nội dung dựa trên các chủ đề do người dùng xác định.

Đây chỉ là một vài gợi ý, nhưng chúng tôi rất mong được xem những nội dung sáng tạo của bạn.

Phạm vi cung cấp

  • Tham gia thử nghiệm nguồn gốc Prompt API, chạy trong Chrome 131 đến 136, để tạo Tiện ích bằng API này. Nếu bạn mới tham gia chương trình thử nghiệm nguồn gốc, thì đây là các chương trình có giới hạn thời gian dành cho tất cả nhà phát triển, cung cấp quyền sử dụng sớm các tính năng thử nghiệm của nền tảng. Nhà phát triển có thể thử nghiệm, thu thập ý kiến phản hồi của người dùng và lặp lại để chuẩn bị cho lần phát hành trong tương lai.
    • Mặc dù có thể có giới hạn sử dụng, nhưng bạn có thể tích hợp các tính năng này để kiểm thử trực tiếp và thu thập ý kiến phản hồi của người dùng. Mục tiêu là để thông báo cho các lần lặp lại trong tương lai của API này, khi chúng tôi nỗ lực mở rộng phạm vi cung cấp.
  • Tham gia chương trình xem trước sớm để xem trước các API AI tích hợp mới và tham gia thảo luận trên danh sách gửi thư của chúng tôi.

Tham gia thử nghiệm về nguồn gốc

Để sử dụng Prompt API trong Tiện ích Chrome, hãy thêm quyền "aiLanguageModelOriginTrial" vào tệp manifest.json theo trích đoạn sau, cùng với mọi quyền khác mà tiện ích của bạn có thể cần.

Để đăng ký tiện ích của bạn cho bản dùng thử theo nguồn gốc, hãy sử dụng URL chrome-extension://YOUR_EXTENSION_ID làm Nguồn gốc web. Ví dụ: chrome-extension://ljjhjaakmncibonnjpaoglbhcjeolhkk

Đăng ký dùng thử Chrome Origin

Mã tiện ích được tạo động, nhưng sau khi chỉ định mã, bạn có thể buộc mã đó phải ổn định bằng cách thêm thuộc tính key vào tệp kê khai.

Sau khi đăng ký dùng thử ban đầu, bạn sẽ nhận được một mã thông báo được tạo. Bạn cần truyền mã thông báo này trong một mảng dưới dạng giá trị của trường trial_tokens trong tệp kê khai. Hãy xem đoạn mã để biết ví dụ.

{
  "permissions": ["aiLanguageModelOriginTrial"],
  "trial_tokens": ["GENERATED_TOKEN"],
}

Thêm tính năng hỗ trợ cho máy chủ cục bộ

Để truy cập Prompt API trên localhost trong bản dùng thử theo nguyên gốc, bạn phải cập nhật Chrome lên phiên bản mới nhất. Sau đó, thực hiện theo những bước sau:

  1. Mở Chrome trên một trong các nền tảng sau: Windows, Mac hoặc Linux.
  2. Chuyển đến chrome://flags/#optimization-guide-on-device-model.
  3. Chọn Enabled BypassPerfRequirement (Đã bật BypassPerfRequirement).
    • Thao tác này sẽ bỏ qua các bước kiểm tra hiệu suất có thể khiến bạn không tải Gemini Nano xuống thiết bị.
  4. Nhấp vào Chạy lại hoặc khởi động lại Chrome.

Sử dụng Prompt API

Sau khi yêu cầu quyền sử dụng Prompt API, bạn có thể tạo tiện ích của mình. Bạn có thể sử dụng hai hàm mở rộng mới trong không gian tên chrome.aiOriginTrial.languageModel:

  • capabilities() để kiểm tra xem mô hình có thể làm được gì và liệu có sẵn mô hình đó hay không.
  • create() để bắt đầu một phiên mô hình ngôn ngữ.

Tải mô hình xuống

Prompt API sử dụng mô hình Gemini Nano trong Chrome. Mặc dù API được tích hợp vào Chrome, nhưng mô hình sẽ được tải xuống riêng trong lần đầu tiên một tiện ích sử dụng API.

Để xác định xem mô hình đã sẵn sàng để sử dụng hay chưa, hãy gọi hàm chrome.aiOriginTrial.languageModel.capabilities() không đồng bộ. Phương thức này trả về một đối tượng AILanguageModelCapabilities có trường available có thể nhận được 3 giá trị:

  • 'no': Trình duyệt hiện tại hỗ trợ Prompt API, nhưng hiện không thể sử dụng API này. Điều này có thể là do một số lý do, chẳng hạn như không có đủ dung lượng ổ đĩa để tải mô hình xuống.
  • 'readily': Trình duyệt hiện tại hỗ trợ Prompt API và bạn có thể sử dụng ngay.
  • 'after-download': Trình duyệt hiện tại hỗ trợ Prompt API, nhưng trước tiên, trình duyệt cần tải mô hình xuống.

Để kích hoạt quá trình tải mô hình xuống và tạo phiên mô hình ngôn ngữ, hãy gọi hàm chrome.aiOriginTrial.languageModel.create() không đồng bộ. Nếu phản hồi cho capabilities()'after-download', thì tốt nhất bạn nên theo dõi tiến trình tải xuống. Bằng cách này, bạn có thể thông báo cho người dùng trong trường hợp quá trình tải xuống mất nhiều thời gian.

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

Khả năng của mô hình

Hàm capabilities() cũng cho bạn biết các chức năng của mô hình ngôn ngữ. Ngoài available, đối tượng AILanguageModelCapabilities thu được cũng có các trường sau:

  • defaultTopK: Giá trị mặc định của top-K (mặc định: 3).
  • maxTopK: Giá trị tối đa trong K hàng đầu (8).
  • defaultTemperature: Nhiệt độ mặc định (1.0). Nhiệt độ phải nằm trong khoảng từ 0.0 đến 2.0.
await chrome.aiOriginTrial.languageModel.capabilities();
// {available: 'readily', defaultTopK: 3, maxTopK: 8, defaultTemperature: 1}

Tạo phiên

Sau khi đảm bảo Prompt API có thể chạy, bạn tạo một phiên bằng hàm create(). Sau đó, bạn có thể nhắc mô hình bằng hàm prompt() hoặc promptStreaming().

Tuỳ chọn phiên

Bạn có thể tuỳ chỉnh từng phiên bằng topKtemperature bằng cách sử dụng đối tượng tuỳ chọn không bắt buộc. Giá trị mặc định cho các tham số này được trả về từ 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,
});

Đối tượng tuỳ chọn không bắt buộc của hàm create() cũng lấy trường signal, cho phép bạn truyền AbortSignal để huỷ phiên.

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

const session = await chrome.aiOriginTrial.languageModel.create({
  signal: controller.signal,
})
Lời nhắc của hệ thống

Với lời nhắc của hệ thống, bạn có thể cung cấp cho mô hình ngôn ngữ một số ngữ cảnh.

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

Câu lệnh ban đầu

Với lời nhắc ban đầu, bạn có thể cung cấp cho mô hình ngôn ngữ ngữ cảnh về các lượt tương tác trước đó, chẳng hạn như để cho phép người dùng tiếp tục một phiên đã lưu sau khi khởi động lại trình duyệt.

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

Thông tin về phiên

Một phiên hoạt động của mô hình ngôn ngữ nhất định có số lượng mã thông báo tối đa mà mô hình đó có thể xử lý. Bạn có thể kiểm tra mức sử dụng và tiến trình đạt đến giới hạn đó bằng cách sử dụng các thuộc tính sau trên đối tượng phiên:

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

Duy trì phiên

Mỗi phiên theo dõi ngữ cảnh của cuộc trò chuyện. Các lượt tương tác trước đó được tính đến cho các lượt tương tác trong tương lai cho đến khi cửa sổ ngữ cảnh của phiên đầy.

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

Sao chép một phiên

Để bảo tồn tài nguyên, bạn có thể nhân bản một phiên hiện có bằng hàm clone(). Ngữ cảnh cuộc trò chuyện được đặt lại, nhưng lời nhắc ban đầu hoặc lời nhắc của hệ thống sẽ vẫn nguyên vẹn. Hàm clone() nhận một đối tượng tuỳ chọn với trường signal, cho phép bạn truyền AbortSignal để huỷ phiên được sao chép.

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

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

Gợi ý cho mô hình

Bạn có thể nhắc mô hình bằng hàm prompt() hoặc promptStreaming().

Đầu ra không phát trực tuyến

Nếu muốn có kết quả ngắn, bạn có thể sử dụng hàm prompt() để trả về phản hồi khi có.

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

Đầu ra phát trực tuyến

Nếu muốn có phản hồi lâu hơn, bạn nên sử dụng hàm promptStreaming() để hiển thị một phần kết quả khi chúng đến từ mô hình.

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() trả về một ReadableStream có các phần tử liên tiếp tạo nên nhau. Ví dụ: "Hello,", "Hello world,", "Hello world I am,", "Hello world I am an AI.". Đây không phải là hành vi mong muốn. Chúng tôi dự định điều chỉnh cho phù hợp với các API truyền trực tuyến khác trên nền tảng, trong đó các đoạn là các phần liên tiếp của một luồng dài duy nhất. Điều này có nghĩa là kết quả sẽ là một trình tự như "Hello", " world", " I am", " an AI".

Hiện tại, để đạt được hành vi mong muốn, bạn có thể triển khai như sau. Điều này áp dụng cho cả hành vi chuẩn và không chuẩn.

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

Dừng chạy lời nhắc

Cả prompt()promptStreaming() đều chấp nhận tham số thứ hai không bắt buộc với trường signal, cho phép bạn dừng chạy lời nhắc.

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

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

Chấm dứt phiên

Gọi destroy() để giải phóng tài nguyên nếu bạn không cần phiên nữa. Khi một phiên bị huỷ, bạn sẽ không thể sử dụng phiên đó nữa và mọi quá trình thực thi đang diễn ra sẽ bị huỷ. Bạn nên giữ phiên hoạt động nếu dự định thường xuyên nhắc mô hình, vì việc tạo phiên hoạt động có thể mất chút thời gian.

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

Bản minh hoạ

Để kiểm thử Prompt API trong Tiện ích Chrome, hãy cài đặt tiện ích minh hoạ. Bạn có thể xem mã nguồn của tiện ích trên GitHub.

Giao diện minh hoạ cho Prompt API

Tham gia và chia sẻ ý kiến phản hồi

Hãy bắt đầu thử nghiệm Prompt API ngay trong Tiện ích Chrome bằng cách tham gia bản dùng thử theo nguyên gốc và chia sẻ ý kiến phản hồi của bạn. Ý kiến đóng góp của bạn có thể tác động trực tiếp đến cách chúng tôi xây dựng và triển khai các phiên bản trong tương lai của API này cũng như tất cả API AI tích hợp.