ai-agents-for-beginners

İyi AI Ajanları Nasıl Tasarlanır

(Dersi izlemek için yukarıdaki görsele tıklayın)

Araç Kullanım Tasarım Deseni

Araçlar ilginçtir çünkü AI ajanlarının çok daha geniş bir yetenek yelpazesine sahip olmasını sağlarlar. Ajanın gerçekleştirebileceği sınırlı bir eylem seti yerine, bir araç ekleyerek ajan artık çok çeşitli eylemler gerçekleştirebilir. Bu bölümde, AI ajanlarının belirli hedeflere ulaşmak için nasıl belirli araçları kullanabileceğini açıklayan Araç Kullanım Tasarım Deseni’ni inceleyeceğiz.

Giriş

Bu derste aşağıdaki sorulara cevap arayacağız:

Öğrenme Hedefleri

Bu dersi tamamladıktan sonra:

Araç Kullanım Tasarım Deseni Nedir?

Araç Kullanım Tasarım Deseni, LLM’lere belirli hedeflere ulaşmak için dış araçlarla etkileşim kurma yeteneği kazandırmaya odaklanır. Araçlar, bir ajan tarafından eylem gerçekleştirmek üzere çalıştırılabilen kodlardır. Bir araç, hesap makinesi gibi basit bir fonksiyon olabileceği gibi, hisse senedi fiyatı sorgulama veya hava durumu tahmini gibi üçüncü taraf bir hizmete API çağrısı da olabilir. AI ajanları bağlamında araçlar, model tarafından oluşturulan fonksiyon çağrılarına yanıt olarak ajanlar tarafından yürütülmek üzere tasarlanmıştır.

Hangi kullanım durumlarına uygulanabilir?

AI Ajanları, karmaşık görevleri tamamlamak, bilgi almak veya karar vermek için araçlardan yararlanabilir. Araç kullanım tasarım deseni, veritabanları, web servisleri veya kod yorumlayıcıları gibi dış sistemlerle dinamik etkileşim gerektiren durumlarda sıklıkla kullanılır. Bu yetenek şu gibi farklı kullanım durumları için faydalıdır:

Araç kullanım tasarım desenini uygulamak için gereken öğeler/yapı taşları nelerdir?

Bu yapı taşları, AI ajanının çok çeşitli görevleri gerçekleştirmesini sağlar. Araç Kullanım Tasarım Deseni’ni uygulamak için gereken temel öğelere bakalım:

Şimdi Fonksiyon/Araç Çağrısını daha ayrıntılı inceleyelim.

Fonksiyon/Araç Çağrısı

Fonksiyon çağrısı, Büyük Dil Modellerinin (LLM’lerin) araçlarla etkileşimini mümkün kılan temel yoldur. ‘Fonksiyon’ ve ‘Araç’ terimlerinin sıkça birbirinin yerine kullanıldığını göreceksiniz çünkü ‘fonksiyonlar’ (tekrar kullanılabilir kod blokları) ajanların görevleri yerine getirmek için kullandığı ‘araçlardır’. Bir fonksiyonun kodunun çağrılabilmesi için LLM, kullanıcının isteğini fonksiyonun tanımıyla karşılaştırmalıdır. Bunu yapmak için, mevcut tüm fonksiyonların açıklamalarını içeren bir şema LLM’ye gönderilir. LLM, göreve en uygun fonksiyonu seçer ve fonksiyon adı ile argümanlarını döndürür. Seçilen fonksiyon çağrılır, yanıtı LLM’ye gönderilir ve LLM, bilgiyi kullanarak kullanıcının isteğine yanıt verir.

Geliştiricilerin ajanlar için fonksiyon çağrısını uygulayabilmesi için şunlar gerekir:

  1. Fonksiyon çağrısını destekleyen bir LLM modeli
  2. Fonksiyon açıklamalarını içeren bir şema
  3. Tanımlanan her fonksiyon için kod

