Mô hình ngôn ngữ

Tính năng web: LanguageModel

Prompt API cho phép nhà phát triển chạy các tác vụ xử lý ngôn ngữ tự nhiên ngay trong trình duyệt bằng Gemini Nano. Phương pháp AI tích hợp này đảm bảo quyền riêng tư của người dùng, giảm chi phí máy chủ và cho phép hoạt động khi không có mạng.

1. Bắt đầu và yêu cầu về phần cứng

Prompt API hiện có trong Chrome kể từ phiên bản 148 (máy tính) cho Windows, macOS, Linux và Chromebook Plus.

Điều kiện tiên quyết về phần cứng

  • Bộ nhớ: 22 GB dung lượng trống (cho hồ sơ và mô hình ban đầu).
  • Bộ nhớ/CPU: RAM 16 GB và CPU 4 nhân trở lên.
  • GPU: VRAM 4 GB trở lên (Bắt buộc đối với đầu vào âm thanh).
  • Mạng: Chỉ cần thiết cho lần tải mô hình xuống đầu tiên.

Khởi chạy API

Kiểm tra xem mô hình có sẵn hay không trước khi kích hoạt quá trình tải xuống:

const availability = await LanguageModel.availability();

// Do not call create() when unavailable — the model cannot run on this device.
if (availability !== 'unavailable') {
    const session = await LanguageModel.create({
        monitor(m) {
            // Inform the user while the model downloads so the UI doesn't appear frozen.
            m.addEventListener('downloadprogress', (e) => {
                console.log(`Downloaded ${e.loaded * 100}%`);
            });
        },
    });
}

2. Các tính năng cốt lõi của câu lệnh

Các ví dụ về phiên trong phần này bỏ qua session.destroy() để cho ngắn gọn. Luôn gọi session.destroy() khi không cần phiên nữa để giải phóng bộ nhớ thiết bị (xem Mục 5).

Kết quả cơ bản và kết quả truyền trực tuyến

Đối với câu trả lời ngắn, hãy dùng prompt(). Đối với nội dung dài hơn, hãy sử dụng promptStreaming() để cung cấp giao diện người dùng thích ứng hơn.

BẮT BUỘC: Không bao giờ gán kết quả đầu ra của mô hình cho innerHTML. Đầu ra của mô hình không đáng tin cậy và có thể chứa mã đánh dấu được chèn. Luôn sử dụng textContent hoặc chất khử trùng.

const session = await LanguageModel.create();

// prompt() accumulates the full response before resolving — use for short, one-shot output.
const result = await session.prompt('Write a haiku about coding.');
// textContent, not innerHTML — model output is untrusted and must not be parsed as markup.
outputEl.textContent = result;

// promptStreaming() yields independent chunks that must be concatenated;
// use for longer content so each chunk can be rendered progressively.
const stream = session.promptStreaming('Write a long story about a robot.');
let completeResult = '';
for await (const chunk of stream) {
    completeResult += chunk;
    outputEl.append(chunk);
}
console.log('Full story:', completeResult);

Thông tin đầu vào đa phương thức

Prompt API hỗ trợ dữ liệu đầu vào dạng văn bản, âm thanh và hình ảnh (hình ảnh, canvas, khung video).

const session = await LanguageModel.create({
    // Declaring expected input types lets the browser optimize model loading.
    expectedInputs: [{ type: 'text' }, { type: 'image' }],
    expectedOutputs: [{ type: 'text' }],
});

const response = await session.prompt([
    {
        role: 'user',
        content: [
            { type: 'text', value: 'What is in this image?' },
            { type: 'image', value: document.querySelector('canvas') },
        ],
    },
]);

3. Quản lý phiên nâng cao

Phiên cho phép mô hình duy trì ngữ cảnh trong nhiều lượt tương tác.

Bối cảnh và hạn mức

Mỗi phiên có một giới hạn mã thông báo tối đa. Bạn có thể theo dõi mức sử dụng thông qua session.contextUsage và session.contextWindow. Nếu cửa sổ bị tràn, các thông báo cũ nhất (ngoại trừ câu lệnh hệ thống) sẽ bị loại bỏ.

Phiên nhân bản

Việc sao chép rất hiệu quả để bắt đầu các cuộc trò chuyện song song có cùng bối cảnh ban đầu (chẳng hạn như tính cách "hệ thống") mà không cần khởi động lại.

const mainSession = await LanguageModel.create({
    initialPrompts: [{ role: 'system', content: 'You speak like a pirate.' }],
});

