1. Wprowadzenie do Wywoływania Funkcji

W modelu GPT, Wywoływanie Funkcji odnosi się do dostarczania opisowych funkcji do modelu poprzez interfejs API, pozwalając mu inteligentnie wybrać i wygenerować obiekt JSON zawierający parametry do wywołania jednej lub kilku funkcji. Ważne jest zauważenie, że interfejs API do uzupełniania rozmów nie wykonuje bezpośrednio wywołań funkcji, lecz generuje JSON, który może być użyty do wykonania funkcji w kodzie.

W prostych słowach, funkcja Wywoływania Funkcji polega na dostarczeniu zestawu definicji funkcji (włącznie z opisami funkcji i parametrów) do modelu GPT. Model następnie decyduje, która funkcja wywołać na podstawie zapytania użytkownika. Ponieważ model nie może wykonywać zewnętrznych funkcji, może jedynie odpowiedzieć prośbą o wywołanie funkcji (włączając parametry wywołania funkcji). Po otrzymaniu wyniku prośby modelu, nasz program wykonuje wywołanie funkcji lokalnie. Wynik wywołania funkcji jest następnie skonkatenowany z zachętą i ponownie wysłany do modelu do dalszej obróbki przed zwróceniem ostatecznego wyniku użytkownikowi.

2. Praktyczne Zastosowania Wywoływania Funkcji

Poniżej przedstawiono kilka przykładowych zastosowań praktycznych:

  • Tworzenie asystenta do odpowiadania na pytania poprzez wywoływanie zewnętrznych interfejsów API, takich jak definiowanie funkcji takich jak send_email(to: string, body: string) lub get_current_weather(location: string, unit: 'celsius' | 'fahrenheit').
  • Konwersja języka naturalnego na wywołania interfejsów API, na przykład tłumaczenie "Którzy klienci są moimi najlepszymi klientami?" na get_customers(min_revenue: int, created_before: string, limit: int) a następnie wykonanie wewnętrznego wywołania interfejsu API.
  • Pobieranie strukturalnych danych z tekstu, na przykład definiowanie funkcji takich jak extract_data(name: string, birthday: string) lub sql_query(query: string).

Wykorzystując funkcję Wywoływania Funkcji, możemy implementować agentów sztucznej inteligencji, które współdziałają z naszymi lokalnymi systemami i bazami danych, na przykład mogą sprawdzać pogodę, sprawdzać ceny akcji, zamawiać jedzenie na wynos lub rezerwować loty.

3. Modele Obsługujące Wywoływanie Funkcji

Nie wszystkie wersje modelu zostały przeszkolone na danych dotyczących wywoływania funkcji. Obecnie modele obsługujące wywoływanie funkcji to: gpt-4, gpt-4-turbo-preview, gpt-4-0125-preview, gpt-4-1106-preview, gpt-4-0613, gpt-3.5-turbo, gpt-3.5-turbo-1106 oraz gpt-3.5-turbo-0613.

Co więcej, modele gpt-4-turbo-preview, gpt-4-0125-preview, gpt-4-1106-preview oraz gpt-3.5-turbo-1106 obsługują równoległe wywoływanie funkcji, pozwalając na wykonanie wielu wywołań funkcji jednocześnie oraz obsługę tych wywołań równolegle, co przynosi skuteczne i efektywne rezultaty.

Uwaga: Potencjalnym ryzykiem związanym z funkcją Wywoływania Funkcji może być występowanie błędnych parametrów modelu (tj. parametrów fantomowych). Dlatego zanim podejmie się jakiekolwiek działania mające wpływ na rzeczywisty świat (takie jak wysyłanie e-maili, publikacja online, dokonywanie zakupów, itp.), zaleca się włączenie procesu potwierdzenia użytkownika na poziomie produktu, zapewniając wykonanie funkcji dopiero po potwierdzeniu użytkownika.

4. Przykłady Wywoływania Funkcji

4.1 Przykład w języku Python

Implementacja Wywoływania Funkcji na platformie OpenAI zazwyczaj przebiega zgodnie z podstawowymi krokami, opisanymi poniżej. Poniżej znajdziesz szczegółowy proces przy użyciu przykładu kodu w języku Python, skupiający się na zapytaniu o pogodę.

Krok 1: Przygotowanie wywoływalnych funkcji oraz definicji funkcji dla modelu

Najpierw musimy zdefiniować funkcję, która może być wywołana przez model GPT. Zazwyczaj oznacza to przygotowanie naszej własnej funkcji, która może wykonywać określone operacje na podstawie parametrów wejściowych, na przykład komunikowanie się z zewnętrznym interfejsem API.

import json

