Prompt API

Xuất bản: ngày 20 tháng 5 năm 2025, Lần cập nhật gần đây nhất: ngày 21 tháng 7 năm 2025

Video giải thích Web Phần mở rộng Trạng thái của Chrome Intent
GitHub Bản dùng thử theo nguyên gốc Trong Bản dùng thử theo nguyên gốc Chrome 138 Xem Ý định thử nghiệm

Với Prompt API, bạn có thể gửi các yêu cầu bằng ngôn ngữ tự nhiên đến Gemini Nano trong trình duyệt.

Bạn có thể sử dụng Prompt API theo nhiều cách trong một ứng dụng web hoặc trang web. Ví dụ: bạn có thể tạo:

  • Tìm kiếm dựa trên AI: Trả lời câu hỏi dựa trên nội dung của một trang web.
  • Nguồn cấp dữ liệu tin tức được cá nhân hoá: Tạo một nguồn cấp dữ liệu phân loại bài viết theo danh mục một cách linh hoạt và cho phép người dùng lọc nội dung đó.

Đây chỉ là một vài khả năng và chúng tôi rất háo hức chờ đón những sáng tạo của bạn.

Xem các yêu cầu về phần cứng

Nhà phát triển và người dùng vận hành các tính năng bằng những API này trong Chrome phải đáp ứng các yêu cầu sau. Các trình duyệt khác có thể có các yêu cầu khác về hoạt động.

Language Detector API và Translator API hoạt động trong Chrome trên máy tính. Các API này không hoạt động trên thiết bị di động. Prompt API, Summarizer API, Writer API và Rewriter API hoạt động trong Chrome khi đáp ứng các điều kiện sau:

  • Hệ điều hành: Windows 10 hoặc 11; macOS 13 trở lên (Ventura trở lên); Linux; hoặc ChromeOS (từ Nền tảng 16389.0.0 trở lên) trên các thiết bị [Chromebook Plus](https://www.google.com/chromebook/chromebookplus/). Chrome dành cho Android, iOS và ChromeOS trên các thiết bị không phải Chromebook Plus hiện chưa được các API sử dụng Gemini Nano hỗ trợ.
  • Bộ nhớ: Ít nhất 22 GB dung lượng trống trên ổ đĩa chứa hồ sơ Chrome của bạn.
  • GPU: VRAM phải lớn hơn 4 GB.
  • Mạng: Gói dữ liệu không giới hạn hoặc kết nối không đo lượng dữ liệu.

Kích thước chính xác của Gemini Nano có thể thay đổi khi trình duyệt cập nhật mô hình. Để xác định kích thước hiện tại, hãy truy cập vào chrome://on-device-internals rồi chuyển đến phần Trạng thái mô hình. Mở Đường dẫn tệp được liệt kê để xác định kích thước mô hình.

Sử dụng Prompt API

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 này sẽ được tải xuống riêng vào lần đầu tiên một nguồn 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 LanguageModel.availability(). Nếu phản hồi cho availability()downloadable, hãy theo dõi tiến trình tải xuống và thông báo cho người dùng, vì quá trình tải xuống có thể mất thời gian.

const availability = await LanguageModel.availability();

Để kích hoạt quá trình tải xuống và khởi tạo mô hình ngôn ngữ, hãy kiểm tra hoạt động kích hoạt của người dùng. Sau đó, hãy gọi hàm không đồng bộ LanguageModel.create().

const session = await LanguageModel.create({
  monitor(m) {
    m.addEventListener('downloadprogress', (e) => {
      console.log(`Downloaded ${e.loaded * 100}%`);
    });
  },
});

Tham số mô hình

Hàm params() cho bạn biết các tham số của mô hình ngôn ngữ. Đối tượng này có các trường sau:

await LanguageModel.params();
// {defaultTopK: 3, maxTopK: 128, defaultTemperature: 1, maxTemperature: 2}

Tạo phiên

Sau khi Prompt API có thể chạy, bạn sẽ tạo một phiên bằng hàm create().

Bạn có thể tuỳ chỉnh từng phiên bằng topKtemperature bằng cách sử dụng một đối tượng lựa chọn không bắt buộc. Các giá trị mặc định cho những tham số này được trả về từ LanguageModel.params().

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

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

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

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

Thêm bối cảnh bằng lời nhắc ban đầu

Với câu lệnh 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 đó, ví dụ: cho phép người dùng tiếp tục một phiên đã lưu trữ sau khi khởi động lại trình duyệt.

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

Hạn chế câu trả lời bằng một tiền tố

Bạn có thể thêm vai trò "assistant", ngoài các vai trò trước đó, để giải thích thêm về các câu trả lời trước đó của mô hình. Ví dụ:

const followup = await session.prompt([
  {
    role: "user",
    content: "I'm nervous about my presentation tomorrow"
  },
  {
    role: "assistant",
    content: "Presentations are tough!"
  }
]);

Trong một số trường hợp, thay vì yêu cầu phản hồi mới, bạn có thể muốn điền sẵn một phần thông báo phản hồi "assistant". Điều này có thể hữu ích khi hướng dẫn mô hình ngôn ngữ sử dụng một định dạng phản hồi cụ thể. Để thực hiện việc này, hãy thêm prefix: true vào thông báo "assistant"-role ở cuối. Ví dụ:

const characterSheet = await session.prompt([
  {
    role: 'user',
    content: 'Create a TOML character sheet for a gnome barbarian',
  },
  {
    role: 'assistant',
    content: '```toml\n',
    prefix: true,
  },
]);

Thêm thông báo

Quá trình suy luận có thể mất một chút thời gian, đặc biệt là khi bạn đưa ra câu lệnh bằng dữ liệu đầu vào đa phương thức. Bạn có thể gửi trước các câu lệnh đã xác định trước để điền sẵn thông tin cho phiên, nhờ đó mô hình có thể bắt đầu xử lý sớm.

Mặc dù initialPrompts rất hữu ích khi tạo phiên, nhưng bạn có thể dùng phương thức append() ngoài các phương thức prompt() hoặc promptStreaming() để đưa ra thêm các câu lệnh theo bối cảnh bổ sung sau khi tạo phiên.

Ví dụ:

const session = await LanguageModel.create({
  initialPrompts: [
    {
      role: 'system',
      content:
        'You are a skilled analyst who correlates patterns across multiple images.',
    },
  ],
  expectedInputs: [{ type: 'image' }],
});

fileUpload.onchange = async () => {
  await session.append([
    {
      role: 'user',
      content: [
        {
          type: 'text',
          value: `Here's one image. Notes: ${fileNotesInput.value}`,
        },
        { type: 'image', value: fileUpload.files[0] },
      ],
    },
  ]);
};

analyzeButton.onclick = async (e) => {
  analysisResult.textContent = await session.prompt(userQuestionInput.value);
};

Lời hứa do append() trả về sẽ được thực hiện sau khi lời nhắc được xác thực, xử lý và thêm vào phiên. Lời hứa bị từ chối nếu không thể thêm lời nhắc.

Tính năng duy trì phiên và giới hạn

Mỗi phiên sẽ theo dõi bối cảnh của cuộc trò chuyện. Các lượt tương tác trước đó sẽ đượ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 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);