Şimdi bir şehre ait mevcut saatin alınması örneğiyle anlatalım:

  1. Fonksiyon çağrısını destekleyen bir LLM başlatın:

    Tüm modeller fonksiyon çağrısını desteklemez, bu nedenle kullandığınız LLM’nin desteklediğinden emin olmak önemlidir. Azure OpenAI fonksiyon çağrısını destekler. Azure OpenAI istemcisini başlatarak başlayabiliriz.

     # Azure OpenAI istemcisini başlatın
     client = AzureOpenAI(
         azure_endpoint = os.getenv("AZURE_AI_PROJECT_ENDPOINT"), 
         api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
         api_version="2024-05-01-preview"
     )
    
  2. Bir Fonksiyon Şeması Oluşturun:

    Bir sonraki adım, fonksiyonun adını, fonksiyonun ne yaptığının açıklamasını ve fonksiyon parametrelerinin adlarını ve açıklamalarını içeren JSON şeması tanımlamaktır. Bu şemayı daha önce oluşturulan istemciye, San Francisco saatini bulmak için kullanıcının talebi ile birlikte göndereceğiz. Önemli olan, geri dönenin bir araç çağrısı olmasıdır, sorunun nihai cevabı değil. Daha önce belirtildiği gibi, LLM göreve seçtiği fonksiyonun adını ve ona iletilecek argümanları döndürür.

     # Modelin okuyabilmesi için fonksiyon açıklaması
     tools = [
         {
             "type": "function",
             "function": {
                 "name": "get_current_time",
                 "description": "Get the current time in a given location",
                 "parameters": {
                     "type": "object",
                     "properties": {
                         "location": {
                             "type": "string",
                             "description": "The city name, e.g. San Francisco",
                         },
                     },
                     "required": ["location"],
                 },
             }
         }
     ]
    
      
     # İlk kullanıcı mesajı
     messages = [{"role": "user", "content": "What's the current time in San Francisco"}] 
      
     # İlk API çağrısı: Modelden işlevi kullanmasını iste
       response = client.chat.completions.create(
           model=deployment_name,
           messages=messages,
           tools=tools,
           tool_choice="auto",
       )
      
       # Modelin yanıtını işle
       response_message = response.choices[0].message
       messages.append(response_message)
      
       print("Model's response:")  
    
       print(response_message)
      
    
     Model's response:
     ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_pOsKdUlqvdyttYB67MOj434b', function=Function(arguments='{"location":"San Francisco"}', name='get_current_time'), type='function')])
    
  3. Görevi gerçekleştirmek için gereken fonksiyon kodu:

    Artık LLM hangi fonksiyonun çalıştırılması gerektiğini seçtiğine göre, görevi yerine getiren kod uygulanmalı ve çalıştırılmalıdır. Python’da mevcut saati almak için kodu yazabiliriz. Sonucu elde etmek için yanıttan fonksiyon adını ve argümanları çıkarmak için de kod yazmamız gerekecek.

       def get_current_time(location):
         """Get the current time for a given location"""
         print(f"get_current_time called with location: {location}")  
         location_lower = location.lower()
            
         for key, timezone in TIMEZONE_DATA.items():
             if key in location_lower:
                 print(f"Timezone found for {key}")  
                 current_time = datetime.now(ZoneInfo(timezone)).strftime("%I:%M %p")
                 return json.dumps({
                     "location": location,
                     "current_time": current_time
                 })
          
         print(f"No timezone data found for {location_lower}")  
         return json.dumps({"location": location, "current_time": "unknown"})
    
      # Fonksiyon çağrılarını işleyin
       if response_message.tool_calls:
           for tool_call in response_message.tool_calls:
               if tool_call.function.name == "get_current_time":
         
                   function_args = json.loads(tool_call.function.arguments)
         
                   time_response = get_current_time(
                       location=function_args.get("location")
                   )
         
                   messages.append({
                       "tool_call_id": tool_call.id,
                       "role": "tool",
                       "name": "get_current_time",
                       "content": time_response,
                   })
       else:
           print("No tool calls were made by the model.")  
      
       # İkinci API çağrısı: Modelden son yanıtı alın
       final_response = client.chat.completions.create(
           model=deployment_name,
           messages=messages,
       )
      
       return final_response.choices[0].message.content
    
       get_current_time called with location: San Francisco
       Timezone found for san francisco
       The current time in San Francisco is 09:24 AM.
    

