Тип принудительной функции с вызовом функций OpenAI при ожидании нескольких вызовов функций?

Вопрос или проблема

Параметр 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.

Шаги для достижения цели:

  1. Удаление параметра tool_choice: Параметр tool_choice ограничивает возвращаемые данные одним выбором функции. Чтобы обеспечить возможность возвращения нескольких вызовов функций, вам нужно этот параметр убрать.

  2. Подготовка сообщения: Убедитесь, что ваши сообщения содержат достаточную контекстуальную информацию для модели, чтобы она могла определить, что необходимо выполнить несколько вызовов.

  3. Обработка ответа: Когда вы уберете 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 теперь может возвращать несколько вызовов функции, что даст вам возможность запрашивать различные данные одновременно. Убедитесь, что ваша система способна корректно обрабатывать несколько ответов от функции в дальнейшем.

Оцените материал
Добавить комментарий

Капча загружается...