ai-agents-for-beginners

Nasıl İyi AI Ajanları 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 artık çok çeşitli eylemleri gerçekleştirebilir. Bu bölümde, AI ajanlarının hedeflerine ulaşmak için belirli araçları nasıl kullanabileceğini açıklayan Araç Kullanımı Tasarım Deseni’ni inceleyeceğiz.

Giriş

Bu derste şu sorulara cevap arıyoruz:

Öğrenme Hedefleri

Bu dersi tamamladıktan sonra şunları yapabileceksiniz:

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 kazandırmaya odaklanır. Araçlar, bir ajanın eylemleri gerçekleştirmek için çalıştırabileceği kodlardır. Bir araç, bir hesap makinesi gibi basit bir fonksiyon ya da hisse senedi fiyatlarını sorgulama veya hava durumu tahmini gibi üçüncü taraf bir hizmete yapılan bir API çağrısı olabilir. AI ajanları bağlamında, araçlar model tarafından oluşturulan fonksiyon çağrılarına yanıt olarak çalıştırılmak üzere tasarlanmıştır.

Hangi kullanım durumlarına uygulanabilir?

AI ajanları, karmaşık görevleri tamamlamak, bilgi almak veya kararlar vermek için araçlardan yararlanabilir. Araç kullanımı tasarım deseni, genellikle veritabanları, web hizmetleri veya kod yorumlayıcılar gibi harici sistemlerle dinamik etkileşim gerektiren senaryolarda kullanılır. Bu yetenek, aşağıdaki gibi çeşitli kullanım durumları için faydalıdır:

Araç Kullanımı Tasarım Deseni’ni uygulamak için gerekli unsurlar/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 gerekli temel unsurlara 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’ler) araçlarla etkileşim kurmasını sağlamanın birincil yoludur. ‘Fonksiyon’ ve ‘Araç’ terimlerini genellikle birbirinin yerine kullanıldığını göreceksiniz çünkü ‘fonksiyonlar’ (yeniden kullanılabilir kod blokları), ajanların görevleri yerine getirmek için kullandığı ‘araçlardır’. Bir fonksiyonun kodunun çalıştırılabilmesi için, LLM’nin kullanıcı isteğini fonksiyonun açıklamasıyla karşılaştırması gerekir. Bunun için, mevcut tüm 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öndürür. Seçilen fonksiyon çalıştırılır, yanıtı LLM’ye geri gönderilir ve bu bilgi kullanıcının isteğine yanıt vermek için kullanılır.

Ajanlar için fonksiyon çağrısını uygulamak isteyen geliştiricilerin şunlara ihtiyacı 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

Bir şehirdeki mevcut zamanı almak örneğini 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 bunu desteklediğinden emin olmanız önemlidir. Azure OpenAI fonksiyon çağrısını destekler. Azure OpenAI istemcisini başlatarak başlayabiliriz.

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

    Daha sonra, fonksiyon adını, fonksiyonun ne yaptığının açıklamasını ve fonksiyon parametrelerinin adlarını ve açıklamalarını içeren bir JSON şeması tanımlayacağız. Bu şemayı, daha önce oluşturulan istemciye ve San Francisco’daki zamanı bulma isteğiyle birlikte ileteceğiz. Önemli olan, bir araç çağrısının döndürülmesidir, sorunun nihai cevabı değil. Daha önce belirtildiği gibi, LLM görev için seçtiği fonksiyonun adını ve ona iletilecek argümanları döndürür.

     # Function description for the model to read
     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"],
                 },
             }
         }
     ]
    
      
     # Initial user message
     messages = [{"role": "user", "content": "What's the current time in San Francisco"}] 
      
     # First API call: Ask the model to use the function
       response = client.chat.completions.create(
           model=deployment_name,
           messages=messages,
           tools=tools,
           tool_choice="auto",
       )
      
       # Process the model's response
       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 yerine getirmek için gereken fonksiyon kodu:

    Artık LLM’nin hangi fonksiyonun çalıştırılması gerektiğini seçtiğini biliyoruz, görevi yerine getirecek kodun uygulanması ve çalıştırılması gerekiyor. Python’da mevcut zamanı almak için kodu uygulayabiliriz. Ayrıca, nihai sonucu elde etmek için response_message’dan ad ve argümanları çıkarmak için 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"})
    
      # Handle function calls
       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.")  
      
       # Second API call: Get the final response from the model
       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ı, çoğu ajan araç kullanımı tasarımının merkezindedir, ancak sıfırdan uygulamak bazen zorlayıcı olabilir. Ders 2’de öğrendiğimiz gibi, ajan çerçeveleri bize araç kullanımını uygulamak için önceden oluşturulmuş yapı taşları sağlar.

Ajan Çerçeveleri ile Araç Kullanımı Örnekleri

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

Semantic Kernel

Semantic Kernel, Büyük Dil Modelleri (LLM’lerle) çalışan .NET, Python ve Java geliştiricileri için açık kaynaklı bir AI çerçevesidir. Fonksiyon çağrısını kullanmayı, fonksiyonlarınızı ve parametrelerini modele otomatik olarak açıklayan bir süreç olan serileştirme yoluyla basitleştirir. Ayrıca model ve kodunuz arasındaki iletişimi yönetir. Semantic Kernel gibi bir ajan çerçevesi kullanmanın bir diğer avantajı, Dosya Arama ve Kod Yorumlayıcı gibi önceden oluşturulmuş araçlara erişim sağlamasıdır.