Fonksiyon Çağrısı, neredeyse tüm ajan araç kullanım tasarımlarının merkezindedir, ancak sıfırdan uygulamak bazen zor olabilir. Lesson 2 dersinde öğrendiğimiz gibi, ajan çerçeveleri araç kullanımını uygulamak için önceden inşa edilmiş yapı taşları sağlar.

Ajanik Çerçevelerle Araç Kullanımına Örnekler

Farklı ajanik çerçevelerle Araç Kullanım Tasarım Deseni’ni nasıl uygulayabileceğinize dair bazı örnekler:

Microsoft Agent Framework

Microsoft Agent Framework, AI ajanları oluşturmak için açık kaynaklı bir AI çerçevesidir. @tool dekoratörü ile araçları Python fonksiyonları olarak tanımlamanıza izin vererek fonksiyon çağrısını kolaylaştırır. Çerçeve, model ile kodunuz arasındaki karşılıklı iletişimi yönetir. Ayrıca AzureAIProjectAgentProvider aracılığıyla Dosya Arama ve Kod Yorumlayıcı gibi önceden oluşturulmuş araçlara erişim sağlar.

Aşağıdaki diyagram, Microsoft Agent Framework ile fonksiyon çağrısı sürecini gösterir:

function calling

Microsoft Agent Framework’te araçlar dekoratörlü fonksiyonlar olarak tanımlanır. Daha önce gördüğümüz get_current_time fonksiyonunu, @tool dekoratörünü kullanarak bir araca dönüştürebiliriz. Çerçeve fonksiyon ve parametrelerini otomatik olarak serileştirerek LLM’ye gönderilecek şemayı oluşturur.

from agent_framework import tool
from agent_framework.azure import AzureAIProjectAgentProvider
from azure.identity import AzureCliCredential

@tool
def get_current_time(location: str) -> str:
    """Get the current time for a given location"""
    ...

# İstemciyi oluştur
provider = AzureAIProjectAgentProvider(credential=AzureCliCredential())

# Bir ajan oluştur ve araçla çalıştır
agent = await provider.create_agent(name="TimeAgent", instructions="Use available tools to answer questions.", tools=get_current_time)
response = await agent.run("What time is it?")

Azure AI Agent Service

Azure AI Agent Service, geliştiricilerin temel bilgi işlem ve depolama kaynaklarını yönetmeden yüksek kaliteli, genişletilebilir AI ajanları güvenli bir şekilde oluşturup dağıtmasını ve ölçeklendirmesini sağlamak için tasarlanmış daha yeni bir ajanik çerçevedir. Özellikle kurumsal uygulamalar için uygundur çünkü tam yönetilen ve kurumsal sınıf güvenlik sunan bir hizmettir.

Doğrudan LLM API ile geliştirmeye kıyasla Azure AI Agent Service bazı avantajlar sunar, örneğin:

Azure AI Agent Service’deki araçlar iki kategoriye ayrılır:

  1. Bilgi Araçları:
  2. Eylem Araçları:

Agent Service, bu araçları birlikte bir toolset olarak kullanmamıza olanak tanır. Ayrıca belirli bir konuşmanın mesaj geçmişini takip eden threads yapısını kullanır.

Contoso adlı bir şirkette satış temsilcisi olduğunuzu hayal edin. Satış verilerinizle ilgili soruları yanıtlayabilen bir konuşma ajanı geliştirmek istiyorsunuz.

