(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 artık çok çeşitli eylemler gerçekleştirebilir. Bu bölümde, AI ajanlarının belirli araçları hedeflerine ulaşmak için nasıl kullanabileceğini açıklayan Araç Kullanımı Tasarım Deseni’ni inceleyeceğiz.
Bu derste şu soruları yanıtlamayı hedefliyoruz:
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 kazandırmaya odaklanır. Araçlar, bir ajanın eylemleri gerçekleştirmek için çalıştırabileceği kod parçalarıdır. Bir araç, bir hesap makinesi gibi basit bir fonksiyon veya hisse senedi fiyatı sorgulama ya da 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.
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 senaryoları için faydalıdır:
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 unsurlara bakalım:
Fonksiyon/Arac Şemaları: Kullanılabilir araçların ayrıntılı tanımları, fonksiyon adı, amacı, gerekli parametreler ve beklenen çıktılar dahil. 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ığı: Kullanıcının niyetine ve konuşma bağlamına göre araçların 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 fonksiyonlardan karmaşık harici hizmetlere kadar çeşitli araçlara bağlayan altyapı.
Hata Yönetimi ve Doğrulama: Araç çalıştırma hatalarını yönetmek, parametreleri doğrulamak ve beklenmeyen yanıtları ele almak için mekanizmalar.
Durum Yönetimi: Konuşma bağlamını, önceki araç etkileşimlerini ve kalıcı verileri takip ederek çoklu dönüşlü etkileşimlerde tutarlılığı sağlar.
Şimdi Fonksiyon/Arac Çağrısını daha ayrıntılı inceleyelim.
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ına 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 LLM bu bilgiyi kullanarak kullanıcı isteğine yanıt verir.
Ajanlar için fonksiyon çağrısını uygulamak isteyen geliştiricilerin ihtiyacı olanlar:
San Francisco’daki mevcut zamanı almak örneğini kullanarak açıklayalı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 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"
)
Bir Fonksiyon Şeması Oluşturun:
Ardından, fonksiyon adı, fonksiyonun ne yaptığına dair açıklama ve fonksiyon parametrelerinin adları ve açıklamalarını içeren bir JSON şeması tanımlayacağız. Bu şemayı, San Francisco’daki zamanı bulmak için kullanıcı isteğiyle birlikte daha önce oluşturulan istemciye ileteceğiz. Önemli olan, dönen şeyin bir araç çağrısı olduğu, sorunun nihai cevabı olmadığıdır. 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')])
Görevi yerine getirmek için gereken fonksiyon kodu:
LLM hangi fonksiyonun çalıştırılması gerektiğini seçtikten sonra, görevi yerine getirecek kodun uygulanması ve çalıştırılması gerekir. Mevcut zamanı almak için Python’da 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ı, ajan araç kullanımı tasarımının çoğunun, hatta tamamının temelinde yer alır, ancak sıfırdan uygulamak bazen zor olabilir. Ders 2’de öğrendiğimiz gibi, ajan çerçeveleri araç kullanımını uygulamak için önceden oluşturulmuş yapı taşları sağlar.
Farklı ajan çerçevelerini kullanarak Araç Kullanımı Tasarım Deseni’ni nasıl uygulayabileceğinize dair bazı örnekler:
Semantic Kernel, Büyük Dil Modelleri (LLM’ler) ile çalışan .NET, Python ve Java geliştiricileri için açık kaynaklı bir AI çerçevesidir. Fonksiyon çağrısını kullanma sürecini, fonksiyonlarınızı ve parametrelerini modele otomatik olarak açıklayan bir süreç olan serileştirme yoluyla basitleştirir. Ayrıca model ile 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:
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 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, 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:
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ış verilerinizle ilgili soruları yanıtlayabilecek bir konuşma ajanı geliştirmek istiyorsunuz.
Aşağıdaki görsel, Azure AI Agent Service’i kullanarak satış verilerinizi nasıl analiz edebileceğinizi göstermektedir:
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 kullanıcı isteğine bağlı olarak 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
)
LLM’ler tarafından dinamik olarak oluşturulan SQL ile ilgili yaygın bir endişe, SQL enjeksiyonu veya veritabanını silme 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 alını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 açısından optimize edilmiş olmasını ve uygulamanın sınırlı, salt okunur erişime sahip olmasını sağlar.
Diğer öğrenicilerle tanışmak, ofis saatlerine katılmak ve AI Agents ile ilgili sorularınıza yanıt almak için Azure AI Foundry Discord kanalına katılın.
Agentic Tasarım Kalıplarını Anlamak
Feragatname:
Bu belge, AI çeviri hizmeti Co-op Translator kullanılarak çevrilmiştir. Doğruluğu sağlamak için çaba göstersek de, otomatik çeviriler hata veya yanlışlıklar içerebilir. 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 edilmez.