OpenAI | Programování

OpenAI API může pomoci s ovládáním chytré domácnosti. Teď to ještě usnadní nová technika function calling

Chatovací API od OpenAI umí několik nových vychytávek. Tou hlavní je tzv. function calling, který by mohl usnadnit interpretaci výsledku ve strojově čitelném formátu.

Textovému generátoru GPT jednoduše společně s dotazem pošleme popis strojového protokolu v JSON, pomocí kterého má AI zkonstruovat odpověď.

Když chceme, aby chatbot odpovídal strojově

Dejme tomu, že si chceme pomocí OpenAI API vyrobit ovládání chytré domácnosti v přirozené češtině a chatbota použijeme jako sémantický dekodér, který povel v běžné řeči převede na strojovou instrukci. Té už porozumí třeba náš server ovládající světla v domě.

Takže když dáme GPT povel:

Nastav barvu LED proužku u televize na růžovou

Potřebujeme, aby odpověděl třeba v tomto formátu:

set_color(85698, 255, 105, 180)

První parametr představuje numerický identifikátor/adresu zařízení (LED proužku u televizoru), ty další pak patří červenému, zelenému a modrému kanálu RGB.

Chatbota jsme tímto způsobem mohli vycvičit odjakživa, bylo to ale potenciálně drahé. V případě OpenAI API se totiž platí za spotřebované tokeny (nejnižší informační jednotky o délce nejvýše několika znaků), které tvoří jak otázku, tak odpověď. Čím delší dotaz a čím delší odpověď, tím tedy také více propálených tokenů a vyšší cena.

Podívejte se na příklad sémanticky zkonstruovaného překladače ve webovém ChatGPT. Stejnou omáčku bychom mohli poslat i do OpenAI API:

5baa067a-cae7-42d6-9412-68660ef32f40
Funkční překladač povelu v přirozené češtině (třeba z hlasového vstupu) na strojovou instrukci pro server ovládající chytrou domácnost

Function calling s deklarací funkce

S využitím function callingu zapouzdřeného v JSON by mohl podobný dotaz na OpenAI API vypadat následovně. Předpokládejme použití standardního textového HTTP klientu cURL:

curl --location 'https://api.openai.com/v1/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer API-klíč' \
--data '{
  "model": "gpt-3.5-turbo-0613",
  "messages": [
    {"role": "user", "content": "Nastav světlo u televize na oranžovou"}
  ],
  "functions": [
    {
      "name": "set_color",
      "description": "Set RGB color of device in smart home",
      "parameters": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique ID of device in smart home",
            "enum": ["zahrada", "televizor", "postel", "pracovni_stul"]
          },
          "r": {
            "type": "integer",
            "description": "Red channel of RGB"
          },
          "g": {
            "type": "integer",
            "description": "Green channel of RGB"
          },
          "b": {
            "type": "integer",
            "description": "Blue channel of RGB"
          }
        },
        "required": ["id", "r", "g", "b"]
      }
    }
  ]
}'

Jen připomenu, že základní používání chatovacího API jsme si vyzkoušeli v samostatném článku. Všimněte si, že voláme model GPT 3.5 ve verzi z 13.6. (gpt-3.5-turbo-0613), která je už optimalizovaná pro function calling. V těle JSON s konfigurací dotazu nám zároveň přibyl klíč functions, který obsahuje pole funkcí, ve kterých může robot vrátit odpověď, pokud to uzná za vhodné.

My zde deklarovali jednu jedinou funkci s názvem set_color a s parametry id , r, g, b. Parametry jsou povinné a id má formát enum, takže může obsahovat výhradně některou z předepsaných hodnot.

Popis funkce v JSON, kterou chatbot může použít:

"functions": [
    {
      "name": "set_color",
      "description": "Set RGB color of device in smart home",
      "parameters": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique ID of device in smart home",
            "enum": ["zahrada", "televizor", "postel", "pracovni_stul"]
          },
          "r": {
            "type": "integer",
            "description": "Red channel of RGB"
          },
          "g": {
            "type": "integer",
            "description": "Green channel of RGB"
          },
          "b": {
            "type": "integer",
            "description": "Blue channel of RGB"
          }
        },
        "required": ["id", "r", "g", "b"]
      }
    }
  ]
}

Bohužel jsem z dokumentace nevyčetl, jak tímto způsobem provést překlad přezdívky lampy na numerický identifikátor – asi to v tuto chvíli není možné –, a tak bude překladač o něco jednodušší a místo numerického identifikátoru použije přezdívku zařízení.

Velmi důležitým prvkem je klíč Description, pomocí kterého chatbotovi sdělujeme význam každé z položek funkce.

Odpověď OpenAI API:

{
    "id": "chatcmpl-7RHZWWbIHSff98dkcMsNkofQjtsY3",
    "object": "chat.completion",
    "created": 1686736758,
    "model": "gpt-3.5-turbo-0613",
    "choices": [
        {
            "index": 0,
            "message": {
                "role": "assistant",
                "content": null,
                "function_call": {
                    "name": "set_color",
                    "arguments": "{\n  \"id\": \"televizor\",\n  \"r\": 255,\n  \"g\": 165,\n  \"b\": 0\n}"
                }
            },
            "finish_reason": "function_call"
        }
    ],
    "usage": {
        "prompt_tokens": 128,
        "completion_tokens": 39,
        "total_tokens": 167
    }
}

No, a to je celé. Jakmile nyní pošleme do API povel „Nastav světlo u televize na oranžovou,“ GPT-3.5 usoudí, že by měl v odpovědi použít deklaraci funkce set_color a dopočítá k ni parametry opět ve formátu JSON. Ten si už musíme zpracovat sami na ovládacím serveru chytré domácnosti.

4042054c-4ac0-40e1-b699-c7b8d6bcb8e6e08c99d4-e391-49b4-a6e9-77155c3b76ff
A ještě jednou v textovém HTTP klientu. Košatý dotaz a odpověď v JOSN s vyznačenou sekcí function_call

Z JSON v tomto konkrétním případě vytáhneme na povel Nastav světlo u televize na oranžovou informaci, že máme zavolat funkci set_color s parametry id=televizor, r=255, g=165, b=0

Méně propálených tokenů, ale méně tvárné

Oproti první variantě, kdy jsme vše robotovi vysvětlili v přirozené češtině, je tato cesta o něco málo levnější. V odpovědi totiž vidíme, že se celkově spotřebovalo 167 tokenů: 128 pro dotaz a 39 na odpověď. Dotaz v přirozené češtině by byl mnohem delší. Odpověď byla zároveň poměrně rychlá, nicméně to mohla být pouze náhoda.

V každém případě, OpenAI jde opět o trošku více naproti vývojářům a tímto krokem ještě více usnadní integraci AI do vlastních systémů pomocí vlastní komunikační specifikace.

Levnější modely a delší kontexty

OpenAI se nakonec na blogu chlubí také tím, že by mělo být používání modelu gpt-3.5-turbo díky dalším optimalizacím o 25 % levnější a 3.5 je zároveň k dispozici ve verzi s větším 16k kontextem (oproti základní 4k verzi).

Kontext představuje tokenovou hloubku, se kterou ještě dokáže AI pracovat. Velký kontext je klíčový třeba pro zpracovávání nějakého většího vstupního dokumentu aj. Naše ukázka je naopak maličká a vejde se do kontextu nejvýše v řádu stovek tokenů.

Diskuze (1) Další článek: Elona Muska zaujala exoplaneta Proxima Centauri b, na níž by se mohl vyskytovat život

Témata článku: , , ,