Учебное пособие. Вызов функций с помощью Gemini API


Вызов функций упрощает получение структурированных выходных данных из генеративных моделей. Затем вы можете использовать эти выходные данные для вызова других API и возврата соответствующих данных ответа в модель. Другими словами, вызов функций помогает подключить генеративные модели к внешним системам, чтобы сгенерированный контент содержал самую актуальную и точную информацию.

Вы можете предоставить модели Gemini описания функций. Это функции, которые вы пишете на языке вашего приложения (то есть они не являются функциями Google Cloud). Модель может попросить вас вызвать функцию и отправить результат обратно, чтобы помочь модели обработать ваш запрос.

Если вы еще этого не сделали, ознакомьтесь с разделом «Введение в вызов функций», чтобы узнать больше.

Настройте свой проект

Прежде чем вызывать API Gemini, вам необходимо настроить проект, который включает в себя настройку ключа API, установку пакета SDK и инициализацию модели.

Настройка вызова функции

В этом руководстве модель будет взаимодействовать с гипотетическим API обмена валюты, который поддерживает следующие параметры:

Параметр Тип Необходимый Описание
currencyFrom нить да Валюта для конвертации
currencyTo нить да Валюта для конвертации в

Пример запроса API

{
  "currencyFrom": "USD",
  "currencyTo": "SEK"
}

Пример ответа API

{
  "base": "USD",
  "rates": {"SEK": 0.091}
}

Шаг 1. Создайте функцию, которая выполняет запрос API.

Если вы еще этого не сделали, начните с создания функции, которая отправляет запрос к API.

В демонстрационных целях в этом руководстве вместо отправки фактического запроса API вы будете возвращать жестко закодированные значения в том же формате, который возвращал бы реальный API.

async function makeApiRequest(currencyFrom, currencyTo) {
  // This hypothetical API returns a JSON such as:
  // {"base":"USD","rates":{"SEK": 0.091}}
  return {
    base: currencyFrom,
    rates: { [currencyTo]: 0.091 },
  };
}

Шаг 2. Создайте объявление функции.

Создайте объявление функции, которое вы передадите в генеративную модель (следующий шаг этого руководства).

Включите как можно больше подробностей в описания функций и параметров. Генеративная модель использует эту информацию, чтобы определить, какую функцию выбрать и как предоставить значения параметров при вызове функции.

// Function declaration, to pass to the model.
const getExchangeRateFunctionDeclaration = {
  name: "getExchangeRate",
  parameters: {
    type: "OBJECT",
    description: "Get the exchange rate for currencies between countries",
    properties: {
      currencyFrom: {
        type: "STRING",
        description: "The currency to convert from.",
      },
      currencyTo: {
        type: "STRING",
        description: "The currency to convert to.",
      },
    },
    required: ["currencyTo", "currencyFrom"],
  },
};

// Executable function code. Put it in a map keyed by the function name
// so that you can call it once you get the name string from the model.
const functions = {
  getExchangeRate: ({ currencyFrom, currencyTo }) => {
    return makeApiRequest( currencyFrom, currencyTo)
  }
};

Шаг 3. Укажите объявление функции во время инициализации модели.

Укажите объявление функции при инициализации генеративной модели, установив параметр tools модели:

const { GoogleGenerativeAI } = require("@google/generative-ai");

// Access your API key as an environment variable (see "Set up your API key" above)
const genAI = new GoogleGenerativeAI(process.env.API_KEY);

// ...

const generativeModel = genAI.getGenerativeModel({
  // Use a model that supports function calling, like Gemini 1.0 Pro.
  // See "Supported models" in the "Introduction to function calling" page.
  model: "gemini-1.0-pro",

  // Specify the function declaration.
  tools: {
    functionDeclarations: [getExchangeRateFunctionDeclaration],
  },
});

Шаг 4. Создайте вызов функции.

Теперь вы можете запросить модель с определенной функцией.

Рекомендуемый способ использования вызова функций — через интерфейс чата, поскольку вызовы функций хорошо вписываются в многоходовую структуру чата.

const chat = generativeModel.startChat();
const prompt = "How much is 50 US dollars worth in Swedish krona?";

// Send the message to the model.
const result = await chat.sendMessage(prompt);

// For simplicity, this uses the first function call found.
const call = result.response.functionCalls()[0];

if (call) {
  // Call the executable function named in the function call
  // with the arguments specified in the function call and
  // let it call the hypothetical API.
  const apiResponse = await functions[call.name](call.args);

  // Send the API response back to the model so it can generate
  // a text response that can be displayed to the user.
  const result2 = await chat.sendMessage([{functionResponse: {
    name: 'getExchangeRate',
    response: apiResponse
  }}]);

  // Log the text response.
  console.log(result2.response.text());
}