Вопрос или проблема
Параметр tool_choice
похоже заставляет API завершения чата возвращать только один вызов инструмента, даже если запрашиваются несколько. Есть ли способ заставить API использовать определенный тип функции и позволить возвращать несколько типов?
import os
import openai
from dotenv import load_dotenv
from openai import NOT_GIVEN, AzureOpenAI
load_dotenv()
azure_endpoint = os.environ["OAI-GPT4O-mini-18072024-ENDPOINT"]
api_key = os.environ["OAI-GPT4O-mini-18072024-API-KEY"]
model = "m-gpt-4o-mini-18072024"
api_version = os.getenv("OAI-GPT4O-API-VERSION", "2024-08-01-preview")
client = AzureOpenAI(
azure_endpoint=azure_endpoint,
api_key=api_key,
api_version=api_version,
)
tools = [
{
"type": "function",
"function": {
"name": "GetWeather",
"parameters": {
"$defs": {
"TemperatureUnit": {
"enum": ["celsius", "fahrenheit"],
"title": "TemperatureUnit",
"type": "string",
}
},
"properties": {
"location": {
"description": "Местоположение, для которого нужно получить погоду",
"title": "Местоположение",
"type": "string",
},
"unit": {
"description": "Единица измерения температуры",
"enum": ["celsius", "fahrenheit"],
"title": "TemperatureUnit",
"type": "string",
},
},
"required": ["location", "unit"],
"title": "GetWeather",
"type": "object",
"additionalProperties": False,
},
},
}
]
tool_choice = {"type": "function", "function": {"name": "GetWeather"}}
messages = [
{"role": "system", "content": "Извлеките информацию о погоде."},
{"role": "user", "content": "Какая погода в Лондоне и Нью-Йорке?"},
]
response = client.chat.completions.create(
model=model,
messages=messages,
tools=tools,
temperature=0,
tool_choice=tool_choice,
)
response.choices[0].message.tool_calls
# длина 1, только 1 вызов инструмента
# [ChatCompletionMessageToolCall(id='call_CmmBX8Oe1MutDUBLv6Xr59wW', function=Function(arguments="{"location":"London","unit":"celsius"}", name="GetWeather"), type="function")]
response = client.chat.completions.create(
model=model,
messages=messages,
tools=tools,
temperature=0,
)
response.choices[0].message.tool_calls
# длина 2
# [ChatCompletionMessageToolCall(id='call_DusKoDRUHJexQ03igKk5q2nw', function=Function(arguments="{"location": "London", "unit": "celsius"}", name="GetWeather"), type="function"),
# ChatCompletionMessageToolCall(id='call_bdeoRaWtsuDZkN1g1Vrj2KXj', function=Function(arguments="{"location": "New York", "unit": "fahrenheit"}", name="GetWeather"), type="function")]
Ответ или решение
Для решения проблемы с использованием многократных вызовов функций в API OpenAI с вызовом функций, необходимо учитывать несколько факторов. Основной момент заключается в том, что параметр tool_choice
ограничивает ответ API до одного вызова функции, даже если вы ожидаете несколько. Однако, вы можете добиться желаемого результата, установив функцию для обработки нескольких вызовов, а затем напрямую вызывая API без указания параметра tool_choice
.
Шаги для достижения цели:
-
Удаление параметра
tool_choice
: Параметрtool_choice
ограничивает возвращаемые данные одним выбором функции. Чтобы обеспечить возможность возвращения нескольких вызовов функций, вам нужно этот параметр убрать. -
Подготовка сообщения: Убедитесь, что ваши сообщения содержат достаточную контекстуальную информацию для модели, чтобы она могла определить, что необходимо выполнить несколько вызовов.
-
Обработка ответа: Когда вы уберете
tool_choice
, модель сможет вернуть все вызовы функций, которые она считает необходимыми.
Пример кода:
Вот как ваш код будет выглядеть с учетом этих изменений:
import os
import openai
from dotenv import load_dotenv
from openai import NOT_GIVEN, AzureOpenAI
load_dotenv()
azure_endpoint = os.environ["OAI-GPT4O-mini-18072024-ENDPOINT"]
api_key = os.environ["OAI-GPT4O-mini-18072024-API-KEY"]
model = "m-gpt-4o-mini-18072024"
api_version = os.getenv("OAI-GPT4O-API-VERSION", "2024-08-01-preview")
client = AzureOpenAI(
azure_endpoint=azure_endpoint,
api_key=api_key,
api_version=api_version,
)
tools = [
{
"type": "function",
"function": {
"name": "GetWeather",
"parameters": {
"$defs": {
"TemperatureUnit": {
"enum": ["celsius", "fahrenheit"],
"title": "TemperatureUnit",
"type": "string",
}
},
"properties": {
"location": {
"description": "Укажите местоположение для получения прогноза погоды",
"title": "Местоположение",
"type": "string",
},
"unit": {
"description": "Единица измерения температуры",
"enum": ["celsius", "fahrenheit"],
"title": "TemperatureUnit",
"type": "string",
},
},
"required": ["location", "unit"],
"title": "GetWeather",
"type": "object",
"additionalProperties": False,
},
},
}
]
messages = [
{"role": "system", "content": "Извлеките информацию о погоде."},
{"role": "user", "content": "Какая погода в Лондоне и Нью-Йорке?"}
]
# Убираем параметр tool_choice для возможности мультивызовов
response = client.chat.completions.create(
model=model,
messages=messages,
tools=tools,
temperature=0,
)
# Обработка ответа
tool_calls = response.choices[0].message.tool_calls
print(f"Количество вызовов функций: {len(tool_calls)}")
for call in tool_calls:
print(call)
Выводы:
С помощью вышеуказанных изменений, API теперь может возвращать несколько вызовов функции, что даст вам возможность запрашивать различные данные одновременно. Убедитесь, что ваша система способна корректно обрабатывать несколько ответов от функции в дальнейшем.