Aşağıdaki diyagram, Semantic Kernel ile fonksiyon çağrısı sürecini göstermektedir:

fonksiyon çağrısı

Semantic Kernel’de fonksiyonlar/araçlar Eklentiler olarak adlandırılır. Daha önce gördüğümüz get_current_time fonksiyonunu, bir sınıfa dönüştürerek ve fonksiyonu içine koyarak bir eklentiye dönüştürebiliriz. Ayrıca, fonksiyonun açıklamasını alan kernel_function dekoratörünü içe aktarabiliriz. GetCurrentTimePlugin ile bir çekirdek oluşturduğunuzda, çekirdek fonksiyonu ve parametrelerini otomatik olarak serileştirir ve bu süreçte LLM’ye gönderilecek şemayı oluşturur.

from semantic_kernel.functions import kernel_function

class GetCurrentTimePlugin:
    async def __init__(self, location):
        self.location = location

    @kernel_function(
        description="Get the current time for a given location"
    )
    def get_current_time(location: str = ""):
        ...

from semantic_kernel import Kernel

# Create the kernel
kernel = Kernel()

# Create the plugin
get_current_time_plugin = GetCurrentTimePlugin(location)

# Add the plugin to the kernel
kernel.add_plugin(get_current_time_plugin)

Azure AI Agent Service

Azure AI Agent Service, geliştiricilerin yüksek kaliteli ve genişletilebilir AI ajanlarını güvenli bir şekilde oluşturmasını, dağıtmasını ve ölçeklendirmesini sağlamak için tasarlanmış daha yeni bir ajan çerçevesidir. Temel bilgi işlem ve depolama kaynaklarını yönetme gereksinimi olmadan çalışır. Özellikle kurumsal uygulamalar için faydalıdır çünkü tamamen yönetilen bir hizmettir ve kurumsal düzeyde güvenlik sağlar.

LLM API’si ile doğrudan geliştirme ile karşılaştırıldığında, Azure AI Agent Service şu avantajları sunar:

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

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

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

Contoso adlı bir şirkette satış temsilcisi olduğunuzu hayal edin. Satış verileriniz hakkında soruları yanıtlayabilecek bir konuşma ajanı geliştirmek istiyorsunuz.

Aşağıdaki görsel, satış verilerinizi analiz etmek için Azure AI Agent Service’i nasıl kullanabileceğinizi göstermektedir:

Agentic Service Uygulamada

Bu hizmetle herhangi bir aracı kullanmak için bir istemci oluşturabilir ve bir araç veya araç seti tanımlayabilirsiniz. Bunu pratikte uygulamak için aşağıdaki Python kodunu kullanabiliriz. LLM, araç setine 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 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_using_sqlite_query function which can be found in a fetch_sales_data_functions.py file.
from azure.ai.projects.models import ToolSet, FunctionTool, CodeInterpreterTool

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

# Initialize function calling agent with the fetch_sales_data_using_sqlite_query function and adding it to the toolset
fetch_data_function = FunctionTool(fetch_sales_data_using_sqlite_query)
toolset = ToolSet()
toolset.add(fetch_data_function)

# Initialize Code Interpreter tool and adding it to the toolset. 
code_interpreter = code_interpreter = CodeInterpreterTool()
toolset = ToolSet()
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 nelere dikkat edilmelidir?

LLM’ler tarafından dinamik olarak oluşturulan SQL ile ilgili yaygın bir endişe, özellikle SQL enjeksiyonu veya veritabanını düşürme veya değiştirme gibi kötü niyetli eylemler riskidir. Bu endişeler geçerli olsa da, veritabanı erişim izinlerini doğru bir şekilde yapılandırarak etkili bir şekilde azaltılabilir. Çoğu veritabanı için bu, veritabanını salt okunur olarak yapılandırmayı içerir. PostgreSQL veya Azure SQL gibi veritabanı hizmetleri için uygulamaya salt okunur (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 çıkarılır ve kullanıcı dostu bir şema ile salt okunur bir veritabanına veya veri ambarına dönüştürülür. Bu yaklaşım, verilerin güvenli, performans ve erişilebilirlik için optimize edilmiş olmasını ve uygulamanın sınırlı, salt okunur erişime sahip olmasını sağlar.

Araç Kullanımı Tasarım Desenleri hakkında daha fazla sorunuz mu var?

Azure AI Foundry Discord topluluğuna katılarak diğer öğrenenlerle tanışabilir, ofis saatlerine katılabilir ve AI Agents ile ilgili sorularınıza yanıt alabilirsiniz.

Ek Kaynaklar

Önceki Ders

Agentic Tasarım Kalıplarını Anlamak

Sonraki Ders

Agentic RAG


Feragatname:
Bu belge, Co-op Translator adlı yapay zeka çeviri hizmeti kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Belgenin orijinal dili, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan yanlış anlamalar veya yanlış yorumlamalar için sorumluluk kabul etmiyoruz.