Aşağıdaki resim, Azure AI Agent Service kullanarak satış verilerinizi nasıl analiz edebileceğinizi gösterir:

Agentic Service In Action

Hizmetle herhangi bir aracı kullanmak için bir istemci oluşturup bir araç veya araç seti tanımlayabiliriz. Bunu pratik olarak uygulamak için aşağıdaki Python kodunu kullanabiliriz. LLM, araç setine bakarak kullanıcının isteğine göre kullanıcı tarafından oluşturulan fetch_sales_data_using_sqlite_query fonksiyonunu veya önceden oluşturulmuş Kod Yorumlayıcıyı kullanmaya karar verebilir.

import os
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
from fetch_sales_data_functions import fetch_sales_data_using_sqlite_query # fetch_sales_data_functions.py dosyasında bulunan fetch_sales_data_using_sqlite_query fonksiyonu.
from azure.ai.projects.models import ToolSet, FunctionTool, CodeInterpreterTool

project_client = AIProjectClient.from_connection_string(
    credential=DefaultAzureCredential(),
    conn_str=os.environ["PROJECT_CONNECTION_STRING"],
)

# Araç setini başlat
toolset = ToolSet()

# fetch_sales_data_using_sqlite_query fonksiyonu ile fonksiyon çağrı ajanını başlat ve araç setine ekle
fetch_data_function = FunctionTool(fetch_sales_data_using_sqlite_query)
toolset.add(fetch_data_function)

# Kod Yorumlayıcı aracını başlat ve araç setine ekle.
code_interpreter = CodeInterpreterTool()toolset.add(code_interpreter)

agent = project_client.agents.create_agent(
    model="gpt-4o-mini", name="my-agent", instructions="You are helpful agent", 
    toolset=toolset
)

Güvenilir AI ajanları oluşturmak için Araç Kullanım Tasarım Deseni’ni kullanırken özel olarak nelere dikkat edilmeli?

LLM’ler tarafından dinamik olarak oluşturulan SQL ile ilgili yaygın bir endişe, özellikle SQL enjeksiyonu veya veritabanına zarar verme gibi kötü niyetli eylemler riskidir. Bu endişeler geçerli olmakla birlikte, veritabanı erişim izinlerinin doğru yapılandırılmasıyla etkili biçimde azaltılabilir. Çoğu veritabanı için bu, veritabanının salt okunur olarak yapılandırılması anlamına gelir. PostgreSQL veya Azure SQL gibi veritabanı servislerinde uygulamaya salt okunur (SELECT) rolü atanmalıdır.

Uygulamanın güvenli bir ortamda çalıştırılması korumayı daha da artırır. Kurumsal senaryolarda, veriler genellikle operasyonel sistemlerden kullanıcı dostu bir şemaya sahip salt okunur bir veritabanına veya veri ambarına çıkarılır ve dönüştürülür. Bu yaklaşım verilerin güvenli, performans ve erişilebilirlik açısından optimize edilmiş olmasını sağlar ve uygulamanın sınırlı, salt okunur erişime sahip olmasını garanti eder.

Örnek Kodlar

Araç Kullanım Tasarım Deseni hakkında Daha Fazla Sorunuz mu Var?

Diğer öğrenenlerle tanışmak, ofis saatlerine katılmak ve AI Ajanları sorularınızı yanıtlamak için Microsoft Foundry Discord’a katılın.

Ek Kaynaklar

Önceki Ders

Agentik Tasarım Desenlerini Anlamak

Sonraki Ders

Agentic RAG


Feragatname: Bu belge, AI çeviri hizmeti Co-op Translator kullanılarak çevrilmiştir. Doğruluk için çaba sarf etsek de, otomatik çevirilerin hata veya yanlışlık içerebileceğini lütfen unutmayınız. Orijinal belge, kendi dilinde yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımı sonucu ortaya çıkabilecek yanlış anlamalardan veya yanlış yorumlamalardan sorumlu değiliz.