İş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 bilgilerin alınması basit bir işlev çağrısı veya veritabanı aramasıysa 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 durumlarda (ö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çeriği 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 olarak, 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 işe yaraması 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 ve Claude 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.
- Arayan uygulama, modelden uygulamanın beklediği biçimde araç çağrısı istekleri 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, yukarıdaki ölçütlerden son ikisinin karşılanmasını sağlar ve Genkit örneğinin 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
info.supports.tools
mülkü, araç çağırmayı destekleyip desteklemediğini belirtir.
Araçları tanımlama
Araç tanımlarını yazmak için Genkit örneğinin defineTool()
işlevini kullanın:
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.';
}
);
Buradaki söz dizimi defineFlow()
söz dizimine benzer ancak name
, description
, inputSchema
ve outputSchema
parametrelerinin dördünün de kullanılması gerekir. LLM'nin mevcut araçları etkili bir şekilde kullanabilmesi için bu parametreler çok önemlidir. Bu nedenle, bir araç tanımı yazarken bu parametrelerin ifade şekline 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
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' });
İ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 is named weatherPrompt.prompt
const weatherPrompt = ai.prompt('weatherPrompt');
const response = await weatherPrompt({ location: 'Baltimore' });
Sohbet
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],
});
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
Genkit, varsayılan olarak her araç çağrısı çözülene kadar LLM'yi tekrar tekrar çağırır. Bu araç çağırma döngüsü üzerinde daha fazla kontrol sahibi olmak istiyorsanız (ör. daha karmaşık mantık uygulamak için) returnToolRequests
parametresini true
olarak ayarlayın.
Artık tüm araç isteklerinin yerine getirilmesini sağlamak sizin sorumluluğunuzdadır:
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;
}