def get_current_weather(location, unit="fahrenheit"):
    return json.dumps({
        "location": location,
        "temperature": "18",
        "unit": unit
    })

Krok 2: Wywołanie modelu na podstawie parametru zapytania i narzędzi

Następnie musimy wywołać model GPT za pomocą interfejsu API do uzupełniania rozmów i przekazać zapytanie użytkownika (np. "Jaka jest obecna pogoda") oraz parametr tools, który zawiera opis funkcji get_current_weather, którą właśnie zdefiniowaliśmy.

from openai import OpenAI

klient = OpenAI()

narzedzia = [{
    "type": "function",
    "function": {
        "name": "get_current_weather",
        "description": "Pobierz obecną pogodę dla określonej lokalizacji",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "Nazwa miasta, na przykład: 'San Francisco, CA'"
                },
                "unit": {
                    "type": "string",
                    "enum": ["celsius", "fahrenheit"]
                }
            },
            "required": ["location"]
        }
    }
}]

odpowiedz = klient.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": "Jaka jest obecna pogoda w San Francisco?"}],
    tools=narzedzia
)

Krok 3: Wykonaj funkcję lokalnie

Wynik zwrócony przez model będzie zawierał informacje o funkcji, którą model chce wywołać, zazwyczaj zawarte w parametrze odpowiedzi tool_calls. Następnie możemy lokalnie wywołać odpowiadającą funkcję na podstawie informacji o wywołaniu funkcji opisanej w parametrze tool_calls.

tool_calls = odpowiedz.choices[0].message.tool_calls

if tool_calls:
    arguments = json.loads(tool_calls[0].function.arguments)
    weather_info = get_current_weather(**arguments)
    print(weather_info) # Tutaj możemy zobaczyć informacje o pogodzie zapytanej przez wywołanie funkcji

Krok 4: Ponowne wywołanie modelu z wynikiem zwróconym przez funkcję

Teraz możemy wysłać wynik zwrócony przez funkcję jako nową wiadomość do modelu, aby model mógł przetworzyć te wyniki i wygenerować odpowiedź dostosowaną do użytkownika.

follow_up_response = klient.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": "Jaka jest obecna pogoda w San Francisco?"},
        {"role": "function", "name": "get_current_weather", "content": weather_info}
    ],
    tools=narzedzia
)

Wyjaśnienie: W powyższym przykładzie zawartość zwrócona przez funkcję jest przekazywana do modelu GPT za pomocą wiadomości funkcji jak poniżej:

{"role": "function", "name": "get_current_weather", "content": weather_info}

W praktyce można również po prostu umieścić zawartość zwróconą przez funkcję jako treść odniesienia w wiadomości systemowej, aby AI mogło się do niej odwoływać, odpowiadając na pytania.

Krok 5: Uzyskaj ostateczną odpowiedź od modelu

W końcu możemy pobrać ostateczną odpowiedź modelu i przekazać ją użytkownikowi. W tym kroku model wygeneruje przystępną dla użytkownika odpowiedź na podstawie informacji o pogodzie, które dostarczyliśmy.

final_output = follow_up_response.choices[0].message.content
print(final_output) # Ta odpowiedź to informacje o pogodzie, które chcemy pokazać użytkownikowi

Po wykonaniu powyższych kroków, ukończyliśmy pełny przykład zapytania o pogodę przy użyciu modelu GPT i wywołań funkcji.

4.2.1 Znaczenie pól parametru "Narzędzia"

Podczas wywoływania funkcji należy zdefiniować odpowiednie informacje funkcji w parametrze tools. Parametr tools jest tablicą zawierającą wiele definicji funkcji, a każda definicja funkcji zawiera następujące pola:

  1. type: To pole reprezentuje typ narzędzia. Podczas wywoływania funkcji to pole powinno być ustawione na "function".
  2. function: To pole zawiera szczegółowe informacje na temat funkcji i jest obiektem z następującymi konkretnymi polami:
    • name: Nazwa funkcji, która jest ciągiem znaków.
    • description: Opis celu funkcji, który może pomóc modelowi generować parametry odpowiadające oczekiwaniom użytkownika.
    • parameters: Opisuje definicje parametrów funkcji i jest obiektem zawierającym następujące pod-pola:
      • type: Definiuje typ parametru, który powinien być głównie ustawiony na "object".
      • properties: Konkretne definicje każdego parametru funkcji, gdzie każda definicja parametru jest zazwyczaj obiektem zawierającym następujące pod-pola:
        • type: Typ danych parametru (takie jak "string", "integer", "boolean", itp.).
        • description: Opis parametru pomagający modelowi zrozumieć jego cel.
        • enum (opcjonalne): Gdy type ma wartość "string", pole enum może określić tablicę ciągów reprezentujących zbiór prawidłowych wartości.
      • required: Tablica ciągów zawierająca nazwy wymaganych parametrów.