Mỗi phiên có số lượng mã thông báo tối đa mà phiên đó có thể xử lý. Bạn có thể kiểm tra tiến trình đạt đến giới hạn này bằng cách:

console.log(`${session.inputUsage}/${session.inputQuota}`);

Truyền một giản đồ JSON

Thêm trường responseConstraint vào phương thức prompt() hoặc promptStreaming() để truyền một giản đồ JSON làm giá trị. Sau đó, bạn có thể sử dụng đầu ra có cấu trúc với Prompt API.

Trong ví dụ sau, JSON Schema đảm bảo rằng mô hình phản hồi bằng true hoặc false để phân loại xem một thông báo nhất định có phải về đồ gốm hay không.

const session = await LanguageModel.create();

const schema = {
  "type": "boolean"
};

const post = "Mugs and ramen bowls, both a bit smaller than intended, but that
happens with reclaim. Glaze crawled the first time around, but pretty happy
with it after refiring.";

const result = await session.prompt(
  `Is this post about pottery?\n\n${post}`,
  {
    responseConstraint: schema,
  }
);
console.log(JSON.parse(result));
// true

Quy trình triển khai của bạn có thể bao gồm một Biểu mẫu JSON hoặc biểu thức chính quy trong thông báo được gửi đến mô hình. Thao tác này sẽ sử dụng một phần hạn mức đầu vào. Bạn có thể đo lường mức hạn ngạch đầu vào mà ứng dụng sẽ sử dụng bằng cách truyền lựa chọn responseConstraint đến session.measureInputUsage().

Bạn có thể tránh hành vi này bằng lựa chọn omitResponseConstraintInput. Nếu làm như vậy, bạn nên đưa ra một số hướng dẫn trong câu lệnh:

const result = await session.prompt(`
  Summarize this feedback into a rating between 0-5. Only output a JSON
  object { rating }, with a single property whose value is a number:
  The food was delicious, service was excellent, will recommend.
`, { responseConstraint: schema, omitResponseConstraintInput: true });

Sao chép một phiên

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

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

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

Đưa ra câu lệnh 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 được truyền trực tuyến

Nếu muốn có kết quả ngắn gọn, bạn có thể dùng hàm prompt(). Hàm này sẽ trả về phản hồi ngay 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 { defaultTemperature, maxTemperature, defaultTopK, maxTopK } =
  await LanguageModel.params();

const available = await LanguageModel.availability();

if (available !== 'unavailable') {
  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);
}

Đầu ra được truyền trực tuyến

Nếu muốn nhận được phản hồi dài hơn, bạn nên sử dụng hàm promptStreaming(). Hàm này cho phép bạn hiển thị kết quả một phần khi kết quả đến từ mô hình. Hàm promptStreaming() trả về ReadableStream.

const { defaultTemperature, maxTemperature, defaultTopK, maxTopK } =
  await LanguageModel.params();

const available = await LanguageModel.availability();
if (available !== 'unavailable') {
  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);
  }
}

Dừng nhắc

Cả prompt()promptStreaming() đều chấp nhận tham số thứ hai không bắt buộc có 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 mộ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ỷ, phiên đó sẽ không dùng được nữa và mọi hoạt động thực thi đang diễn ra sẽ bị huỷ. Bạn nên giữ phiên nếu dự định thường xuyên nhắc mô hình vì việc tạo phiên có thể mất một khoảng 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 choosing between a t-shirt
  and a polo."
);

Khả năng đa phương thức

Bản dùng thử theo nguyên gốc Prompt API hỗ trợ đầu vào là âm thanh và hình ảnh. API này trả về một kết quả dạng văn bản.

Với những chức năng này, bạn có thể:

  • Cho phép người dùng chép lời tin nhắn thoại được gửi trong một ứng dụng nhắn tin.
  • Mô tả một hình ảnh được tải lên trang web của bạn để sử dụng trong chú thích hoặc văn bản thay thế.
const session = await LanguageModel.create({
  // { type: 'text' } only required when including expected input languages.
  expectedInputs: [{ type: 'audio' }, { type: 'image' }],
});

const referenceImage = await (await fetch('/reference-image.jpeg')).blob();
const userDrawnImage = document.querySelector('canvas');

const response1 = await session.prompt([
  {
    role: 'user',
    content: [
      {
        type: 'text',
        value:
          'Give an artistic critique of how well the second image matches the first:',
      },
      { type: 'image', value: referenceImage },
      { type: 'image', value: userDrawnImage },
    ],
  },
]);

console.log(response1);

const audioBlob = await captureMicrophoneInput({ seconds: 10 });

const response2 = await session.prompt([
  {
    role: 'user',
    content: [
      { type: 'text', value: 'My response to your critique:' },
      { type: 'audio', value: audioBlob },
    ],
  },
]);

Hãy xem bản minh hoạ Câu lệnh âm thanh MediaRecorder để biết cách sử dụng Prompt API với đầu vào âm thanh và bản minh hoạ Câu lệnh hình ảnh Canvas để biết cách sử dụng Prompt API với đầu vào hình ảnh.

Chiến lược hiệu suất

Prompt API cho web vẫn đang trong quá trình phát triển. Trong khi chúng tôi xây dựng API này, hãy tham khảo các phương pháp hay nhất của chúng tôi về quản lý phiên để đạt được hiệu suất tối ưu.

Chính sách về quyền, iframe và Web Worker

Theo mặc định, Prompt API chỉ có sẵn cho các cửa sổ cấp cao nhất và iframe cùng nguồn của các cửa sổ đó. Bạn có thể uỷ quyền truy cập vào API cho iframe nhiều nguồn gốc bằng cách sử dụng thuộc tính Permission Policy allow="":

<!--
  The hosting site at https://main.example.com can grant a cross-origin iframe
  at https://cross-origin.example.com/ access to the Prompt API by
  setting the `allow="language-model"` attribute.
-->
<iframe src="https://cross-origin.example.com/" allow="language-model"></iframe>

Prompt API hiện không có trong Web Workers do sự phức tạp của việc thiết lập một tài liệu có trách nhiệm cho mỗi worker để kiểm tra trạng thái chính sách về quyền.

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

Ý kiến của bạn có thể ảnh hưở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 và tất cả API AI tích hợp.