Tạo kết quả có cấu trúc bằng Gemini API


Theo mặc định, Gemini tạo văn bản không có cấu trúc, nhưng một số ứng dụng yêu cầu văn bản có cấu trúc. Đối với các trường hợp sử dụng này, bạn có thể ràng buộc Gemini trả lời bằng JSON, một định dạng dữ liệu có cấu trúc phù hợp để xử lý tự động. Bạn cũng có thể ràng buộc mô hình để phản hồi bằng một trong các tuỳ chọn được chỉ định trong enum.

Sau đây là một số trường hợp sử dụng có thể yêu cầu đầu ra có cấu trúc từ mô hình:

  • Xây dựng cơ sở dữ liệu về các công ty bằng cách lấy thông tin về công ty từ các bài báo.
  • Trích xuất thông tin được chuẩn hoá từ sơ yếu lý lịch.
  • Trích xuất nguyên liệu từ công thức nấu ăn và hiển thị đường liên kết đến trang web thực phẩm cho từng nguyên liệu.

Trong câu lệnh, bạn có thể yêu cầu Gemini tạo ra kết quả ở định dạng JSON, nhưng xin lưu ý rằng mô hình không được đảm bảo sẽ tạo ra JSON và chỉ JSON. Để có phản hồi xác định hơn, bạn có thể truyền một giản đồ JSON cụ thể trong trường responseSchema để Gemini luôn phản hồi bằng một cấu trúc dự kiến. Để tìm hiểu thêm về cách xử lý giản đồ, hãy xem bài viết Tìm hiểu thêm về giản đồ JSON.

Hướng dẫn này sẽ hướng dẫn bạn cách tạo JSON bằng phương thức generateContent thông qua SDK mà bạn chọn hoặc sử dụng trực tiếp API REST. Các ví dụ cho thấy dữ liệu đầu vào chỉ là văn bản, mặc dù Gemini cũng có thể tạo phản hồi JSON cho các yêu cầu đa phương thức bao gồm hình ảnh, videoâm thanh.

Trước khi bắt đầu: Thiết lập dự án và khoá API

Trước khi gọi API Gemini, bạn cần thiết lập dự án và định cấu hình khoá API.

Lấy và bảo mật khoá API

Bạn cần có khoá API để gọi API Gemini. Nếu bạn chưa có, hãy tạo khoá trong Google AI Studio.

Lấy khoá API

Bạn không nên kiểm tra khoá API vào hệ thống quản lý phiên bản.

Bạn nên sử dụng kho khoá bí mật cho khoá API, chẳng hạn như Trình quản lý khoá bí mật của Google Cloud.

Tất cả các đoạn mã trong hướng dẫn này giả định rằng bạn đang truy cập khoá API dưới dạng một hằng số toàn cục.

Tạo JSON

Khi được định cấu hình để xuất JSON, mô hình sẽ phản hồi mọi lời nhắc bằng đầu ra ở định dạng JSON.

Bạn có thể kiểm soát cấu trúc của phản hồi JSON bằng cách cung cấp giản đồ. Có hai cách để cung cấp giản đồ cho mô hình:

  • Dưới dạng văn bản trong câu lệnh
  • Dưới dạng giản đồ có cấu trúc được cung cấp thông qua cấu hình mô hình

Cung cấp giản đồ dưới dạng văn bản trong lời nhắc

Ví dụ sau đây nhắc mô hình trả về công thức làm bánh quy ở định dạng JSON cụ thể.

Vì mô hình nhận thông số kỹ thuật về định dạng từ văn bản trong lời nhắc, nên bạn có thể linh hoạt trong cách thể hiện thông số kỹ thuật. Mọi định dạng hợp lý để biểu thị giản đồ JSON đều có thể hoạt động.

// Make sure to include these imports:
// import { GoogleGenerativeAI } from "@google/generative-ai";
const genAI = new GoogleGenerativeAI(process.env.API_KEY);

const model = genAI.getGenerativeModel({
  model: "gemini-1.5-flash",
});

const prompt = `List a few popular cookie recipes using this JSON schema:

Recipe = {'recipeName': string}
Return: Array<Recipe>`;

const result = await model.generateContent(prompt);
console.log(result.response.text());

Kết quả có thể như sau:

[{"recipeName": "Chocolate Chip Cookies"}, {"recipeName": "Oatmeal Raisin Cookies"}, {"recipeName": "Snickerdoodles"}, {"recipeName": "Sugar Cookies"}, {"recipeName": "Peanut Butter Cookies"}]

Cung cấp giản đồ thông qua cấu hình mô hình

Ví dụ sau đây thực hiện những việc sau:

  1. Tạo bản sao của một mô hình được định cấu hình thông qua giản đồ để phản hồi bằng JSON.
  2. Yêu cầu mô hình trả về công thức làm bánh quy.