4.2.2 Przykłady Definicji Narzędzi

Teraz przedstawimy kilka przykładów definicji narzędzi, które pomogą zrozumieć, jak używane są poszczególne pola.

Przykład 1: Pobierz Aktualne Informacje Pogodowe

{
    "type": "function",
    "function": {
        "name": "get_current_weather",
        "description": "Pobierz bieżące informacje pogodowe dla określonej lokalizacji",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "Miasto, dla którego ma zostać sprawdzona pogoda, np. 'San Francisco, CA'"
                },
                "unit": {
                    "type": "string",
                    "enum": ["celsius", "fahrenheit"],
                    "description": "Jednostka temperatury, 'celsius' dla stopni Celsjusza, 'fahrenheit' dla stopni Fahrenheita"
                }
            },
            "required": ["location", "unit"]
        }
    }
}

W powyższym przykładzie zdefiniowaliśmy funkcję o nazwie get_current_weather, która służy do pobrania aktualnej pogody z określonej lokalizacji. Parametry obejmują location i unit, gdzie unit ma dwie prawidłowe wartości: "celsius" (Celsjusz) i "fahrenheit" (Fahrenheit).

Przykład 2: Znajdź Albumy Dla Konkretnego Artysty

{
    "type": "function",
    "function": {
        "name": "find_artist_albums",
        "description": "Znajdź wszystkie albumy dla określonego artysty",
        "parameters": {
            "type": "object",
            "properties": {
                "artist_name": {
                    "type": "string",
                    "description": "Nazwa artysty"
                }
            },
            "required": ["artist_name"]
        }
    }
}

W tym przykładzie stworzyliśmy funkcję o nazwie find_artist_albums, służącą do znalezienia wszystkich albumów dla konkretnego artysty. Ta funkcja wymaga tylko jednego parametru: artist_name (nazwa artysty).

4.3. Przykład Wywołania Funkcji przez Żądanie HTTP

OpenAI udostępnia interfejs API, który jest dostępny za pomocą protokołu HTTP. Poniżej wyjaśnimy, jak korzystać z funkcji wywołania poprzez interfejs API HTTP. Programiści innych języków programowania mogą sięgnąć po ten przykład.

4.3.1. Krok 1: Wywołanie Modelu z zapytaniem Użytkownika i Deklaracją Funkcji

Najpierw musimy przesłać zapytanie użytkownika oraz listę obsługiwanych funkcji do modelu GPT, aby model mógł automatycznie zanalizować, jaką funkcję wywołać, aby odpowiedzieć na zapytanie użytkownika na podstawie pytania użytkownika.

W poniższym przykładzie informujemy GPT, że mamy funkcję get_current_weather, która może być użyta do zapytania informacji o pogodzie dla określonego miasta.

curl --location 'https://api.aiproxy.io/v1/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {OPENAI_KEY}' \
--data '{
    "model": "gpt-3.5-turbo",
    "messages": [
        {
            "role": "user",
            "content": "Jaka jest dzisiaj pogoda w Szanghaju?"
        }
    ],
    "tools": [
        {
            "type": "function",
            "function": {
                "name": "get_current_weather",
                "description": "Pobierz informacje o bieżącej pogodzie dla określonej lokalizacji",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "location": {
                            "type": "string",
                            "description": "Miasto, dla którego ma zostać sprawdzona pogoda, np. 'San Francisco, CA'"
                        },
                        "unit": {
                            "type": "string",
                            "enum": [
                                "celsius",
                                "fahrenheit"
                            ],
                            "description": "Jednostka temperatury, 'celsius' dla stopni Celsjusza, 'fahrenheit' dla stopni Fahrenheita"
                        }
                    },
                    "required": [
                        "location",
                        "unit"
                    ]
                }
            }
        }
    ]
}'

Wyjaśnienie parametrów żądania:

{
    "model": "gpt-3.5-turbo", // Model GPT do wywołania
    "messages": [ // Lista wiadomości dla GPT, w tym zapytanie użytkownika
        {
            "role": "user",
            "content": "Jaka jest dzisiaj pogoda w Szanghaju?"
        }
    ],
    "tools": [
	  // To jest definicja Twojej funkcji, informująca GPT o dostępnych funkcjach
    ]
}

Zobacz sekcję 4.2.2 w celu uzyskania definicji parametru tools.

Podczas normalnej obróbki przez model GPT otrzymasz odpowiedź na API podobną do poniższej:

{
    "model": "gpt-3.5-turbo-0613",
    "object": "chat.completion",
    "usage": {
        "prompt_tokens": 122,
        "completion_tokens": 27,
        "total_tokens": 149
    },
    "id": "chatcmpl-8mL4hS4zNMocyR2ajKyAvSTcbNaao",
    "created": 1706531447,
    "choices": [
        {
            "index": 0,
            "delta": null,
            "message": {
                "role": "assistant",
                "tool_calls": [ // Parametr tool_calls reprezentuje listę funkcji, które GPT chce wywołać
                    {
                        "id": "call_1iF09ttX1R9ESR18Ul2nLe1R",
                        "type": "function",
                        "function": {
                            "name": "get_current_weather",  // Wskazuje na to, że GPT chce odpowiedzieć na zapytanie użytkownika, wywołując funkcję get_current_weather
                            "arguments": "{\n  \"location\": \"Szanghaj, Chiny\",\n  \"unit\": \"celsius\"\n}" // To są parametry wejściowe wywołania funkcji get_current_weather
                        }
                    }
                ]
            },
            "finish_reason": "tool_calls"
        }
    ]
}

4.3.2. Krok 2: Lokalne Wywołanie Funkcji

Ponieważ model GPT sam nie może wykonywać określonych wywołań funkcji i tylko informuje nas, którą funkcję chce wywołać, nasz lokalny program musi wykonać konkretny wywołanie funkcji na podstawie parametru tool_calls zwróconego przez model. Sposób wykonywania lokalnych funkcji różni się w różnych językach programowania. Na przykład w Pythonie można odnieść się do wcześniej wspomnianego fragmentu.

4.3.3. Krok 3: Ponowne Wywołanie Modelu z Wynikiem Zwróconym Przez Funkcję

Ponieważ wywołanie funkcji odbywa się lokalnie, musimy przekazać wynik wykonania funkcji oraz pytanie użytkownika z powrotem do modelu GPT, aby uzyskać ostateczną odpowiedź.

curl --location 'https://api.aiproxy.io/v1/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer sk-Roc5MX1zEuVxiuaMaETV6wZ2jXcCehjUCzwP9AcNErUiwppQ' \
--data '{
    "model": "gpt-3.5-turbo",
    "messages": [
        {
            "role": "user",
            "content": "Jaka jest dzisiaj pogoda w Szanghaju?"
        },
        {
            "role": "function",
            "name": "get_current_weather",
            "content": "{\"city\":\"Shanghai\", \"temperature\":\"25 stopni Celsjusza\"}"
        }
    ],
    "tools": [
        {
            "type": "function",
            "function": {
                "name": "get_current_weather",
                "description": "Pobiera informacje o bieżącej pogodzie dla określonego miejsca",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "location": {
                            "type": "string",
                            "description": "Miasto, dla którego chcesz sprawdzić pogodę, np. 'San Francisco, CA'"
                        },
                        "unit": {
                            "type": "string",
                            "enum": [
                                "celsius",
                                "fahrenheit"
                            ],
                            "description": "Jednostka temperatury, 'celsius' dla stopni Celsjusza, 'fahrenheit' dla stopni Fahrenheita"
                        }
                    },
                    "required": [
                        "location",
                        "unit"
                    ]
                }
            }
        }
    ]
}'

Uwaga: Powyższy żądanie zawiera dodatkową wiadomość funkcji informującą model GPT o wartości zwróconej przez funkcję. GPT udzieli bezpośredniej odpowiedzi na pytanie użytkownika na podstawie informacji zwróconych przez funkcję i nie będzie ponownie wywoływał funkcji.

Wiadomość funkcji reprezentuje wartość zwróconą przez funkcję i ma poniższy format:

{
    "role": "function", // Typ wiadomości to funkcja, informuje GPT, że bieżąca wiadomość jest wartością zwróconą przez funkcję get_current_weather
    "name": "get_current_weather", // Informuje GPT, że bieżąca wiadomość jest wartością zwróconą przez funkcję get_current_weather
    "content": "{\"city\":\"Shanghai\", \"temperature\":\"25 stopni Celsjusza\"}" // Zawartość zwracana przez funkcję, może być w formacie JSON lub inną treścią tekstową.
}

Poniżej znajduje się ostateczna odpowiedź wygenerowana przez GPT:

{
    "model": "gpt-3.5-turbo-0613",
    "object": "chat.completion",
    "usage": {
        "prompt_tokens": 144,
        "completion_tokens": 17,
        "total_tokens": 161
    },
    "id": "chatcmpl-8mLmvvKAjSql7rGF8fvQeddKhWYvr",
    "created": 1706534189,
    "choices": [
        {
            "index": 0,
            "delta": null,
            "message": {
                "role": "assistant",
                "content": "Dzisiaj w Szanghaju jest 25 stopni Celsjusza."
            },
            "finish_reason": "stop"
        }
    ]
}