Panggilan alat, yang juga dikenal sebagai panggilan fungsi, adalah cara terstruktur untuk memberi LLM kemampuan untuk membuat permintaan kembali ke aplikasi yang memanggilnya. Anda menentukan alat yang ingin disediakan untuk model, dan model akan membuat permintaan alat ke aplikasi Anda sesuai kebutuhan untuk memenuhi perintah yang Anda berikan.
Kasus penggunaan panggilan alat umumnya terbagi menjadi beberapa tema:
Memberi LLM akses ke informasi yang tidak digunakan untuk melatihnya
- Informasi yang sering berubah, seperti harga saham atau cuaca saat ini.
- Informasi khusus untuk domain aplikasi Anda, seperti informasi produk atau profil pengguna.
Perhatikan tumpang-tindih dengan retrieval augmented generation (RAG), yang juga merupakan cara untuk memungkinkan LLM mengintegrasikan informasi faktual ke dalam pembuatannya. RAG adalah solusi yang lebih berat yang paling sesuai jika Anda memiliki informasi dalam jumlah besar atau informasi yang paling relevan dengan perintah bersifat ambigu. Di sisi lain, jika pengambilan informasi yang diperlukan LLM adalah panggilan fungsi sederhana atau pencarian database, panggilan alat lebih sesuai.
Memperkenalkan tingkat determinisme ke dalam alur kerja LLM
- Melakukan penghitungan yang tidak dapat diselesaikan dengan andal oleh LLM.
- Memaksa LLM untuk menghasilkan teks verbatim dalam situasi tertentu, seperti saat merespons pertanyaan tentang persyaratan layanan aplikasi.
Melakukan tindakan saat dimulai oleh LLM
- Menyalakan dan mematikan lampu di asisten rumah yang didukung LLM
- Membuat reservasi meja di agen restoran yang didukung LLM
Sebelum memulai
Jika Anda ingin menjalankan contoh kode di halaman ini, selesaikan langkah-langkah dalam panduan Memulai terlebih dahulu. Semua contoh mengasumsikan bahwa Anda sudah menyiapkan project dengan dependensi Genkit yang diinstal.
Halaman ini membahas salah satu fitur lanjutan abstraksi model Genkit, jadi sebelum Anda mempelajarinya terlalu dalam, Anda harus memahami konten di halaman Membuat konten dengan model AI. Anda juga harus memahami sistem Genkit untuk menentukan skema input dan output, yang dibahas di halaman Flows.
Ringkasan panggilan alat
Pada tingkat tinggi, berikut adalah tampilan interaksi panggilan alat umum dengan LLM:
- Aplikasi panggilan meminta LLM dengan permintaan dan juga menyertakan dalam perintah daftar alat yang dapat digunakan LLM untuk menghasilkan respons.
- LLM menghasilkan respons lengkap atau menghasilkan permintaan panggilan alat dalam format tertentu.
- Jika pemanggil menerima respons lengkap, permintaan akan terpenuhi dan interaksi berakhir; tetapi jika pemanggil menerima panggilan alat, pemanggil akan menjalankan logika apa pun yang sesuai dan mengirim permintaan baru ke LLM yang berisi prompt asli atau beberapa variasi prompt tersebut serta hasil panggilan alat.
- LLM menangani perintah baru seperti pada Langkah 2.
Agar dapat berfungsi, beberapa persyaratan harus dipenuhi:
- Model harus dilatih untuk membuat permintaan alat saat diperlukan untuk menyelesaikan perintah. Sebagian besar model yang lebih besar yang disediakan melalui API web, seperti Gemini dan Claude, dapat melakukannya, tetapi model yang lebih kecil dan lebih khusus sering kali tidak dapat melakukannya. Genkit akan menampilkan error jika Anda mencoba menyediakan alat ke model yang tidak mendukungnya.
- Aplikasi panggilan harus memberikan definisi alat ke model dalam format yang diharapkan.
- Aplikasi pemanggil harus meminta model untuk membuat permintaan panggilan alat dalam format yang diharapkan aplikasi.
Panggilan alat dengan Genkit
Genkit menyediakan satu antarmuka untuk panggilan alat dengan model yang mendukungnya.
Setiap plugin model memastikan bahwa dua kriteria terakhir di atas terpenuhi, dan
fungsi generate()
instance Genkit secara otomatis menjalankan loop
panggilan alat yang dijelaskan sebelumnya.
Dukungan model
Dukungan panggilan alat bergantung pada model, API model, dan plugin Genkit. Lihat dokumentasi yang relevan untuk menentukan apakah panggilan alat kemungkinan akan didukung. Selain itu:
- Genkit akan menampilkan error jika Anda mencoba menyediakan alat ke model yang tidak mendukungnya.
- Jika plugin mengekspor referensi model, properti
info.supports.tools
akan menunjukkan apakah plugin mendukung panggilan alat.
Menentukan alat
Gunakan fungsi defineTool()
instance Genkit untuk menulis definisi alat:
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.';
}
);
Sintaksis di sini terlihat seperti sintaksis defineFlow()
; namun, keempat parameter
name
, description
, inputSchema
, dan outputSchema
diperlukan. Saat menulis definisi alat, perhatikan dengan cermat kata-kata dan
deskripsi parameter ini, karena parameter ini sangat penting bagi LLM untuk
menggunakan alat yang tersedia secara efektif.
Menggunakan alat
Sertakan alat yang ditentukan dalam perintah Anda untuk membuat konten.
Buat
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' });
File perintah
---
system: "Answer questions using the tools you have."
tools: [getWeather]
input:
schema:
location: string
---
What is the weather in {{location}}?
Kemudian, Anda dapat menjalankan perintah dalam kode Anda sebagai berikut:
// assuming prompt file is named weatherPrompt.prompt
const weatherPrompt = ai.prompt('weatherPrompt');
const response = await weatherPrompt({ location: 'Baltimore' });
Chat
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 akan otomatis menangani panggilan alat jika LLM perlu menggunakan
alat getWeather
untuk menjawab perintah.
Menangani panggilan alat secara eksplisit
Secara default, Genkit berulang kali memanggil LLM hingga setiap panggilan alat telah
diselesaikan. Jika Anda menginginkan kontrol lebih besar atas loop panggilan alat ini, misalnya untuk
menerapkan logika yang lebih rumit, tetapkan parameter returnToolRequests
ke true
.
Sekarang Anda bertanggung jawab untuk memastikan semua permintaan alat terpenuhi:
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;
}