const branchA = await mainSession.clone();
const branchB = await mainSession.clone();
// Destroy the base after cloning — the clones own their own context from here.
mainSession.destroy();

Khôi phục các phiên trước đây

Trong khi tính năng "khôi phục" gốc đang được phát triển, bạn có thể tạo lại một phiên bằng cách cung cấp nhật ký trước đó cho initialPrompts.

Lưu ý: localStorage không được mã hoá và có tính ổn định. Nhật ký trò chuyện được lưu trữ có thể bao gồm thông tin nhận dạng cá nhân (PII) của người dùng. Hãy cân nhắc các tác động đến quyền riêng tư trước khi lưu giữ nhật ký trò chuyện.

// || '[]' ensures JSON.parse never receives null when the key doesn't exist yet.
const history = JSON.parse(localStorage.getItem('chat_history') || '[]');
const session = await LanguageModel.create({
    initialPrompts: history, // Array of {role, content} objects
});

4. Kết quả có cấu trúc với giản đồ JSON

Để ngăn mô hình thêm "nội dung thừa" (ví dụ: "Chắc chắn rồi, đây là JSON của bạn:"), hãy sử dụng Giản đồ JSON thông qua trường responseConstraint. Điều này đảm bảo kết quả đầu ra là JSON hợp lệ và có thể phân tích cú pháp ngay lập tức.

Ví dụ: Phân loại cảm xúc

// Pass the schema as a plain object — do not JSON.stringify() it first.
const schema = {
    type: 'object',
    properties: {
        rating: { type: 'number', minimum: 1, maximum: 5 },
        is_positive: { type: 'boolean' },
    },
    required: ['rating', 'is_positive'],
};

const result = await session.prompt(
    "Rate the following feedback: 'The food was great!'",
    { responseConstraint: schema },
);

const data = JSON.parse(result);
console.log(data.rating); // 5

Quy tắc ràng buộc và tiền tố

Bạn có thể hướng dẫn thêm cho mô hình bằng cách điền sẵn câu trả lời của trợ lý bằng prefix: true.

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

5. Các phương pháp hay nhất và an toàn

  • Dọn dẹp tài nguyên: Luôn gọi session.destroy() khi cuộc trò chuyện kết thúc để giải phóng bộ nhớ.
  • An toàn cho đầu ra: Đầu ra của mô hình không đáng tin cậy. Luôn ghi kết quả vào textContent, không phải innerHTML, để ngăn chặn việc chèn XSS từ đầu ra của mô hình độc hại.
  • Sử dụng trình dọn dẹp như Sanitizer API gốc hoặc DOMPurify nếu bạn cần cho phép HTML ở mức hạn chế.
  • Huỷ tác vụ: Sử dụng AbortController để cho phép người dùng dừng các quá trình tạo nội dung mất nhiều thời gian. Truyền signal đến prompt() hoặc promptStreaming(), chứ không phải đến LanguageModel.create().
  • Bảo mật: Sử dụng Chính sách quyền để kiểm soát quyền truy cập trong iframe: <iframe src="..." allow="language-model"></iframe>.
  • Thiết kế: Xem lại Sổ tay hướng dẫn về Con người + AI để đảm bảo triển khai AI một cách có trách nhiệm.

Bằng cách kết hợp kết quả có cấu trúc với tính năng quản lý phiên mạnh mẽ, nhà phát triển có thể xây dựng các ứng dụng AI phức tạp, có trạng thái, chạy hoàn toàn trên thiết bị của người dùng.

Việc nên làm và không nên làm

Để xem danh sách đầy đủ và chi tiết về những việc nên làm và không nên làm, hãy truy cập https://developer.chrome.com/docs/ai/built-in-ai-dos-donts.md.txt. Dưới đây là ý chính:

Chuẩn bị mô hình vào thời điểm hợp lý

Áp dụng cho: tất cả API, ví dụ: Summarizer, Translator và Writer.

Nên làm: Khởi chạy phiên ngay khi bạn xác định rõ ý định của người dùng về việc sử dụng tính năng AI, ví dụ: khi người dùng chuyển đến một nền tảng công cụ AI có liên quan, di chuột qua một không gian làm việc AI hoặc tương tác với giao diện người dùng xung quanh tính năng đó. Việc khởi động trước phiên cho phép mô hình tải vào bộ nhớ một cách thầm lặng ở chế độ nền trong khi người dùng đang thiết lập nhiệm vụ, giúp loại bỏ độ trễ khởi động nguội có thể tránh được. Cố gắng đi trước một bước bằng cách bắt đầu tác vụ AI có khả năng xảy ra tiếp theo ngay khi bạn bắt đầu kết xuất kết quả hiện tại, ví dụ: nếu tính năng này được thiết kế để sử dụng lặp lại.

