Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Not
Bu örnekte, OpenAI uyumlu Chat Completions API'si bir Foundry Models uç noktası üzerinden kullanılıyor. Yanıtlar API'sini kullanarak işlev çağrısı farklı bir istek ve yanıt biçimi kullanır. Daha fazla bilgi için bkz. Azure OpenAI Yanıtları API'sini kullanma.
İsteğinize bir veya daha fazla işlev eklerseniz model, istem bağlamını temel alarak işlevlerden herhangi birinin çağrılıp çağrılmayacağına karar verir. Model bir işlevi çağırmaya karar verdiği zaman, işlevin bağımsız değişkenlerini içeren bir JSON nesnesiyle yanıt verir.
Model, belirttiğiniz işlevlere göre işlev çağrıları ve yapılandırılmış bağımsız değişkenler oluşturur. Uygulamanız işlevleri yürütür ve sonuçları modele iletir; böylece gerçekleştirilen eylemler üzerinde denetim sizde kalır.
Yüksek düzeyde, işlevlerle çalışmayı üç adıma ayırabilirsiniz:
- İşlevleriniz ve kullanıcının girişiyle sohbet tamamlama API'sini çağırma
- API'nizi veya işlevinizi çağırmak için modelin yanıtını kullanın
- Son yanıtı almak için işlevinizden gelen yanıt da dahil olmak üzere sohbet tamamlama API'sini yeniden çağırın
Önkoşullar
- Chat Completions API’si aracılığıyla fonksiyon çağırmayı destekleyen bir Foundry Model dağıtımı.
-
https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/biçiminde bir Dökümhane kaynak uç noktası. - Microsoft Entra ID kimlik doğrulaması için:
- Özel bir alt alan adı yapılandırıldı. Daha fazla bilgi için Özel alt etki alanı adları bölümüne bkz.
- Paketler:
pip install openai azure-identity.
Tek araç/işlev çağırma örneği
Bu örnekte, tanımlanan tek bir araç/işlevle üç sabit kodlanmış konumdaki zamanı denetleen bir oyuncak işlev çağrısı gösterilmektedir. Yazdırma ifadeleri, kodun yürütülmesini takip etmeyi kolaylaştırır:
import os
import json
from openai import OpenAI
from datetime import datetime
from zoneinfo import ZoneInfo
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
token_provider = get_bearer_token_provider(
DefaultAzureCredential(), "https://ai.azure.com/.default"
)
client = OpenAI(
base_url = "https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
api_key=token_provider,
)
# Define the deployment you want to use for your chat completions API calls
deployment_name = "<YOUR_DEPLOYMENT_NAME_HERE>"
# Simplified timezone data
TIMEZONE_DATA = {
"tokyo": "Asia/Tokyo",
"san francisco": "America/Los_Angeles",
"paris": "Europe/Paris"
}
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"})
def run_conversation():
# Initial user message
messages = [{"role": "user", "content": "What's the current time in San Francisco"}] # Single function call
#messages = [{"role": "user", "content": "What's the current time in San Francisco, Tokyo, and Paris?"}] # Parallel function call with a single tool/function defined
# Define the function for the model
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"],
},
}
}
]
# 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)
# 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)
print(f"Function arguments: {function_args}")
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
# Run the conversation and print the result
print(run_conversation())
Çıkış:
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')])
Function arguments: {'location': 'San Francisco'}
get_current_time called with location: San Francisco
Timezone found for san francisco
The current time in San Francisco is 09:24 AM.
Paralel işlev çağrılarını destekleyen bir model dağıtımı kullanıyorsak, messages dizisini bir yerine birden çok konumdaki zamanı isteyecek şekilde değiştirerek bunu paralel işlev çağırma örneğine dönüştürebiliriz.
Bunu gerçekleştirmek için şu iki satırdaki açıklamaları değiştirin:
messages = [{"role": "user", "content": "What's the current time in San Francisco"}] # Single function call
#messages = [{"role": "user", "content": "What's the current time in San Francisco, Tokyo, and Paris?"}] # Parallel function call with a single tool/function defined
Bu şekilde görünmesi ve kodu yeniden çalıştırması için:
#messages = [{"role": "user", "content": "What's the current time in San Francisco"}] # Single function call
messages = [{"role": "user", "content": "What's the current time in San Francisco, Tokyo, and Paris?"}] # Parallel function call with a single tool/function defined
Bu, aşağıdaki çıkışı oluşturur:
Çıkış:
Model's response:
ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_IjcAVz9JOv5BXwUx1jd076C1', function=Function(arguments='{"location": "San Francisco"}', name='get_current_time'), type='function'), ChatCompletionMessageToolCall(id='call_XIPQYTCtKIaNCCPTdvwjkaSN', function=Function(arguments='{"location": "Tokyo"}', name='get_current_time'), type='function'), ChatCompletionMessageToolCall(id='call_OHIB5aJzO8HGqanmsdzfytvp', function=Function(arguments='{"location": "Paris"}', name='get_current_time'), type='function')])
Function arguments: {'location': 'San Francisco'}
get_current_time called with location: San Francisco
Timezone found for san francisco
Function arguments: {'location': 'Tokyo'}
get_current_time called with location: Tokyo
Timezone found for tokyo
Function arguments: {'location': 'Paris'}
get_current_time called with location: Paris
Timezone found for paris
As of now, the current times are:
- **San Francisco:** 11:15 AM
- **Tokyo:** 03:15 AM (next day)
- **Paris:** 08:15 PM
Paralel işlev çağrıları birden çok işlev çağrısını birlikte gerçekleştirmenize olanak tanıyarak paralel yürütmeye ve sonuçların alınmasına olanak tanır. Bu, API'ye yapılması gereken çağrı sayısını azaltır ve genel performansı artırabilir.
Örneğin, basit saat uygulamamızda aynı anda birden fazla zamanı getirdik. Bu, tool_calls dizisinde her biri benzersiz id olan üç işlev çağrısı içeren bir sohbet tamamlama iletisiyle sonuçlandı. Bu işlev çağrılarını yanıtlamak istiyorsanız, her biri bir işlev çağrısının sonucunu içeren tool_call_id yeni üç iletiyi, id'ye ve tool_calls'e referans veren, konuşmaya ekleyebilirsiniz.
Modeli belirli bir işlevi çağırmaya zorlamak için adlandırılmış bir araç nesnesine ayarlayın tool_choice , örneğin: tool_choice={"type": "function", "function": {"name": "get_current_time"}}. Kullanıcıya yönelik bir iletiyi zorlamak için tool_choice="none" ayarını yapın.
Not
Varsayılan davranış (tool_choice: "auto"), modelin bir işlevi çağırması gerekip gerekmediğini ve bu durumda hangi işlevin çağrıleceğine kendi başına karar vermesidir.
Birden fazla işlevle paralel fonksiyon çağrısı
Şimdi bu kez tanımlanan iki farklı araç/işlevle başka bir oyuncak işlevi çağırma örneği gösteriyoruz.
import os
import json
from openai import OpenAI
from datetime import datetime, timedelta
from zoneinfo import ZoneInfo
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
token_provider = get_bearer_token_provider(
DefaultAzureCredential(), "https://ai.azure.com/.default"
)
client = OpenAI(
base_url = "https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
api_key=token_provider,
)
# Provide the model deployment name you want to use for this example
deployment_name = "YOUR_DEPLOYMENT_NAME_HERE"
# Simplified weather data
WEATHER_DATA = {
"tokyo": {"temperature": "10", "unit": "celsius"},
"san francisco": {"temperature": "72", "unit": "fahrenheit"},
"paris": {"temperature": "22", "unit": "celsius"}
}
# Simplified timezone data
TIMEZONE_DATA = {
"tokyo": "Asia/Tokyo",
"san francisco": "America/Los_Angeles",
"paris": "Europe/Paris"
}
def get_current_weather(location, unit=None):
"""Get the current weather for a given location"""
location_lower = location.lower()
print(f"get_current_weather called with location: {location}, unit: {unit}")
for key in WEATHER_DATA:
if key in location_lower:
print(f"Weather data found for {key}")
weather = WEATHER_DATA[key]
return json.dumps({
"location": location,
"temperature": weather["temperature"],
"unit": unit if unit else weather["unit"]
})
print(f"No weather data found for {location_lower}")
return json.dumps({"location": location, "temperature": "unknown"})
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"})
def run_conversation():
# Initial user message
messages = [{"role": "user", "content": "What's the weather and current time in San Francisco, Tokyo, and Paris?"}]
# Define the functions for the model
tools = [
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "Get the current weather in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city name, e.g. San Francisco",
},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
},
"required": ["location"],
},
}
},
{
"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"],
},
}
}
]
# First API call: Ask the model to use the functions
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)
# Handle function calls
if response_message.tool_calls:
for tool_call in response_message.tool_calls:
function_name = tool_call.function.name
function_args = json.loads(tool_call.function.arguments)
print(f"Function call: {function_name}")
print(f"Function arguments: {function_args}")
if function_name == "get_current_weather":
function_response = get_current_weather(
location=function_args.get("location"),
unit=function_args.get("unit")
)
elif function_name == "get_current_time":
function_response = get_current_time(
location=function_args.get("location")
)
else:
function_response = json.dumps({"error": "Unknown function"})
messages.append({
"tool_call_id": tool_call.id,
"role": "tool",
"name": function_name,
"content": function_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
# Run the conversation and print the result
print(run_conversation())
Çıkış
Model's response:
ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_djHAeQP0DFEVZ2qptrO0CYC4', function=Function(arguments='{"location": "San Francisco", "unit": "celsius"}', name='get_current_weather'), type='function'), ChatCompletionMessageToolCall(id='call_q2f1HPKKUUj81yUa3ITLOZFs', function=Function(arguments='{"location": "Tokyo", "unit": "celsius"}', name='get_current_weather'), type='function'), ChatCompletionMessageToolCall(id='call_6TEY5Imtr17PaB4UhWDaPxiX', function=Function(arguments='{"location": "Paris", "unit": "celsius"}', name='get_current_weather'), type='function'), ChatCompletionMessageToolCall(id='call_vpzJ3jElpKZXA9abdbVMoauu', function=Function(arguments='{"location": "San Francisco"}', name='get_current_time'), type='function'), ChatCompletionMessageToolCall(id='call_1ag0MCIsEjlwbpAqIXJbZcQj', function=Function(arguments='{"location": "Tokyo"}', name='get_current_time'), type='function'), ChatCompletionMessageToolCall(id='call_ukOu3kfYOZR8lpxGRpdkhhdD', function=Function(arguments='{"location": "Paris"}', name='get_current_time'), type='function')])
Function call: get_current_weather
Function arguments: {'location': 'San Francisco', 'unit': 'celsius'}
get_current_weather called with location: San Francisco, unit: celsius
Weather data found for san francisco
Function call: get_current_weather
Function arguments: {'location': 'Tokyo', 'unit': 'celsius'}
get_current_weather called with location: Tokyo, unit: celsius
Weather data found for tokyo
Function call: get_current_weather
Function arguments: {'location': 'Paris', 'unit': 'celsius'}
get_current_weather called with location: Paris, unit: celsius
Weather data found for paris
Function call: get_current_time
Function arguments: {'location': 'San Francisco'}
get_current_time called with location: San Francisco
Timezone found for san francisco
Function call: get_current_time
Function arguments: {'location': 'Tokyo'}
get_current_time called with location: Tokyo
Timezone found for tokyo
Function call: get_current_time
Function arguments: {'location': 'Paris'}
get_current_time called with location: Paris
Timezone found for paris
Here's the current information for the three cities:
### San Francisco
- **Time:** 09:13 AM
- **Weather:** 72°C (quite warm!)
### Tokyo
- **Time:** 01:13 AM (next day)
- **Weather:** 10°C
### Paris
- **Time:** 06:13 PM
- **Weather:** 22°C
Is there anything else you need?
Önemli
JSON yanıtı her zaman geçerli olmayabilir, bu nedenle hataları işleyebilmek için kodunuza ek mantık eklemeniz gerekir. Bazı kullanım örnekleri için işlev çağırma performansını geliştirmek için ince ayarlama kullanmanız gerektiğini fark edebilirsiniz.
İşlevlerle istem mühendisliği
İsteğinizin bir parçası olarak bir işlev tanımladığınızda, ayrıntılar modelin eğitildiği belirli söz dizimi kullanılarak sistem iletisine eklenir. Bu, işlevlerin isteminizdeki belirteçleri kullandığı ve işlev çağrılarınızın performansını iyileştirmek için istem mühendisliği teknikleri uygulayabileceğiniz anlamına gelir. Model, işlev tanımı, sistem iletisi ve kullanıcı iletileri dahil olmak üzere bir işlevin çağrılıp çağrılmadığını belirlemek için istemin tam bağlamını kullanır.
Kalite ve güvenilirliği artırma
Model, işlevinizi beklediğiniz zaman veya beklediğiniz şekilde çağırmıyorsa, kaliteyi artırmak için deneyebileceğiniz birkaç şey vardır.
İşlev tanımınızda daha fazla ayrıntı sağlayın
İşlevin anlamlı description bir kısmını sağlamanız ve model için belirgin olmayabilecek herhangi bir parametre için açıklamalar sağlamanız önemlidir. Örneğin, parametresinin açıklamasına konumun location biçimine ek ayrıntılar ve örnekler ekleyebilirsiniz.
"location": {
"type": "string",
"description": "The location of the hotel. The location should include the city and the state's abbreviation (i.e. Seattle, WA or Miami, FL)"
},
Sistem iletisinde daha fazla bağlam sağlayın
Sistem iletisi, modele daha fazla bağlam sağlamak için de kullanılabilir. Örneğin, adlı search_hotels bir işleviniz varsa, kullanıcı otel bulma konusunda yardım istediğinde modelin işlevi çağırmasını isteyen aşağıdaki gibi bir sistem iletisi ekleyebilirsiniz.
{"role": "system", "content": "You're an AI assistant designed to help users search for hotels. When a user asks for help finding a hotel, you should call the search_hotels function."}
Modele net sorular sormasını isteyin
Bazı durumlarda, modele işlevlerle hangi değerlerin kullanılacağına ilişkin varsayımlarda bulunmayı önlemek için net sorular sormasını istemek istiyorsunuz. Örneğin, search_hotels kullanıcı isteğinde locationayrıntıların yer almaması durumunda modelin açıklamasını istemesini isteyebilirsiniz. Modele net bir soru sormasını istemek için sistem iletinize sonraki örneğe benzer içerikler ekleyebilirsiniz.
{"role": "system", "content": "Don't make assumptions about what values to use with functions. Ask for clarification if a user request is ambiguous."}
Hataları azaltma
İstem mühendisliğinin değerli olabileceği bir diğer alan da işlev çağrılarındaki hataları azaltmaktır. Modeller, tanımladığınız şemayla eşleşen işlev çağrıları oluşturmak için eğitilir, ancak modeller tanımladığınız şemayla eşleşmeyen bir işlev çağrısı oluşturur veya eklemediğiniz bir işlevi çağırmaya çalışır.
Modelin sağlanmayan işlev çağrıları oluşturduğunu fark ederseniz, sistem iletisine ifadesini "Only use the functions you have been provided with."içeren bir cümle eklemeyi deneyin.
İşlev çağırmayı sorumlu bir şekilde kullanma
Tüm yapay zeka sistemlerinde olduğu gibi, dil modellerini diğer araçlar ve sistemlerle tümleştirmek için işlev çağrısının kullanılması olası risklere neden olur. İşlev çağrısının sunabileceği riskleri anlamak ve yetenekleri sorumlu bir şekilde kullandığınızdan emin olmak için önlemler almak önemlidir.
İşlevleri güvenli ve güvenli bir şekilde kullanmanıza yardımcı olacak birkaç ipucu aşağıdadır:
- İşlev Çağrılarını Doğrulama: Her zaman model tarafından oluşturulan işlev çağrılarını doğrulayın. Bu, parametreleri denetlemeyi, çağrılan işlevi ve çağrının hedeflenen eylemle uyumlu olmasını sağlamayı içerir.
- Güvenilen Veri ve Araçları Kullanma: Yalnızca güvenilir ve doğrulanmış kaynaklardan gelen verileri kullanın. Bir işlevin çıkışındaki güvenilmeyen veriler, modele işlev çağrılarını istediğinizden farklı bir şekilde yazmasını bildirmek için kullanılabilir.
- En Az Ayrıcalık İlkesi'ni izleyin: İşlevin işini gerçekleştirmesi için yalnızca gereken en düşük erişimi verin. Bu, bir işlevin kötüye kullanılması veya kötüye kullanılması durumunda olası etkiyi azaltır. Örneğin, bir veritabanını sorgulamak için işlev çağrıları kullanıyorsanız, uygulamanıza veritabanına yalnızca salt okunur erişim vermeniz gerekir. Güvenlik denetimi olarak yalnızca işlev tanımındaki özellikleri hariç tutma üzerine güvenmemelisiniz.
- Real-World Etkiyi göz önünde bulundurun: Özellikle kod yürütme, veritabanlarını güncelleştirme veya bildirim gönderme gibi eylemleri tetikleyenler olmak üzere, yürütmeyi planladığınız işlev çağrılarının gerçek dünya üzerindeki etkisine dikkat edin.
- Kullanıcı Onayı Adımlarını Uygulama: Özellikle eylemde bulunan işlevler için, kullanıcının yürütmeden önce eylemi onayladığı bir adım eklemenizi öneririz.
DökümHane Modellerine yönelik sorumlu yapay zeka uygulamaları hakkında daha fazla bilgi edinmek için bkz. Sorumlu yapay zeka uygulamalarına genel bakış.
Önemli
Sohbet Tamamlamaları API'sinde functions ve function_call parametreleri kullanım dışıdır.
functions yerine tools parametresini kullanın ve tool_choice yerine function_call parametresini kullanın.
İşlev çağrısı desteği
Foundry Modelleri, Chat Completions API veya Responses API aracılığıyla fonksiyon çağrısını destekler. Destek modele, API'ye, dağıtım türüne ve model sürümüne göre değişir.
İşlev çağrısını destekleyen bir model bulmak için aşağıdaki katalogları gözden geçirin:
Model ayrıntılarında aşağıdaki özellikleri arayın:
- Kullanmayı planladığınız API'ye bağlı olarak Sohbet Tamamlama API'sini veya Yanıtlar API'sini kullanın.
- İşlevler veya araçlar, işlev çağırma desteği için.
- Uygulamanızın tek yanıtta birden çok işlev çağrısı istemek için modele ihtiyacı varsa paralel araç çağrısı.
Bu makalede, Sohbet Tamamlamaları API'siyle işlev çağrısının nasıl uygulandığı gösterilmektedir. Yanıtlar API'sinin istek ve yanıt biçimi için bkz. OpenAI Yanıtları API'sini Azure kullanma.
Not
tool_choice parametresi artık ve o3-miniile o1 desteklenmektedir. Daha fazla bilgi için neden modelleri kılavuzuna bakın.
Önemli
Araç ve işlev açıklamaları şu anda 1.024 karakterle sınırlıdır. Bu sınır değişirse bu makaleyi güncelleştireceğiz.
Sonraki adımlar
- Yanıtlar API'siyle çok aracılı düzenlemeyi kullanın.
- DökümHane Modelleri hakkında daha fazla bilgi edinin.
- İşlevlerle çalışma hakkında daha fazla örnek için OpenAI Örnekleri GitHub deposuna bakın.