Araçla arama

İşlev çağrısı olarak da bilinen araç çağrısı, kullanıcılara LLM'lerin, kendisini çağıran uygulamaya geri istek gönderebilmesi. Siz ve modelin kullanılabilir olmasını istediğiniz araçları tanımlarsanız Girdiğiniz istemleri yerine getirmek için gereken şekilde uygulamanıza araç isteklerinde bulunun.

Araç çağrısının kullanım alanları genellikle birkaç temaya ayrılır:

LLM'nin, eğitilmediği bilgilere erişmesine izin verme

  • Bir restoranın günlük menüsü veya menü gibi sık sık değişen bilgiler mağaza envanter durumuna bakmaktır.
  • Uygulamanızın alan adına özel bilgiler (ör. ürün bilgileri).

Aynı zamanda geniş bir yelpazeye yayılan alma artırılmış nesil (RAG) ile çakışmaya dikkat edin. LLM'nin gerçeğe dayalı bilgileri nesillerine entegre etmesine olanak tanıyan bir yöntem. RAG büyük miktarda dönüşümünüz olduğunda en uygun olan daha ağır alakalı bilgi veya istekle en alakalı bilgi belirsizdir. Şu tarihte: Öte yandan, LLM'nin ihtiyaç duyduğu bilgileri almak basit bir işlevse veya veritabanı araması yapmak yerine araç çağırması daha uygundur.

LLM iş akışına belli bir düzeyde determinizm katma

  • LLM'nin güvenilir bir şekilde kendi kendine tamamlayamadığı hesaplamalar yapma.
  • LLM'yi belirli durumlarda aynen metin oluşturmaya zorlamak, örneğin: bir uygulamanın hizmet şartlarıyla ilgili bir soruya yanıt verirken

LLM tarafından başlatıldığında işlem gerçekleştirme

  • LLM destekli ev asistanında ışıkları açıp kapatma
  • LLM destekli restoran acentesinde masa rezervasyonları ayırtma

Başlamadan önce

Bu sayfadaki kod örneklerini çalıştırmak istiyorsanız önce Başlangıç kılavuzuna göz atın. Tüm örneklerde görüldüğü gibi, Genkit bağımlılıklarının yüklü olduğu bir proje oluşturmuş olmalısınız.

Bu sayfada Genkit model soyutlama aracının gelişmiş özelliklerinden biri create() fonksiyonudur. Bu nedenle, daha ayrıntılı bir şekilde incelemeden önce, Yapay zeka modelleriyle içerik oluşturma sayfasındaki içerik. Şunları yapmalısınız: Ayrıca, Genkit'in giriş ve çıkış şemalarını tanımlamaya yönelik sistemini (Akışlar sayfasında tartışılan) seçin.

Araç çağrısına genel bakış

Özetle, LLM'ye yönelik tipik bir araç çağırma etkileşimi budur. şöyle görünür:

  1. Çağrı uygulaması, LLM'ye bir istek gönderir ve şunları içerir: istem, LLM'nin yanıt oluşturmak için kullanabileceği araçların bir listesidir.
  2. LLM tam bir yanıt ya da bir araç çağrısı üretir belirli bir biçimde olması gerekir.
  3. Arayan kişi tam bir yanıt alırsa istek karşılanır ve etkileşim sona erdiğinde ancak arayana bir araç çağrısı gelirse ve LLM'ye aşağıdakileri içeren yeni bir istek gönderir: orijinal istem veya versiyonunun yanı sıra araç çağrısı.
  4. LLM, yeni istemi 2. adımdaki gibi işler.

Bunun işe yaraması için birkaç şartın karşılanması gerekir:

  • Model, bir görevi tamamlamak için gerektiğinde araç isteklerinde bulunmak üzere eğitilmelidir. tıklayın. Gemini gibi web API'leri üzerinden sağlanan daha büyük modellerin çoğu bunu yapabiliyor ama daha küçük ve daha uzmanlaşmış modeller genellikle bunu yapamıyor. Genkit, uyumlu olmayan bir modele araç sağlamaya çalışırsanız hata verir. o yüzden ona destek olabilirim.
  • Çağrı uygulaması, modele bir biçimdir.
  • Çağrı yapan uygulama, modelden araç çağrısı oluşturmasını istemelidir istenen biçimdedir.

Genkit ile araç çağrısı

Genkit, destekleyen modellerle araç çağrısı yapmak için tek bir arayüz sunar. Her model eklentisi, yukarıdaki ölçütlerden son ikisinin karşılandığından emin olur ve generate() işlevi, araç çağrı döngüsünü otomatik olarak gerçekleştirir. ele alacağız.

Model desteği

Araç çağrısı desteği modele, model API'sine ve Genkit eklentisine bağlıdır. Araç çağrısı yapma ihtimalinin yüksek olup olmadığını belirlemek için ilgili belgelere göz atın. desteklenir. Ayrıca:

  • Genkit, uyumlu olmayan bir modele araç sağlamaya çalışırsanız hata verir. o yüzden ona destek olabilirim.
  • Eklenti model referanslarını dışa aktarıyorsa info.supports.tools özelliği araç çağrısını destekleyip desteklemediğini belirtir.

Araçları tanımlama

Araç tanımlarını yazmak için defineTool() işlevini kullanın:

const specialToolInputSchema = z.object({ meal: z.enum(["breakfast", "lunch", "dinner"]) });
const specialTool = defineTool(
  {
    name: "specialTool",
    description: "Retrieves today's special for the given meal",
    inputSchema: specialToolInputSchema,
    outputSchema: z.string(),
  },
  async ({ meal }): Promise<string> => {
    // Retrieve up-to-date information and return it. Here, we just return a
    // fixed value.
    return "Baked beans on toast";
  }
);

Buradaki söz dizimi, defineFlow() söz dizimine benzer; Ancak bu kursun dördü de name, description, inputSchema ve outputSchema parametreleri gereklidir. Araç tanımı yazarken ifadeye özellikle dikkat edin ve LLM'nin performansı açısından son derece önemli olduğundan, bu parametrelerin açıklayıcılığı bu araçları verimli şekilde kullanabilirsiniz.

İstemlerinize araçlar ekleme

Araçlarınızı tanımladıktan sonra, araçları generate():

const llmResponse = await generate({
  model: gemini15Flash,
  prompt,
  tools: [specialTool],
});

Birden fazla aracı kullanabilirsiniz. LLM, gerektiğinde araçlara çağrıda bulunur. tuşuna basın.

Araç çağrılarını açık bir şekilde yönetme

Varsayılan olarak Genkit, yapılan her araç çağrısına kadar LLM'yi art arda çağırır. çözüme ulaştırıldı. Bu araç çağrısı döngüsü üzerinde daha fazla kontrol sahibi olmak istiyorsanız, örneğin daha karmaşık mantık uygulamak için returnToolRequests parametresini true olarak ayarlayın. Artık araçla ilgili tüm isteklerin yerine getirilmesini sağlamak sizin sorumluluğunuzdadır:

let generateOptions: GenerateOptions = {
  model: gemini15Flash,
  prompt,
  tools: [specialTool],
  returnToolRequests: true,
};
let llmResponse;
while (true) {
  llmResponse = await 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 specialTool(specialToolInputSchema.parse(part.toolRequest?.input)),
            },
          };
        default:
          throw Error('Tool not found');
        }
      }));
    generateOptions.history = llmResponse.toHistory();
    generateOptions.prompt = toolResponses;
}