(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 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.
Bu derste aşağıdaki sorulara yanıt arıyoruz:
Bu dersi tamamladıktan sonra:
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.
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:
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:
Fonksiyon/Araç Şemaları: Mevcut araçların detaylı tanımları; fonksiyon adı, amacı, gerekli parametreler ve beklenen çıktılar dahil. Bu şemalar, LLM’nin hangi araçların kullanılabilir olduğunu ve geçerli isteklerin nasıl oluşturulacağını anlamasını sağlar.
Fonksiyon Çalıştırma Mantığı: Araçların kullanıcı niyeti ve konuşma bağlamına göre nasıl ve ne zaman çağrılacağını 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 ya da karmaşık harici servislerle bağlayan altyapı.
Hata Yönetimi ve Doğrulama: Araç çalıştırma hatalarını ele alma, parametreleri doğrulama ve beklenmedik yanıtları yönetme mekanizmaları.
Durum Yönetimi: Konuşma bağlamını, önceki araç etkileşimlerini ve kalıcı verileri takip ederek çok adımlı etkileşimlerde tutarlılığı sağlar.
Şimdi, Fonksiyon/Araç Çağrısına daha ayrıntılı bakalım.
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:
Şimdi bir şehirdeki mevcut zamanı almayı örnek olarak kullanalım:
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"
)
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')])
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.
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, 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:

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 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:
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:

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
)
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.
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.
Agentik Tasarım Desenlerini Anlamak
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.