Không nên: Trừ phi cần thiết, đừng đợi người dùng nhấp vào "Tạo" để khởi chạy phiên. Điều này dẫn đến độ trễ khởi động nguội, vì trước tiên, mô hình phải tải vào bộ nhớ và chuẩn bị quy trình thực thi.

Đặt câu lệnh ban đầu trong quá trình tạo

Áp dụng cho: Prompt API.

Nên: Cung cấp chỉ dẫn hệ thống trong quá trình khởi chạy phiên để cải thiện tốc độ của câu lệnh đầu tiên.

Không nên: Bắt đầu bằng một phiên trống và gửi chỉ dẫn hệ thống trong lệnh gọi prompt() đầu tiên. Điều này làm tăng độ trễ vì buộc mô hình phải xử lý các chỉ dẫn đó vào phút cuối.

Sao chép phiên cho các tác vụ lặp lại

Áp dụng cho: Prompt API.

Đối với Prompt API, mỗi phiên sẽ theo dõi bối cảnh của cuộc trò chuyện, xem xét tất cả các lượt tương tác trước đó. Vì bản sao kế thừa mọi thứ từ phiên gốc, bao gồm cả câu lệnh ban đầu và tất cả nhật ký tương tác cho đến thời điểm sao chép, nên hãy sắp xếp cách sử dụng để chỉ kế thừa những gì bạn cần.

Nên làm:

  • Tạo phiên cơ sở: Để xử lý các nhiệm vụ không liên quan một cách hiệu quả, hãy tạo một phiên cơ sở chỉ chứa các chỉ dẫn hệ thống và không có bối cảnh trò chuyện trước đó.
  • Sao chép phiên cơ sở: Sử dụng clone() trên phiên cơ sở đó cho các tác vụ mới để tiết kiệm tài nguyên cho việc phân tích cú pháp lại chỉ dẫn hệ thống. Nhờ đó, bạn có thể tạo các cuộc trò chuyện song song hoặc đặt lại một nhiệm vụ về trạng thái ban đầu.

Không nên:

  • Đừng sử dụng lại cùng một phiên cho các nhiệm vụ không liên quan và tránh sao chép bất kỳ phiên nào đã chứa nhật ký tương tác không cần thiết. Cả hai mẫu này đều có thể khiến ngữ cảnh trước đó không liên quan can thiệp vào nhiệm vụ hiện tại của bạn.
  • Đừng gọi create() nhiều lần bằng cùng một chỉ dẫn hệ thống. Thay vào đó, hãy sử dụng mẫu sao chép để tối ưu hoá hiệu suất.

Huỷ các phiên không sử dụng

Áp dụng cho: Tất cả API.

Nên làm: Gọi rõ ràng destroy() trên các phiên mà bạn không cần nữa để giải phóng bộ nhớ khi không còn sử dụng một tính năng. Nếu bạn sử dụng mẫu sao chép, hãy giữ lại phiên cơ sở và huỷ các bản sao bạn không cần nữa.

Không nên: Duy trì nhiều phiên lớn đang hoạt động. Mỗi phiên đều tiêu tốn bộ nhớ, gây ra tình trạng sử dụng tài nguyên không cần thiết và có thể trở thành vấn đề. Trình thu gom rác sẽ tự động dọn dẹp các phiên, nhưng việc gọi destroy() sẽ giải phóng bộ nhớ nhanh hơn.

Hiển thị phản hồi trực tuyến một cách an toàn và hiệu quả

Áp dụng cho: Tất cả API có hỗ trợ truyền trực tuyến (Prompt, Summarizer, Writer, Rewriter và Translator).

Nên: Coi tất cả kết quả của LLM là nội dung không đáng tin cậy. Vệ sinh toàn bộ kết quả kết hợp, không chỉ các đoạn, vì mã độc hại có thể được phân tách giữa các bản cập nhật. Trước khi kết xuất, hãy sử dụng Sanitizer API nếu được hỗ trợ. Để tránh làm giảm hiệu suất, hãy sử dụng trình phân tích cú pháp Markdown trực tuyến như streaming-markdown.

