Hướng dẫn gọi hàm

Lệnh gọi hàm giúp bạn dễ dàng nhận kết quả đầu ra dữ liệu có cấu trúc từ các mô hình tạo sinh. Sau đó, bạn có thể sử dụng những dữ liệu đầu ra này để gọi các API khác và trả về dữ liệu phản hồi liên quan cho mô hình. Nói cách khác, lệnh gọi hàm giúp bạn kết nối các mô hình tạo sinh với các hệ thống bên ngoài để nội dung được tạo có chứa thông tin mới nhất và chính xác nhất.

Bạn có thể cung cấp cho các mô hình Gemini phần mô tả các chức năng. Đây là các hàm mà bạn viết bằng ngôn ngữ của ứng dụng (nghĩa là không phải là Google Cloud Functions). Mô hình đó có thể yêu cầu bạn gọi một hàm và gửi lại kết quả để giúp mô hình xử lý truy vấn của bạn.

Hãy xem phần Giới thiệu về cách gọi hàm để tìm hiểu thêm (nếu bạn chưa xem).

API mẫu để điều khiển ánh sáng

Hãy tưởng tượng bạn có một hệ thống điều khiển ánh sáng cơ bản với giao diện lập trình ứng dụng (API) và bạn muốn cho phép người dùng điều khiển đèn thông qua các yêu cầu văn bản đơn giản. Bạn có thể sử dụng tính năng Gọi hàm để diễn giải các yêu cầu thay đổi ánh sáng từ người dùng và chuyển các yêu cầu đó thành lệnh gọi API để đặt giá trị ánh sáng. Hệ thống điều khiển ánh sáng giả định này cho phép bạn kiểm soát độ sáng của ánh sáng và nhiệt độ màu, được xác định bằng 2 thông số riêng biệt:

Thông số Loại Bắt buộc Nội dung mô tả
brightness number Mức độ sáng từ 0 đến 100. Mức 0 đang tắt và mức 100 có độ sáng tối đa.
colorTemperature string Nhiệt độ màu của thiết bị chiếu sáng có thể là daylight, cool hoặc warm.

Để đơn giản, hệ thống chiếu sáng ảo này chỉ có một đèn, vì vậy, người dùng không phải chỉ định một phòng hoặc vị trí. Dưới đây là ví dụ về yêu cầu JSON mà bạn có thể gửi đến API điều khiển ánh sáng để thay đổi mức ánh sáng thành 50% theo nhiệt độ màu ban ngày:

{
  "brightness": "50",
  "colorTemperature": "daylight"
}

Hướng dẫn này cho bạn biết cách thiết lập Lệnh gọi hàm cho Gemini API để diễn giải các yêu cầu về ánh sáng của người dùng và ánh xạ các yêu cầu đó đến chế độ cài đặt API để điều khiển độ sáng và giá trị nhiệt độ màu của đèn.

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

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

Xác định hàm API

Tạo một hàm gửi yêu cầu API. Bạn nên xác định hàm này trong mã của ứng dụng, nhưng có thể gọi các dịch vụ hoặc API bên ngoài ứng dụng đó. Gemini API không gọi trực tiếp hàm này, vì vậy, bạn có thể kiểm soát cách thức và thời điểm thực thi hàm này thông qua mã xử lý ứng dụng. Để minh hoạ, hướng dẫn này xác định một hàm API mô phỏng chỉ trả về các giá trị ánh sáng được yêu cầu:

Future<Map<String, Object?>> setLightValues(
  Map<String, Object?> arguments,
) async =>
    // This mock API returns the requested lighting values
    {
      'brightness': arguments['brightness'],
      'colorTemperature': arguments['colorTemp'],
    };

Tạo phần khai báo hàm

Tạo phần khai báo hàm mà bạn sẽ truyền đến mô hình tạo sinh. Khi khai báo một hàm để mô hình sử dụng, bạn nên đưa càng nhiều thông tin chi tiết càng tốt vào phần mô tả hàm và tham số. Mô hình tạo sinh sử dụng thông tin này để xác định hàm cần chọn và cách cung cấp giá trị cho các tham số trong lệnh gọi hàm. Đoạn mã sau đây cho biết cách khai báo chức năng điều khiển ánh sáng:

final lightControlTool = FunctionDeclaration(
    'setLightValues',
    'Set the brightness and color temperature of a room light.',
    Schema(SchemaType.object, properties: {
      'brightness': Schema(SchemaType.number,
          description: 'Light level from 0 to 100. '
              'Zero is off and 100 is full brightness.'),
      'colorTemperature': Schema(SchemaType.string,
          description: 'Color temperature of the light fixture, '
              'which can be `daylight`, `cool` or `warm`.'),
    }, requiredProperties: [
      'brightness',
      'colorTemperature'
    ]));

Khai báo hàm trong quá trình khởi tạo mô hình

Nếu muốn sử dụng lệnh gọi hàm bằng một mô hình, bạn phải khai báo hàm khi khởi tạo đối tượng mô hình. Bạn sẽ khai báo các hàm bằng cách đặt tham số tools của mô hình. SDK Dart cũng hỗ trợ việc khai báo các hàm làm đối số cho API generateContent hoặc generateContentStream.

final model = GenerativeModel(
  model: 'gemini-1.5-flash',
  apiKey: apiKey,

  // Specify the function declaration.
  tools: [
    Tool(functionDeclarations: [lightControlTool])
  ],
);

Tạo lệnh gọi hàm

Sau khi khởi tạo mô hình bằng nội dung khai báo hàm, bạn có thể nhắc mô hình bằng hàm đã xác định. Bạn nên sử dụng phương thức gọi hàm bằng cách dùng tính năng nhắc trò chuyện (sendMessage()), vì lệnh gọi hàm thường có lợi ích từ việc có ngữ cảnh của các lời nhắc và câu trả lời trước đó.

final chat = model.startChat(); final prompt =
  'Dim the lights so the room feels cozy and warm.';

// Send the message to the generative model.
var response = await chat.sendMessage(Content.text(prompt));

final functionCalls = response.functionCalls.toList();
// When the model response with a function call, invoke the function.
if (functionCalls.isNotEmpty) {
  final functionCall = functionCalls.first;
  final result = switch (functionCall.name) {
    // Forward arguments to the hypothetical API.
    'setLightValues' => await setLightValues(functionCall.args),
    // Throw an exception if the model attempted to call a function that was
    // not declared.
    _ => throw UnimplementedError(
        'Function not implemented: ${functionCall.name}')
  };
  // Send the response to the model so that it can use the result to generate
  // text for the user.
  response = await chat
      .sendMessage(Content.functionResponse(functionCall.name, result));
}
// When the model responds with non-null text content, print it.
if (response.text case final text?) {
  print(text);
}