(Bu dersin videosunu izlemek için yukarıdaki görsele tıklayın)
Araçlar ilginçtir çünkü AI ajanlarının daha geniş bir yetenek yelpazesine sahip olmaları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 eylemler gerçekleştirebilir. Bu bölümde, AI ajanlarının hedeflerine ulaşmak için belirli araçları nasıl kullanabileceğini tanımlayan Araç Kullanım Tasarım Deseni’ne bakacağız.
Bu derste şu soruları yanıtlamaya çalışıyoruz:
Bu dersi tamamladıktan sonra şunları yapabileceksiniz:
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ın eylemler gerçekleştirmek için çalıştırabileceği kod parçalarıdır. Bir araç, hesap makinesi gibi basit bir işlev olabileceği gibi, hisse senedi fiyat sorgulama veya hava durumu tahmini gibi üçüncü taraf bir hizmete yapılan 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 çalıştırılmak üzere tasarlanmıştır.
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 senaryolarda sıkça kullanılır. Bu yetenek, aşağıdaki farklı kullanım durumları için faydalıdır:
Bu yapı taşları, AI ajanın çok çeşitli görevleri gerçekleştirmesine olanak tanır. Araç Kullanım Tasarım Deseni’ni uygulamak için gereken ana öğelere bakalım:
Fonksiyon/Araç Şemaları: Kullanılabilir araçların fonksiyon adı, amacı, gerekli parametreler ve beklenen çıktılar dahil olmak üzere detaylı tanımları. Bu şemalar, LLM’nin hangi araçların mevcut olduğunu ve geçerli istekleri nasıl oluşturacağını anlamasını sağlar.
Fonksiyon Çalıştırma Mantığı: Araçların ne zaman ve nasıl çağrılacağını, kullanıcının niyeti ve sohbet bağlamına göre yönetir. Bu, planlayıcı modüller, yönlendirme mekanizmaları veya araç kullanımını dinamik olarak belirleyen koşullu akışlar içerebilir.
Mesaj Yönetim Sistemi: Kullanıcı girdileri, LLM yanıtları, araç çağrıları ve araç çıktıları arasındaki konuşma akışını yöneten bileşenler.
Araç Entegrasyon Çerçevesi: Ajanı basit fonksiyonlar veya karmaşık dış hizmetler olsun çeşitli araçlara bağlayan alt yapı.
Hata Yönetimi & Doğrulama: Araç çalıştırmadaki hataları yönetme, parametreleri doğrulama ve beklenmedik yanıtları ele alma mekanizmaları.
Durum Yönetimi: Çok adımlı etkileşimlerde tutarlılığı sağlamak için konuşma bağlamını, önceki araç etkileşimlerini ve kalıcı veriyi takip eder.
Sonra, Fonksiyon/Araç Çağrısını daha ayrıntılı inceleyelim.
Fonksiyon çağrısı, Büyük Dil Modelleri’nin (LLM’ler) araçlarla etkileşim kurmalarını sağlayan temel yoldur. Genellikle ‘Fonksiyon’ ve ‘Araç’ terimleri birbirinin yerine kullanılır çü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 kullanıcının isteğini fonksiyonun açıklamasıyla karşılaştırmalıdır. Bunun için tüm mevcut fonksiyonların açıklamalarını içeren bir şema LLM’ye gönderilir. LLM daha sonra görev için en uygun fonksiyonu seçer ve ismini ile argümanlarını döner. Seçilen fonksiyon çalıştırılır, yanıtı LLM’ye iletilir ve LLM bu bilgiyi kullanarak kullanıcı isteğine yanıt verir.
Geliştiricilerin ajanlar için fonksiyon çağrısını uygulayabilmesi için şunlara ihtiyaç vardır:
Bir şehre ait güncel saati alma örneğiyle açıklayalım:
Fonksiyon çağrısını destekleyen bir LLM başlatın:
Her model fonksiyon çağrısını desteklemez, bu yüzden 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
client = AzureOpenAI(
azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"),
api_key=os.getenv("AZURE_OPENAI_API_KEY"),
api_version="2024-05-01-preview"
)
Bir Fonksiyon Şeması Oluşturun:
Sonra fonksiyon adı, fonksiyonun ne yaptığına dair açıklama ile fonksiyon parametrelerinin isimlerini ve açıklamalarını içeren bir JSON şeması tanımlayacağız. Bu şemayı, kullanıcı isteği (San Francisco saatini bulmak gibi) ile birlikte daha önce oluşturulan istemciye göndeririz. Önemli olan, araç çağrısının döndürüldüğüdür, sorunun nihai cevabı değil. Daha önce belirtildiği gibi, LLM görevi için seçtiği fonksiyonun adını ve ona geçirilecek argümanları döner.
# Modelin okuyabilmesi için işlev 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ı isteyin
response = client.chat.completions.create(
model=deployment_name,
messages=messages,
tools=tools,
tool_choice="auto",
)
# Modelin yanıtını işleyin
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')])
Görevi gerçekleştirmek için gereken fonksiyon kodu:
Şimdi LLM’nin hangi fonksiyonun çalıştırılması gerektiğini seçtiğine göre, görevi gerçekleştiren kod uygulanmalı ve çalıştırılmalıdır. Mevcut saati almak için Python’da kodu yazabiliriz. Sonuçta, response_message’dan fonksiyon adı ve argümanları alacak kodu da 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ı, çoğu ya da tüm ajan araç kullanım tasarımının merkezindedir ancak sıfırdan uygulaması bazen zor olabilir. 2. Ders’de öğrendiğimiz gibi, ajan çerçeveleri araç kullanımını uygulamak için önceden hazırlanmış yapı taşları sağlar.
Farklı ajan çerçevelerini kullanarak Araç Kullanım Tasarım Deseni’ni nasıl uygulayabileceğinize dair birkaç örnek:
Semantic Kernel, Büyük Dil Modelleri (LLM) ile çalışan .NET, Python ve Java geliştiricileri için açık kaynaklı bir AI çerçevesidir. Fonksiyon çağrısı kullanımını kolaylaştırır; fonksiyonlarınızı ve parametrelerini serileştirme adlı bir işlemle modele otomatik olarak tanıtır. Ayrıca model ile kodunuz arasındaki karşılıklı iletişimi yönetir. Semantic Kernel gibi ajan çerçevelerinin bir diğer avantajı da Dosya Arama ve Kod Yorumlayıcı gibi önceden hazırlanmış araçlara erişim sağlamasıdır.
Aşağıdaki diyagram Semantic Kernel ile fonksiyon çağrısı sürecini göstermektedir:

Semantic Kernel’de fonksiyonlar/araçlar Eklenti (Plugin) olarak adlandırılır. Daha önce gördüğümüz get_current_time fonksiyonunu, fonksiyonu içeren bir sınıfa dönüştürerek bir eklenti haline getirebiliriz. Ayrıca fonksiyonun açıklamasını alan kernel_function dekoratörünü import edebiliriz. Ardından GetCurrentTimePlugin ile bir kernel oluşturdukça, kernel fonksiyonu ve parametrelerini otomatik olarak serileştirip modeli göndermek üzere şema 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
# Çekirdeği oluştur
kernel = Kernel()
# Eklentiyi oluştur
get_current_time_plugin = GetCurrentTimePlugin(location)
# Eklentiyi çekirdeğe ekle
kernel.add_plugin(get_current_time_plugin)
Azure AI Agent Hizmeti, geliştiricilerin temel hesaplama ve depolama kaynaklarını yönetmeye gerek kalmadan yüksek kaliteli ve genişletilebilir AI ajanları güvenli bir şekilde oluşturmasını, dağıtmasını ve ölçeklendirmesini sağlayan daha yeni bir ajan çerçevesidir. Bu hizmet, özellikle kurumsal uygulamalar için uygun olup, tam yönetilen ve kurumsal güvenlik seviyesine sahiptir.
LLM API doğrudan geliştirilmeye kıyasla, Azure AI Agent Hizmeti aşağıdaki avantajları sunar:
Azure AI Agent Hizmetinde mevcut araçlar iki kategoriye ayrılır:
Agent Service, bu araçları bir araç seti (toolset) olarak birlikte kullanmamıza olanak tanır. Ayrıca belirli bir konuşmanın mesaj geçmişini takip eden threadleri 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 görsel, Azure AI Agent Hizmeti’ni kullanarak satış verilerinizi nasıl analiz edebileceğinizi göstermektedir:

Servisle bu araçlardan herhangi birini kullanmak için bir istemci yaratarak bir araç veya araç seti tanımlayabiliriz. 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 verecektir.
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 işlev çağırma 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 = 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
)
LLM’ler tarafından dinamik oluşturulan SQL ile ilgili yaygın bir endişe güvenliktir; özellikle SQL enjeksiyonu riski veya veritabanını silme/tahrif etme gibi kötü niyetli eylemler söz konusudur. Bu endişeler geçerlidir ancak veritabanı erişim izinlerinin doğru yapılandırılmasıyla etkili şekilde azaltılabilir. Çoğu veritabanı için bu, veritabanının salt okunur (read-only) olarak yapılandırılması anlamına gelir. PostgreSQL veya Azure SQL gibi veritabanı hizmetlerinde, 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ımı kolay bir şemaya sahip salt okunur bir veritabanı 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ı sağlar ve uygulamanın kısıtlı, salt okunur erişime sahip olmasını garanti eder.
Diğer öğrenenlerle tanışmak, çalışma saatlerine katılmak ve AI Agent sorularınızı cevaplamak için Azure AI Foundry Discord’a katılın.
Understanding Agentic Design Patterns
Feragatname: Bu belge, AI çeviri servisi Co-op Translator kullanılarak çevrilmiştir. Doğruluk için çaba sarf etsek de, otomatik çevirilerin hatalar veya yanlışlıklar içerebileceğini lütfen unutmayın. Orijinal belge, kendi dilinde yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımı sonucu ortaya çıkabilecek herhangi bir yanlış anlama veya yanlış yorumlamadan sorumlu değiliz.