Không nên: Đặt trực tiếp innerHTML trên mỗi lần cập nhật phân đoạn. Cách này chậm, đặc biệt là khi định dạng phức tạp như làm nổi bật cú pháp và dễ bị chèn.

Tối ưu hoá dữ liệu đầu vào để tăng tốc độ

Áp dụng cho: Tất cả API.

Nên làm: Chỉ truyền cho mô hình những thông tin thực sự cần thiết. Loại bỏ mọi thứ không liên quan đến nhiệm vụ hiện tại. Đối với các tập dữ liệu lớn, hãy cung cấp thông tin tổng quan ngắn gọn và một số ít mục có liên quan.

Không nên: Gửi văn bản thô chưa xử lý, siêu dữ liệu không cần thiết, thẻ HTML hoặc danh sách lớn chưa lọc đến API. Độ trễ tăng đáng kể theo kích thước đầu vào, điều này có thể khiến tính năng AI có vẻ như bị hỏng trên nhiều thiết bị.

Sử dụng kết quả có cấu trúc để có kết quả dễ đoán

Áp dụng cho: Prompt API.

Nên: Khi bạn cần mô hình trả về dữ liệu ở một định dạng cụ thể, hãy sử dụng đầu ra có cấu trúc bằng cách cung cấp trường responseConstraint để cung cấp Giản đồ JSON. Điều này đảm bảo kết quả đầu ra có thể dự đoán được và giúp bạn không cần phải xử lý hậu kỳ phức tạp hoặc phân tích cú pháp theo cách thủ công.

Không nên: Chỉ dựa vào hướng dẫn bằng ngôn ngữ tự nhiên (chẳng hạn như "chỉ xuất JSON"). Các mô hình có thể bao gồm từ đệm trong cuộc trò chuyện khiến trình phân tích cú pháp của bạn bị lỗi.

Tách biệt việc tạo nội dung khỏi các quy định ràng buộc về độ dài

Áp dụng cho: Prompt API, vì đây là API duy nhất hỗ trợ lược đồ đầu ra có cấu trúc.

Nên: Để mô hình tạo phản hồi một cách tự nhiên, sau đó sử dụng logic phía máy khách để cắt bớt văn bản cho phù hợp với giao diện người dùng.

Không nên: Thực thi giới hạn ký tự nghiêm ngặt như maxLength: 125 bằng cách sử dụng lược đồ đầu ra có cấu trúc. Khi câu trả lời của mô hình dài hơn giới hạn bạn đặt, mô hình có thể chuyển sang các mã thông báo có mật độ cao như tiếng nước ngoài hoặc biểu tượng cảm xúc để nén ý nghĩa, dẫn đến kết quả vô nghĩa.

Thông báo cho người dùng

Áp dụng cho: Tất cả API.

Nên: Tuỳ thuộc vào độ phức tạp và thời lượng dự kiến của nhiệm vụ, hãy sử dụng ảnh động, tín hiệu hình ảnh và chỉ báo tiến trình để thông báo cho người dùng. Phương pháp tối ưu phụ thuộc vào trường hợp sử dụng và độ dài dự kiến của kết quả đầu ra của API. Một số ý tưởng:

  • Truyền trực tuyến cho nội dung dài: Đối với bản tóm tắt hoặc cuộc trò chuyện, tính năng truyền trực tuyến sẽ tạo hiệu ứng máy đánh chữ cho mỗi mã thông báo theo mặc định. Điều này có thể mang lại cảm giác tự nhiên và cung cấp ý kiến phản hồi ngay lập tức.
  • Không truyền trực tuyến cho các tác vụ ngắn (hoặc tác vụ không đồng bộ dài): Đối với kết quả ngắn, ví dụ: văn bản thay thế, việc không truyền trực tuyến có thể tạo ra một giao diện người dùng tinh tế hơn. Việc này cũng giúp bạn có thời gian chuẩn bị cho tác vụ AI tiếp theo trong khi tác vụ hiện tại đang kết xuất. Phương pháp này cũng áp dụng cho các tác vụ không đồng bộ hoặc tác vụ trong nền dài hơn. Nếu người dùng không bị chặn ở đầu ra để tiếp tục hành trình, thì không cần phải tạo đầu ra ngay lập tức. Báo hiệu rằng quy trình đang diễn ra trong giao diện người dùng.
  • Hiệu ứng chuyển đổi hình ảnh cho nội dung cập nhật: Khi dịch hoặc viết lại văn bản, hãy sử dụng ảnh động, chẳng hạn như hiệu ứng biến đổi từ.

