ai-agents-for-beginners

İyi AI Ajanları Nasıl Tasarlanır

(Bu dersin videosunu 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 daha geniş bir yetenek yelpazesine sahip olmasını sağlar. Ajanın gerçekleştirebileceği sınırlı bir eylem seti yerine, bir araç ekleyerek ajan şimdi çok çeşitli eylemleri gerçekleştirebilir. Bu bölümde AI ajanlarının belirli araçları nasıl kullanarak hedeflerine ulaşabileceğini açıklayan Araç Kullanımı Tasarım Deseni’ne bakacağız.

Giriş

Bu derste aşağıdaki sorulara yanıt arıyoruz:

Öğ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 harici araçlarla etkileşim kurma yeteneği vermeye odaklanır. Araçlar, bir ajan tarafından eylem gerçekleştirmek üzere çalıştırılabilen koddur. Bir araç, basit bir hesap makinesi fonksiyonu veya hisse senedi fiyatı sorgulama ya da hava durumu tahmini gibi üçüncü taraf bir hizmete API çağrısı olabilir. AI ajanları bağlamında araçlar, model tarafından üretilen fonksiyon çağrılarına yanıt olarak ajanlar tarafından çalıştırılmak üzere tasarlanmıştır.

Hangi kullanım senaryolarına uygulanabilir?

AI Ajanları, karmaşık görevleri tamamlamak, bilgi almak veya karar vermek için araçları kullanabilir. Araç kullanımı tasarım deseni, veri tabanları, web servisleri veya kod yorumlayıcılar gibi harici sistemlerle dinamik etkileşim gerektiren senaryolarda sıklıkla kullanılır. Bu yetenek aşağıdaki farklı kullanım senaryolarında 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 yerine getirmesini sağlar. Araç Kullanımı Tasarım Deseni’ni uygulamak için gereken ana öğelere bakalım:

Şimdi, Fonksiyon/Araç Çağrısına daha ayrıntılı bakalım.

Fonksiyon/Araç Çağrısı

Fonksiyon çağrısı, Büyük Dil Modellerinin (LLM’ler) araçlarla etkileşime geçmesini sağlamak için birincil yöntemdir. ‘Fonksiyon’ ve ‘Araç’ terimleri bazen birbirinin yerine kullanılır çünkü ‘fonksiyonlar’ (yeniden kullanılabilir kod blokları) ajanların görevleri gerçekleştirmek için kullandığı ‘araçlardır’. Bir fonksiyonun kodunun çalıştırılabilmesi için, LLM’nin kullanıcının talebini fonksiyon açıklamasıyla karşılaştırması gerekir. Bunun için, tüm mevcut fonksiyonların açıklamalarını içeren bir şema LLM’ye gönderilir. LLM, görev için en uygun fonksiyonu seçer ve adını ve argümanlarını döner. Seçilen fonksiyon çalıştırılır, yanıtı LLM’ye gönderilir ve LLM bu bilgiyle kullanıcının isteğine yanıt verir.

Geliştiricilerin ajanlar için fonksiyon çağrısını uygulayabilmesi için şunlara ihtiyaç vardır:

  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 şehirdeki mevcut zamanı almayı örnek olarak kullanalım:

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

    Tüm modeller fonksiyon çağrısını desteklemez, bu yüzden kullandığınız LLM’nin desteklediğinden emin olun. 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:

    Sonra fonksiyon adını, fonksiyonun ne yaptığını açıklayan açıklamayı ve fonksiyon parametre isimleri ile açıklamalarını içeren JSON şeması tanımlayacağız. Bu şemayı, az önce oluşturulan istemciye ve kullanıcı isteği olan San Francisco’daki zamanı bulmaya ileteceğiz. Önemli olan nokta şudur ki, bir araç çağrısı döndürülür, sorunun nihai cevabı değil. Daha önce belirtildiği gibi, LLM görevi için seçtiği fonksiyonun adını ve ona iletilecek argümanları döner.

     # Modelin okunması 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 fonksiyonu 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:

    LLM hangi fonksiyonun çalıştırılması gerektiğini seçtiği için görevi yerine getiren kod uygulanıp çalıştırılmalıdır. Python’da mevcut zamanı almak için kodu uygulayabiliriz. Ayrıca, sonucu almak için response_message’dan fonksiyon adı ve argümanları çıkarmak için kod yazmamız gerekir.

       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 nihai 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ı, eğer tüm değilse çoğu ajan araç kullanım tasarımının merkezindedir; ancak sıfırdan uygulaması bazen zor olabilir.

  1. Derste öğrendiğimiz gibi, Agentik Çerçeveler araç kullanımını gerçekleştirmek için önceden oluşturulmuş yapı taşları sağlar.

Agentik Çerçevelerle Araç Kullanımı Örnekleri

Aşağıda farklı agentik çerçeveler kullanarak Araç Kullanımı Tasarım Deseni’nin nasıl uygulanabileceğine dair örnekler yer almaktadır:

Microsoft Agent Framework

Microsoft Agent Framework, AI ajanları oluşturmak için açık kaynaklı bir AI çerçevesidir. Fonksiyon çağrısını, araçları @tool dekoratörü ile Python fonksiyonları olarak tanımlamanıza olanak vererek kolaylaştırır. Çerçeve, model ile kodunuz arasındaki karşılıklı iletişimi otomatik olarak 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 şema 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ştirip şemayı oluşturarak LLM’ye gönderir.

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 aracı ile ç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 yüksek kaliteli ve genişletilebilir AI ajanları güvenli şekilde oluşturup dağıtmasını ve ölçeklendirmesini sağlayan, altyapı yönetimi gerektirmeyen daha yeni bir agentik çerçevedir. Kurumsal uygulamalar için özellikle uygundur çünkü tam yönetilen ve kurumsal düzeyde güvenlik sağlar.

LLM API’yi doğrudan kullanmaya kıyasla, Azure AI Agent Service bazı avantajlar sunar:

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ı toolset olarak birlikte kullanmamıza izin verir. Ayrıca belirli bir konuşmanın mesaj geçmişini izleyen threadleri kullanır.

Örneğin, Contoso adlı bir şirkette satış temsilcisi olduğunuzu hayal edin. Satış verilerinizle ilgili soruları yanıtlayabilecek bir sohbet ajanı geliştirmek istiyorsunuz.

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

Agentic Service In Action

Servisle herhangi bir aracı kullanmak için bir istemci oluşturup bir araç veya araç seti tanımlayabiliriz. Pratikte bunu şu Python koduyla yapabiliriz. LLM, toolset’e bakarak kullanıcı tarafından oluşturulan fetch_sales_data_using_sqlite_query fonksiyonunu mu yoksa önceden oluşturulmuş Kod Yorumlayıcıyı mı kullanacağına karar verebilecektir.

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ğırma aracı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 = 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 kullanırken nelere dikkat edilmelidir?

LLM’ler tarafından dinamik olarak oluşturulan SQL sorgularında en sık karşılaşılan endişe güvenliktir; özellikle SQL enjeksiyonu veya veritabanını silme, değiştirme gibi kötü niyetli işlemler riski. Bu endişeler geçerli olsa da, veritabanı erişim izinleri uygun şekilde yapılandırılırsa etkili bir şekilde azaltılabilir. Çoğu veritabanında bunun yolu, veritabanının salt okunur olarak yapılandırılmasıdır. PostgreSQL veya Azure SQL gibi hizmetlerde uygulamaya okuma (SELECT) rolü atanmalıdır.

Uygulamayı güvenli bir ortamda çalıştırmak korumayı daha da artırır. Kurumsal senaryolarda, veriler genellikle operasyonel sistemlerden çıkartılıp okunabilir veri tabanı veya veri ambarına kullanıcı dostu şema ile dönüştürülür. Bu yöntem verilerin güvenli, performans ve erişilebilirlik açısından optimize edilmesini sağlar ve uygulamanın sınırlı, salt okunur erişimine izin verir.

Örnek Kodlar

Araç Kullanımı Tasarım Desenleri Hakkında Daha Fazla Sorunuz mu Var?

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

Ek Kaynaklar

Önceki Ders

Agentik Tasarım Desenlerini Anlamak

Sonraki Ders

Agentik RAG


Feragatname:
Bu belge, Yapay Zeka çeviri hizmeti Co-op Translator kullanılarak çevrilmiştir. Doğruluğu sağlamaya çalışsak da, otomatik çevirilerin hatalar veya yanlışlıklar içerebileceğini lütfen unutmayınız. Orijinal, ana dildeki belge yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımı sonucu oluşabilecek yanlış anlamalar veya yorum farklılıklarından sorumlu değiliz.