Phương thức chính thức hơn này để khai báo giản đồ JSON giúp bạn kiểm soát chính xác hơn so với việc chỉ dựa vào văn bản trong lời nhắc.

// Make sure to include these imports:
// import { GoogleGenerativeAI, SchemaType } from "@google/generative-ai";
const genAI = new GoogleGenerativeAI(process.env.API_KEY);

const schema = {
  description: "List of recipes",
  type: SchemaType.ARRAY,
  items: {
    type: SchemaType.OBJECT,
    properties: {
      recipeName: {
        type: SchemaType.STRING,
        description: "Name of the recipe",
        nullable: false,
      },
    },
    required: ["recipeName"],
  },
};

const model = genAI.getGenerativeModel({
  model: "gemini-1.5-pro",
  generationConfig: {
    responseMimeType: "application/json",
    responseSchema: schema,
  },
});

const result = await model.generateContent(
  "List a few popular cookie recipes.",
);
console.log(result.response.text());

Kết quả có thể như sau:

[{"recipeName": "Chocolate Chip Cookies"}, {"recipeName": "Oatmeal Raisin Cookies"}, {"recipeName": "Snickerdoodles"}, {"recipeName": "Sugar Cookies"}, {"recipeName": "Peanut Butter Cookies"}]

Tìm hiểu thêm về giản đồ JSON

Khi định cấu hình mô hình để trả về phản hồi JSON, bạn có thể sử dụng đối tượng Schema để xác định hình dạng của dữ liệu JSON. Schema đại diện cho một tập hợp con chọn lọc của đối tượng giản đồ OpenAPI 3.0.

Dưới đây là nội dung đại diện JSON giả lập của tất cả các trường Schema:

{
  "type": enum (Type),
  "format": string,
  "description": string,
  "nullable": boolean,
  "enum": [
    string
  ],
  "maxItems": string,
  "minItems": string,
  "properties": {
    string: {
      object (Schema)
    },
    ...
  },
  "required": [
    string
  ],
  "propertyOrdering": [
    string
  ],
  "items": {
    object (Schema)
  }
}

Type của giản đồ phải là một trong các Loại dữ liệu của OpenAPI. Chỉ một tập hợp con của các trường mới hợp lệ cho mỗi Type. Danh sách sau đây liên kết từng Type với các trường hợp hợp lệ cho loại đó:

  • string -> enum, định dạng
  • integer -> định dạng
  • number -> định dạng
  • boolean
  • array -> minItems, maxItems, items
  • object -> properties, required, propertyOrdering, nullable

Dưới đây là một số giản đồ mẫu cho thấy các tổ hợp loại và trường hợp hợp lệ:

{ "type": "string", "enum": ["a", "b", "c"] }

{ "type": "string", "format": "date-time" }

{ "type": "integer", "format": "int64" }

{ "type": "number", "format": "double" }

{ "type": "boolean" }

{ "type": "array", "minItems": 3, "maxItems": 3, "items": { "type": ... } }

{ "type": "object",
  "properties": {
    "a": { "type": ... },
    "b": { "type": ... },
    "c": { "type": ... }
  },
  "nullable": true,
  "required": ["c"],
  "propertyOrdering": ["c", "b", "a"]
}

Để xem tài liệu đầy đủ về các trường Giản đồ khi được sử dụng trong API Gemini, hãy xem Tài liệu tham khảo về Giản đồ.

Đặt hàng tài sản

Khi bạn làm việc với giản đồ JSON trong API Gemini, thứ tự của các thuộc tính rất quan trọng. Theo mặc định, API sắp xếp các thuộc tính theo thứ tự bảng chữ cái và không giữ nguyên thứ tự xác định các thuộc tính (mặc dù SDK AI tạo sinh của Google có thể giữ nguyên thứ tự này). Nếu bạn đang cung cấp ví dụ cho mô hình đã định cấu hình giản đồ và thứ tự thuộc tính của các ví dụ không nhất quán với thứ tự thuộc tính của giản đồ, thì kết quả có thể không mong muốn hoặc lộn xộn.

Để đảm bảo thứ tự các thuộc tính nhất quán và dễ dự đoán, bạn có thể sử dụng trường propertyOrdering[] không bắt buộc.

"propertyOrdering": ["recipe_name", "ingredients"]

propertyOrdering[] – không phải là trường tiêu chuẩn trong quy cách OpenAPI – là một mảng các chuỗi dùng để xác định thứ tự của các thuộc tính trong phản hồi. Bằng cách chỉ định thứ tự của các thuộc tính, sau đó cung cấp ví dụ với các thuộc tính theo thứ tự đó, bạn có thể cải thiện chất lượng của kết quả.