Không nên: Cập nhật giao diện người dùng mà không có tín hiệu hình ảnh.

Phù hợp với mô hình tư duy của người dùng về thời gian và công việc

Áp dụng cho: Tất cả API.

Nên: Cân nhắc việc trì hoãn nhân tạo từ một đến hai giây nếu phản hồi gần như tức thì. Ngược lại, người dùng có thể thấy kết quả đáng tin cậy hơn khi họ nhận thấy quy trình tạo phù hợp với độ khó của nhiệm vụ mà họ nhận thấy. Sử dụng ảnh động để báo hiệu rằng một quy trình xử lý bằng AI đã diễn ra.

Không nên: Làm người dùng bất ngờ bằng cách thay thế giao diện người dùng ngay lập tức.

Cho phép người dùng nhanh chóng di chuyển và huỷ các nội dung chỉnh sửa bằng AI

Áp dụng cho: Tất cả API.

Nên: Trang bị cho giao diện người dùng một bộ điều khiển từng bước hoặc nhật ký điều hướng để người dùng có thể tự tin khám phá nhiều kết quả, đồng thời cho phép họ nhanh chóng huỷ các nội dung chỉnh sửa bằng AI. Điều này đảm bảo rằng các phiên bản khác nhau vẫn có sẵn.

Không nên: Ghi đè lên bản nháp trước đó của người dùng hoặc kết quả AI mà họ có thể đã thích mà không có cách nào để quay lại, huỷ bỏ hoặc so sánh các phiên bản.

Trao quyền kiểm soát và ghi đè cho người dùng

Áp dụng cho: Tất cả API.

Nên: Để người dùng là người chỉnh sửa cuối cùng cho tất cả nội dung được tạo. Cung cấp các chế độ ghi đè trực quan để người dùng có toàn quyền sở hữu kết quả cuối cùng. Các API có thể đưa ra kết quả không chính xác.

Không nên: Buộc người dùng phải chọn kết quả duy nhất do AI tạo.

Lưu kết quả vào bộ nhớ đệm cho các việc cần làm định kỳ

Áp dụng cho: Tất cả API.

Nên: Triển khai bộ nhớ đệm kết quả cục bộ (ví dụ: sử dụng sessionStorage hoặc IndexedDB) cho các dữ liệu đầu vào hoặc truy vấn lặp lại. Chuẩn hoá thông tin đầu vào bằng cách cắt bớt khoảng trắng và viết thường để tăng kết quả tìm kiếm trong bộ nhớ cache. Đối với dữ liệu đầu vào có kích thước lớn, ví dụ: hình ảnh, hãy tạo một hàm băm để dùng làm khoá bộ nhớ đệm. Đặt thời gian tồn tại (TTL) vừa phải cho bộ nhớ đệm (hoặc phân phát kết quả được lưu vào bộ nhớ đệm trong khi cập nhật kết quả đó ở chế độ nền). Cho phép người dùng kích hoạt một suy luận mới nếu kết quả không đạt yêu cầu.

Không nên: Chạy lại cùng một suy luận cho một cụm từ tìm kiếm lặp lại hoặc dữ liệu đầu vào giống hệt nhau khi không cần đến sự biến thiên, chẳng hạn như khi người dùng di chuyển qua lại giữa các kết quả tìm kiếm. Điều này giúp tối ưu hoá khả năng phản hồi và sử dụng hiệu quả tài nguyên điện toán cục bộ.

6. Chiến lược dự phòng

Trước khi sử dụng, hãy kiểm tra xem đối tượng LanguageModel có trong phạm vi toàn cục hay không:

if ('LanguageModel' in self) {
  // The Prompt API is supported.
} else {
  // Execute fallback strategy
}

Nếu Prompt API không được hỗ trợ hoặc kết quả kiểm tra trạng thái sẵn sàng là "không có sẵn", bạn phải chuyển về phương án dự phòng một cách linh hoạt:

  • Dự phòng API từ xa: Chuyển hướng yêu cầu phát hiện đến một điểm cuối máy chủ hoặc một Cloud APIs (chẳng hạn như Vertex AI Gemini API).
  • Dự phòng API cục bộ: Chuyển hướng yêu cầu phát hiện đến một điểm cuối cục bộ, ví dụ: sử dụng Transformers.js.