İşlev çağırma olarak da bilinen araç çağırma, ÖYS'lere çağıran uygulamaya geri istek gönderme olanağı sunmanın yapılandırılmış bir yoludur. Modele sunmak istediğiniz araçları siz tanımlarsınız. Model, verdiğiniz istemleri yerine getirmek için gerektiğinde uygulamanıza araç istekleri gönderir.
Araç çağrısının kullanım alanları genellikle birkaç temaya ayrılır:
LLM'ye eğitilmediği bilgilere erişim verme
- Hisse senedi fiyatı veya mevcut hava durumu gibi sık sık değişen bilgiler.
- Ürün bilgileri veya kullanıcı profilleri gibi uygulama alanınıza özgü bilgiler.
Almayla artırılmış üretim (RAG) ile örtüşen bu yöntem, LLM'nin ürettiği metinlere gerçek bilgiler eklemesine de olanak tanır. RAG, çok fazla bilginiz olduğunda veya istemle en alakalı bilgi belirsiz olduğunda en uygun olan daha ağır bir çözümdür. Öte yandan, LLM'nin ihtiyaç duyduğu bilgileri almak için yalnızca bir işlev çağrısı veya veritabanı araması gerekiyorsa araç çağrısı daha uygundur.
LLM iş akışına bir dereceye kadar kesinlik getirme
- LLM'nin güvenilir bir şekilde tamamlayamayacağı hesaplamaları gerçekleştirme.
- Bir LLM'yi, belirli koşullar altında (ör. bir uygulamanın hizmet şartlarıyla ilgili bir soruya yanıt verirken) aynen kopyalanmış metin oluşturmaya zorlama.
LLM tarafından başlatılan bir işlemi gerçekleştirme
- LLM destekli bir ev asistanındaki ışıkları açma ve kapatma
- LLM destekli bir restoran aracısında masa rezervasyonu yapma
Başlamadan önce
Bu sayfadaki kod örneklerini çalıştırmak istiyorsanız önce Başlangıç kılavuzundaki adımları tamamlayın. Tüm örneklerde, Genkit bağımlılıkları yüklü bir proje oluşturduğunuz varsayılır.
Bu sayfada, Genkit model soyutlamasının gelişmiş özelliklerinden biri ele alınmaktadır. Bu nedenle, konuyu ayrıntılı olarak incelemeden önce Yapay zeka modelleriyle içerik oluşturma sayfasındaki içerikleri incelemeniz gerekir. Ayrıca, Genkit'in giriş ve çıkış şemalarını tanımlama sistemi hakkında bilgi sahibi olmanız gerekir. Bu konu Akışlar sayfasında ele alınmıştır.
Araç çağırmaya genel bakış
Genel hatlarıyla, LLM ile yapılan tipik bir araç çağırma etkileşimi aşağıdaki gibidir:
- Arayan uygulama, LLM'ye bir istek gönderir ve istemin içine LLM'nin yanıt oluşturmak için kullanabileceği araçların listesini de ekler.
- LLM, eksiksiz bir yanıt oluşturur veya belirli bir biçimde bir araç çağrısı isteği oluşturur.
- Arayan tam bir yanıt alırsa istek yerine getirilir ve etkileşim sona erer. Ancak arayan bir araç çağrısı alırsa uygun olan mantığı uygular ve orijinal istemi veya bunun bir varyasyonunu ve araç çağrısının sonucunu içeren yeni bir istek gönderir.
- LLM, yeni istemi 2. adımda olduğu gibi işler.
Bunun çalışması için birkaç koşulun karşılanması gerekir:
- Model, bir istemi tamamlamak için gerektiğinde araç isteği gönderecek şekilde eğitilmelidir. Gemini gibi web API'leri aracılığıyla sağlanan büyük modellerin çoğu bunu yapabilir ancak daha küçük ve daha özel modeller genellikle yapamaz. Genkit, desteklemeyen bir modele araç sağlamaya çalışırsanız hata verir.
- Çağıran uygulama, modele beklediği biçimde araç tanımları sağlamalıdır.
- Çağıran uygulama, modelden aracı çağırma isteklerini uygulamanın beklediği biçimde oluşturmasını istemelidir.
Genkit ile araç çağırma
Genkit, destekleyen modellerle araç çağrısı için tek bir arayüz sağlar.
Her model eklentisi, önceki bölümde belirtilen son iki kriterin karşılanmasını sağlar ve genkit.Generate()
işlevi, daha önce açıklanan araç çağırma döngüsünü otomatik olarak gerçekleştirir.
Model desteği
Araç çağırma desteği modele, model API'sine ve Genkit eklentisine bağlıdır. Araç arama özelliğinin desteklenip desteklenmeyeceğini belirlemek için ilgili dokümanlara bakın. Ayrıca:
- Genkit, desteklemeyen bir modele araç sağlamaya çalışırsanız hata verir.
- Eklenti model referanslarını dışa aktarıyorsa
ModelInfo.Supports.Tools
mülkü, araç çağırmayı destekleyip desteklemediğini belirtir.
Araçları tanımlama
Araç tanımlarını yazmak için genkit.DefineTool()
işlevini kullanın:
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);
})
}
Buradaki söz dizimi genkit.DefineFlow()
söz dizimine benzer ancak açıklama yazmanız gerekir. LLM'nin bu özelliği uygun şekilde kullanmaya karar vermesi için açıklamanın kelime seçimine ve açıklayıcılığına özellikle dikkat edin.
Araçları kullanma
İçerik oluşturmak için istemlerinize tanımlanmış araçları dahil edin.
Oluştur
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"}),
)
İstem dosyası
---
system: "Answer questions using the tools you have."
tools: [getWeather]
input:
schema:
location: string
---
What is the weather in {{location}}?
Ardından, istemi kodunuzda aşağıdaki gibi yürütebilirsiniz:
// 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"}),
)
LLM'nin istemi yanıtlamak için getWeather
aracını kullanması gerekiyorsa Genkit, araç çağrısını otomatik olarak yönetir.
Araç çağrılarını açıkça işleme
Bu araç çağırma döngüsü üzerinde tam kontrol sahibi olmak istiyorsanız (ör. daha karmaşık mantık uygulamak için) WithReturnToolRequests()
seçeneğini true
olarak ayarlayın. Artık tüm araç isteklerinin karşılandığından emin olmak sizin sorumluluğunuzdadır:
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)
}