Вызов инструмента , также известный как вызов функции , представляет собой структурированный способ дать LLM возможность отправлять запросы обратно к приложению, которое его вызвало. Вы определяете инструменты, которые хотите сделать доступными для модели, и модель будет отправлять запросы инструментов вашему приложению по мере необходимости для выполнения заданных вами подсказок.
Варианты использования вызова инструментов обычно делятся на несколько тем:
Предоставление LLM доступа к информации, с которой он не был обучен
- Часто меняющаяся информация, например цена акций или текущая погода.
- Информация, относящаяся к вашему домену приложения, например информация о продукте или профили пользователей.
Обратите внимание на совпадение с генерацией с расширенным поиском (RAG), которая также позволяет LLM интегрировать фактическую информацию в свои генерации. RAG — более тяжелое решение, которое лучше всего подходит, когда у вас большой объем информации или если информация, наиболее релевантная для подсказки, неоднозначна. С другой стороны, если получение информации, необходимой LLM, представляет собой простой вызов функции или поиск в базе данных, более подходящим будет вызов инструмента.
Введение степени детерминизма в рабочий процесс LLM
- Выполнение вычислений, которые LLM не может выполнить самостоятельно.
- Принуждение LLM генерировать дословный текст при определенных обстоятельствах, например, при ответе на вопрос об условиях обслуживания приложения.
Выполнение действия по инициативе LLM
- Включение и выключение света в домашнем помощнике на базе LLM
- Резервирование столиков в ресторанном агенте на базе LLM
Прежде чем начать
Если вы хотите запустить примеры кода на этой странице, сначала выполните действия, описанные в руководстве по началу работы . Во всех примерах предполагается, что вы уже настроили проект с установленными зависимостями Genkit.
На этой странице обсуждается одна из расширенных функций абстракции модели Genkit, поэтому, прежде чем углубляться в нее, вам следует ознакомиться с содержимым на странице «Генерация контента с помощью моделей ИИ» . Вы также должны быть знакомы с системой Genkit для определения схем ввода и вывода, которая обсуждается на странице «Потоки» .
Обзор вызова инструментов
На высоком уровне вот как выглядит типичное взаимодействие вызова инструмента с LLM:
- Вызывающее приложение отправляет LLM запрос, а также включает в запрос список инструментов, которые LLM может использовать для генерации ответа.
- LLM либо генерирует полный ответ, либо генерирует запрос на вызов инструмента в определенном формате.
- Если вызывающий абонент получает полный ответ, запрос выполняется и взаимодействие завершается; но если вызывающий объект получает вызов инструмента, он выполняет любую подходящую логику и отправляет новый запрос в LLM, содержащий исходное приглашение или его вариант, а также результат вызова инструмента.
- LLM обрабатывает новое приглашение, как на шаге 2.
Чтобы это работало, необходимо выполнить несколько требований:
- Модель должна быть обучена отправлять запросы к инструментам, когда необходимо выполнить запрос. Большинство более крупных моделей, предоставляемых через веб-API, таких как Gemini и Claude, могут это сделать, но более мелкие и более специализированные модели часто не могут. Genkit выдаст ошибку, если вы попытаетесь предоставить инструменты модели, которая ее не поддерживает.
- Вызывающее приложение должно предоставить модели определения инструментов в ожидаемом формате.
- Вызывающее приложение должно предложить модели сгенерировать запросы вызова инструмента в формате, ожидаемом приложением.
Вызов инструмента с помощью Genkit
Genkit предоставляет единый интерфейс для вызова инструментов с моделями, которые его поддерживают. Каждый плагин модели гарантирует соблюдение последних двух из вышеперечисленных критериев, а функция generate()
экземпляра Genkit автоматически выполняет цикл вызова инструмента, описанный ранее.
Поддержка модели
Поддержка вызова инструментов зависит от модели, API модели и плагина Genkit. Обратитесь к соответствующей документации, чтобы определить, будет ли поддерживаться вызов инструментов. Кроме того:
- Genkit выдаст ошибку, если вы попытаетесь предоставить инструменты модели, которая ее не поддерживает.
- Если плагин экспортирует ссылки на модели, свойство
info.supports.tools
укажет, поддерживает ли он вызов инструментов.
Определение инструментов
Используйте функцию defineTool()
экземпляра Genkit для записи определений инструментов:
import { genkit, z } from 'genkit';
import { googleAI, gemini15Flash } from '@genkit-ai/google-ai';
const ai = genkit({
plugins: [googleAI()],
model: gemini15Flash,
});
const getWeather = ai.defineTool(
{
name: 'getWeather',
description: 'Gets the current weather in a given location',
inputSchema: z.object({
location: z.string().describe('The location to get the current weather for')
}),
outputSchema: z.string(),
},
async (input) => {
// Here, we would typically make an API call or database query. For this
// example, we just return a fixed value.
return 'The current weather in ${input.location} is 63°F and sunny.';
}
);
Синтаксис здесь выглядит так же, как синтаксис defineFlow()
; однако все четыре параметра name
, description
, inputSchema
и outputSchema
являются обязательными. При написании определения инструмента уделите особое внимание формулировке и описанию этих параметров, поскольку они жизненно важны для LLM для эффективного использования доступных инструментов.
Использование инструментов
Включите определенные инструменты в свои подсказки для создания контента.
Генерировать
const response = await ai.generate({
prompt: 'What is the weather in Baltimore?',
tools: [getWeather],
});
definePrompt
const weatherPrompt = ai.definePrompt(
{
name: 'weatherPrompt',
tools: [getWeather],
},
'What is the weather in {{location}}?'
);
const response = await weatherPrompt({ location: 'Baltimore' });
Подскажите файл
---
system: "Answer questions using the tools you have."
tools: [getWeather]
input:
schema:
location: string
---
What is the weather in {{location}}?
Затем вы можете выполнить приглашение в своем коде следующим образом:
// assuming prompt file is named weatherPrompt.prompt
const weatherPrompt = ai.prompt('weatherPrompt');
const response = await weatherPrompt({ location: 'Baltimore' });
Чат
const chat = ai.chat({
system: 'Answer questions using the tools you have.',
tools: [getWeather],
});
const response = await chat.send('What is the weather in Baltimore?');
// Or, specify tools that are message-specific
const response = await chat.send({
prompt: 'What is the weather in Baltimore?',
tools: [getWeather],
});
Genkit автоматически обработает вызов инструмента, если LLM потребуется использовать инструмент getWeather
для ответа на запрос.
Явная обработка вызовов инструментов
По умолчанию Genkit неоднократно вызывает LLM, пока каждый вызов инструмента не будет разрешен. Если вам нужен больший контроль над этим циклом вызова инструмента, например, для применения более сложной логики, установите для параметра returnToolRequests
значение true
. Теперь вы обязаны обеспечить выполнение всех запросов инструментов:
const getWeather = ai.defineTool(
{
// ... tool definition ...
},
async ({ location }) => {
// ... tool implementation ...
},
);
const generateOptions: GenerateOptions = {
prompt: "What's the weather like in Baltimore?",
tools: [getWeather],
returnToolRequests: true,
};
let llmResponse;
while (true) {
llmResponse = await ai.generate(generateOptions);
const toolRequests = llmResponse.toolRequests;
if (toolRequests.length < 1) {
break;
}
const toolResponses: ToolResponsePart[] = await Promise.all(
toolRequests.map(async (part) => {
switch (part.toolRequest.name) {
case 'specialTool':
return {
toolResponse: {
name: part.toolRequest.name,
ref: part.toolRequest.ref,
output: await getWeather(part.toolRequest.input),
},
};
default:
throw Error('Tool not found');
}
})
);
generateOptions.messages = llmResponse.messages;
generateOptions.prompt = toolResponses;
}