Panggilan alat, yang juga dikenal sebagai panggilan fungsi, adalah cara terstruktur yang memberikan 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 prompt yang Anda berikan.
Kasus penggunaan panggilan alat umumnya terbagi menjadi beberapa tema:
Memberikan 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 dan paling tepat digunakan jika Anda memiliki informasi dalam jumlah besar atau informasi yang paling relevan dengan prompt yang bersifat ambigu. Di sisi lain, panggilan alat lebih tepat jika panggilan fungsi atau pencarian database adalah satu-satunya yang diperlukan untuk mengambil informasi yang dibutuhkan oleh LLM.
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 yang dimulai oleh LLM
- Menyalakan dan mematikan lampu pada asisten rumah yang didukung teknologi LLM
- Membuat reservasi meja pada agen restoran yang didukung teknologi 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 telah menyiapkan project dengan dependensi Genkit terinstal.
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 Flow.
Ringkasan panggilan alat
Pada tingkat tinggi, berikut adalah tampilan interaksi panggilan alat umum dengan LLM:
- Aplikasi panggilan meminta LLM melalui permintaan dan juga menyertakan dalam prompt, 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 dipenuhi dan interaksi akan berakhir. Tetapi, jika pemanggil menerima panggilan alat, pemanggil akan menjalankan logika apa pun yang sesuai dan mengirimkan permintaan baru ke LLM yang berisi prompt asli atau beberapa variasi prompt tersebut serta hasil panggilan alat.
- LLM menangani prompt baru seperti pada Langkah 2.
Agar dapat berfungsi, beberapa persyaratan harus dipenuhi:
- Model harus dilatih untuk membuat permintaan alat saat diperlukan untuk menyelesaikan suatu prompt. Sebagian besar model yang lebih besar yang disediakan melalui API web seperti Gemini 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 panggilan harus meminta model membuat permintaan panggilan alat dalam format yang diharapkan aplikasi.
Panggilan alat dengan Genkit
Genkit menyediakan satu antarmuka panggilan alat dengan model yang mendukungnya.
Setiap plugin model memastikan bahwa dua kriteria terakhir yang disebutkan di bagian
sebelumnya terpenuhi, dan fungsi genkit.Generate()
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 besar akan didukung. Selain itu:
- Genkit akan menampilkan error jika Anda mencoba menyediakan alat ke model yang tidak mendukungnya.
- Jika plugin mengekspor referensi model, properti
ModelInfo.Supports.Tools
akan menunjukkan apakah plugin mendukung panggilan alat.
Menentukan alat
Gunakan fungsi genkit.DefineTool()
untuk menulis definisi alat:
import (
"context"
"log"
"github.com/firebase/genkit/go/ai"
"github.com/firebase/genkit/go/genkit"
"github.com/firebase/genkit/go/plugins/googlegenai"
)
func main() {
ctx := context.Background()
g, err := genkit.Init(ctx,
genkit.WithPlugins(&googlegenai.GoogleAI{}),
genkit.WithDefaultModel("googleai/gemini-2.0-flash"),
)
if err != nil {
log.Fatal(err)
}
getWeatherTool := genkit.DefineTool(
g, "getWeather", "Gets the current weather in a given location",
func(ctx *ai.ToolContext, location string) (string, error) {
// Here, we would typically make an API call or database query. For this
// example, we just return a fixed value.
return fmt.Sprintf("The current weather in %s is 63°F and sunny.", location);
})
}
Sintaksis di sini terlihat seperti sintaksis genkit.DefineFlow()
; tetapi, Anda
harus menulis deskripsi. Perhatikan dengan cermat kata-kata dan penjelasan
deskripsi karena sangat penting bagi LLM untuk memutuskan penggunaannya dengan tepat.
Menggunakan alat
Sertakan alat yang ditentukan dalam prompt Anda untuk membuat konten.
Generate
resp, err := genkit.Generate(ctx, g,
ai.WithPrompt("What is the weather in San Francisco?"),
ai.WithTools(getWeatherTool),
)
DefinePrompt
weatherPrompt, err := genkit.DefinePrompt(g, "weatherPrompt",
ai.WithPrompt("What is the weather in {{location}}?"),
ai.WithTools(getWeatherTool),
)
if err != nil {
log.Fatal(err)
}
resp, err := weatherPrompt.Execute(ctx,
with.Input(map[string]any{"location": "San Francisco"}),
)
Prompt file
---
system: "Answer questions using the tools you have."
tools: [getWeather]
input:
schema:
location: string
---
What is the weather in {{location}}?
Kemudian, Anda dapat menjalankan prompt dalam kode Anda sebagai berikut:
// Assuming prompt file named weatherPrompt.prompt exists in ./prompts dir.
weatherPrompt := genkit.LookupPrompt("weatherPrompt")
if weatherPrompt == nil {
log.Fatal("no prompt named 'weatherPrompt' found")
}
resp, err := weatherPrompt.Execute(ctx,
ai.WithInput(map[string]any{"location": "San Francisco"}),
)
Genkit akan otomatis menangani panggilan alat jika LLM perlu menggunakan
alat getWeather
untuk menjawab prompt.
Menangani panggilan alat secara eksplisit
Jika Anda menginginkan kontrol penuh atas loop panggilan alat ini, misalnya untuk menerapkan logika yang lebih
rumit, tetapkan opsi WithReturnToolRequests()
ke true
. Sekarang,
Anda bertanggung jawab untuk memastikan semua permintaan alat terpenuhi:
getWeatherTool := genkit.DefineTool(
g, "getWeather", "Gets the current weather in a given location",
func(ctx *ai.ToolContext, location string) (string, error) {
// Tool implementation...
})
resp, err := genkit.Generate(ctx, g,
ai.WithPrompt("What is the weather in San Francisco?"),
ai.WithTools(getWeatherTool),
ai.WithReturnToolRequests(true),
)
if err != nil {
log.Fatal(err)
}
parts := []*Part{}
for _, req := range resp.ToolRequests() {
tool := genkit.LookupTool(g, req.Name)
if tool == nil {
log.Fatalf("tool %q not found", req.Name)
}
output, err := tool.RunRaw(ctx, req.Input)
if err != nil {
log.Fatalf("tool %q execution failed: %v", err)
}
parts = append(parts,
ai.NewToolResponsePart(&ai.ToolResponse{
Name: req.Name,
Ref: req.Ref,
Output: output,
}))
}
resp, err = genkit.Generate(ctx, g,
ai.WithMessages(resp.History()..., NewMessage(ai.RoleTool, nil, parts...)),
)
if err != nil {
log.Fatal(err)
}