Práce s modely GPT-3.5-Turbo a GPT-4

Modely GPT-3.5-Turbo a GPT-4 jsou jazykové modely optimalizované pro konverzační rozhraní. Modely se chovají jinak než starší modely GPT-3. Předchozí modely byly textové a textové, což znamená, že přijali řetězec výzvy a vrátili dokončení pro připojení k příkazovému řádku. Modely GPT-3.5-Turbo a GPT-4 jsou však konverzační a zprávy ven. Modely očekávají vstup formátovaný v konkrétním formátu přepisu podobném chatu. Vrátí dokončení, které představuje modelem napsanou zprávu v chatu. Tento formát byl navržen speciálně pro více konverzací, ale může také fungovat dobře pro nechatové scénáře.

Tento článek vás provede zahájením práce s modely GPT-3.5-Turbo a GPT-4. Nejlepších výsledků dosáhnete pomocí zde popsaných technik. Nepokoušejte se pracovat s modely stejným způsobem jako se starší řadou modelů, protože modely jsou často podrobné a poskytují méně užitečné odpovědi.

Práce s modely GPT-3.5-Turbo a GPT-4

Následující fragment kódu ukazuje nejzásadnější způsob použití modelů GPT-3.5-Turbo a GPT-4 s rozhraním API pro dokončování chatu. Pokud tyto modely používáte programově poprvé, doporučujeme začít rychlým startem GPT-3.5-Turbo a GPT-4.

Poznámka:

V dokumentaci k Azure OpenAI odkazujeme na GPT-3.5-Turbo a GPT-35-Turbo zaměnitelně. Oficiální název modelu na OpenAI je gpt-3.5-turbo. V případě Azure OpenAI je kvůli omezením znaků specifických pro Azure název gpt-35-turbozákladního modelu .

import os
from openai import AzureOpenAI

client = AzureOpenAI(
  api_key = os.getenv("AZURE_OPENAI_API_KEY"),  
  api_version = "2024-02-01",
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
)

response = client.chat.completions.create(
    model="gpt-35-turbo", # model = "deployment_name".
    messages=[
        {"role": "system", "content": "Assistant is a large language model trained by OpenAI."},
        {"role": "user", "content": "Who were the founders of Microsoft?"}
    ]
)

#print(response)
print(response.model_dump_json(indent=2))
print(response.choices[0].message.content)
{
  "id": "chatcmpl-8GHoQAJ3zN2DJYqOFiVysrMQJfe1P",
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "message": {
        "content": "Microsoft was founded by Bill Gates and Paul Allen. They established the company on April 4, 1975. Bill Gates served as the CEO of Microsoft until 2000 and later as Chairman and Chief Software Architect until his retirement in 2008, while Paul Allen left the company in 1983 but remained on the board of directors until 2000.",
        "role": "assistant",
        "function_call": null
      },
      "content_filter_results": {
        "hate": {
          "filtered": false,
          "severity": "safe"
        },
        "self_harm": {
          "filtered": false,
          "severity": "safe"
        },
        "sexual": {
          "filtered": false,
          "severity": "safe"
        },
        "violence": {
          "filtered": false,
          "severity": "safe"
        }
      }
    }
  ],
  "created": 1698892410,
  "model": "gpt-35-turbo",
  "object": "chat.completion",
  "usage": {
    "completion_tokens": 73,
    "prompt_tokens": 29,
    "total_tokens": 102
  },
  "prompt_filter_results": [
    {
      "prompt_index": 0,
      "content_filter_results": {
        "hate": {
          "filtered": false,
          "severity": "safe"
        },
        "self_harm": {
          "filtered": false,
          "severity": "safe"
        },
        "sexual": {
          "filtered": false,
          "severity": "safe"
        },
        "violence": {
          "filtered": false,
          "severity": "safe"
        }
      }
    }
  ]
}
Microsoft was founded by Bill Gates and Paul Allen. They established the company on April 4, 1975. Bill Gates served as the CEO of Microsoft until 2000 and later as Chairman and Chief Software Architect until his retirement in 2008, while Paul Allen left the company in 1983 but remained on the board of directors until 2000.

Poznámka:

U nových modelů GPT-35-Turbo a GPT-4 nejsou k dispozici následující parametry: logprobs, best_ofa echo. Pokud nastavíte některý z těchto parametrů, zobrazí se chyba.

Každá odpověď zahrnuje finish_reason. Možné hodnoty pro finish_reason jsou:

  • stop: Rozhraní API vrátilo úplný výstup modelu.
  • délka: Neúplný výstup modelu z důvodu parametru max_tokens nebo limitu tokenu.
  • content_filter: Vynechaný obsah kvůli příznaku z našich filtrů obsahu.
  • null: Odpověď rozhraní API stále probíhá nebo je neúplná.

Zvažte nastavení max_tokens na mírně vyšší hodnotu než normální hodnota, například 300 nebo 500. Vyšší hodnota zajistí, že model nezastaví generování textu, než dosáhne konce zprávy.

Správa verzí modelů

Poznámka:

Verze gpt-35-turbo je ekvivalentní gpt-3.5-turbo modelu z OpenAI.

Na rozdíl od předchozích modelů gpt-35-turbo GPT-3 a GPT-3.5 se model a gpt-4gpt-4-32k modely budou i nadále aktualizovat. Při vytváření nasazení těchto modelů musíte také zadat verzi modelu.

Data vyřazení modelu pro tyto modely najdete na stránce modely .

Práce s rozhraním API pro dokončování chatu

OpenAI vytrénoval modely GPT-35-Turbo a GPT-4 tak, aby přijímal vstupy formátované jako konverzace. Parametr messages přebírá pole objektů zpráv s konverzací uspořádanou podle role. Pokud používáte rozhraní PYTHON API, použije se seznam slovníků.

Formát základního dokončování chatu je:

{"role": "system", "content": "Provide some context and/or instructions to the model"},
{"role": "user", "content": "The users messages goes here"}

Konverzace s jednou ukázkovou odpovědí následovanou otázkou by vypadala takto:

{"role": "system", "content": "Provide some context and/or instructions to the model."},
{"role": "user", "content": "Example question goes here."},
{"role": "assistant", "content": "Example answer goes here."},
{"role": "user", "content": "First question/message for the model to actually respond to."}

Systémová role

Role systému, označovaná také jako systémová zpráva, je zahrnuta na začátku pole. Tato zpráva obsahuje počáteční pokyny k modelu. V systémové roli můžete zadat různé informace, například:

  • Stručný popis asistenta.
  • Osobnostní vlastnosti asistenta.
  • Pokyny nebo pravidla, podle kterého má asistent postupovat.
  • Data nebo informace potřebné pro model, jako jsou relevantní otázky z nejčastějších dotazů.

Roli systému můžete přizpůsobit pro případ použití nebo zahrnout základní pokyny. Systémová role nebo zpráva je nepovinná, ale doporučujeme, abyste alespoň zahrnuli základní, abyste získali nejlepší výsledky.

Zprávy

Po roli systému můžete zahrnout řadu zpráv mezi a userassistant.

 {"role": "user", "content": "What is thermodynamics?"}

Pokud chcete aktivovat odpověď z modelu, ukončete zprávu uživatele, která indikuje, že se jedná o asistenta, který odpoví. Můžete také zahrnout řadu ukázkových zpráv mezi uživatelem a asistentem jako způsob, jak provést několik snímků učení.

Příklady výzvy ke zprávě

Následující část ukazuje příklady různých stylů výzev, které můžete použít s modely GPT-35-Turbo a GPT-4. Tyto příklady představují pouze výchozí bod. Můžete experimentovat s různými výzvami k přizpůsobení chování pro vlastní případy použití.

Základní příklad

Pokud chcete, aby se model GPT-35-Turbo choval podobně jako chat.openai.com, můžete použít základní systémovou zprávu, například Assistant is a large language model trained by OpenAI.

{"role": "system", "content": "Assistant is a large language model trained by OpenAI."},
{"role": "user", "content": "Who were the founders of Microsoft?"}

Příklad s pokyny

V některých scénářích můžete chtít modelu poskytnout další pokyny, abyste definovali mantinely pro to, co model dokáže udělat.

{"role": "system", "content": "Assistant is an intelligent chatbot designed to help users answer their tax related questions.
Instructions: 
- Only answer questions related to taxes. 
- If you're unsure of an answer, you can say "I don't know" or "I'm not sure" and recommend users go to the IRS website for more information. "},
{"role": "user", "content": "When are my taxes due?"}

Použití dat k uzemnění

Do systémové zprávy můžete také zahrnout relevantní data nebo informace, abyste modelu poskytli další kontext konverzace. Pokud potřebujete zahrnout jenom malé množství informací, můžete ho pevně naprogramovat v systémové zprávě. Pokud máte velké množství dat, o kterých by měl model vědět, můžete použít vkládání nebo produkt, jako je Azure AI Search , a načíst nejrelevavantnější informace v době dotazu.

{"role": "system", "content": "Assistant is an intelligent chatbot designed to help users answer technical questions about Azure OpenAI Serivce. Only answer questions using the context below and if you're not sure of an answer, you can say 'I don't know'.

Context:
- Azure OpenAI Service provides REST API access to OpenAI's powerful language models including the GPT-3, Codex and Embeddings model series.
- Azure OpenAI Service gives customers advanced language AI with OpenAI GPT-3, Codex, and DALL-E models with the security and enterprise promise of Azure. Azure OpenAI co-develops the APIs with OpenAI, ensuring compatibility and a smooth transition from one to the other.
- At Microsoft, we're committed to the advancement of AI driven by principles that put people first. Microsoft has made significant investments to help guard against abuse and unintended harm, which includes requiring applicants to show well-defined use cases, incorporating Microsoft’s principles for responsible AI use."
},
{"role": "user", "content": "What is Azure OpenAI Service?"}

Pár snímků učení s dokončením chatu

Modelu můžete také poskytnout několik příkladů. Přístup pro učení s několika snímky se mírně změnil kvůli novému formátu výzvy. Do výzvy teď můžete zahrnout řadu zpráv mezi uživatelem a asistentem, a to v několika příkladech. Pomocí těchto příkladů můžete zodpovědět běžné otázky k vytvoření modelu nebo k výuce konkrétního chování modelu.

Tento příklad ukazuje, jak můžete použít několik snímků učení s GPT-35-Turbo a GPT-4. Můžete experimentovat s různými přístupy a zjistit, co je pro váš případ použití nejvhodnější.

{"role": "system", "content": "Assistant is an intelligent chatbot designed to help users answer their tax related questions. "},
{"role": "user", "content": "When do I need to file my taxes by?"},
{"role": "assistant", "content": "In 2023, you will need to file your taxes by April 18th. The date falls after the usual April 15th deadline because April 15th falls on a Saturday in 2023. For more details, see https://www.irs.gov/filing/individuals/when-to-file."},
{"role": "user", "content": "How can I check the status of my tax refund?"},
{"role": "assistant", "content": "You can check the status of your tax refund by visiting https://www.irs.gov/refunds"}

Použití dokončování chatu pro nechatové scénáře

Rozhraní API pro dokončování chatu je navržené tak, aby fungovalo s více konverzacemi, ale funguje dobře i pro nechatové scénáře.

Například pro scénář extrakce entit můžete použít následující výzvu:

{"role": "system", "content": "You are an assistant designed to extract entities from text. Users will paste in a string of text and you will respond with entities you've extracted from the text as a JSON object. Here's an example of your output format:
{
   "name": "",
   "company": "",
   "phone_number": ""
}"},
{"role": "user", "content": "Hello. My name is Robert Smith. I'm calling from Contoso Insurance, Delaware. My colleague mentioned that you are interested in learning about our comprehensive benefits policy. Could you give me a call back at (555) 346-9322 when you get a chance so we can go over the benefits?"}

Vytvoření základní smyčky konverzace

Zatím se v příkladech zobrazuje základní mechanika interakce s rozhraním API pro dokončování chatu. Tento příklad ukazuje, jak vytvořit smyčku konverzace, která provádí následující akce:

  • Nepřetržitě přebírá vstup konzoly a správně ho formátuje jako součást seznamu zpráv jako obsah role uživatele.
  • Výstupy odpovědí, které se vytisknou do konzoly a naformátují a přidají do seznamu zpráv jako obsah role asistenta.

Pokaždé, když se položí nová otázka, se spolu s nejnovější otázkou odešle průběžný přepis konverzace. Vzhledem k tomu, že model nemá paměť, musíte odeslat aktualizovaný přepis s každou novou otázkou nebo model ztratí kontext předchozích otázek a odpovědí.

import os
from openai import AzureOpenAI

client = AzureOpenAI(
  api_key = os.getenv("AZURE_OPENAI_API_KEY"),  
  api_version = "2024-02-01",
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")  # Your Azure OpenAI resource's endpoint value.
)

conversation=[{"role": "system", "content": "You are a helpful assistant."}]

while True:
    user_input = input("Q:")      
    conversation.append({"role": "user", "content": user_input})

    response = client.chat.completions.create(
        model="gpt-35-turbo", # model = "deployment_name".
        messages=conversation
    )

    conversation.append({"role": "assistant", "content": response.choices[0].message.content})
    print("\n" + response.choices[0].message.content + "\n")

Když spustíte předchozí kód, zobrazí se prázdné okno konzoly. Do okna zadejte svou první otázku a pak klíč vyberte Enter . Po vrácení odpovědi můžete proces zopakovat a pokládat otázky.

Správa konverzací

Předchozí příklad se spustí, dokud nedosáhnete limitu tokenu modelu. S každou otázkou a přijatou messages odpovědí se seznam rozrůstá. Limit tokenu je gpt-35-turbo 4 096 tokenů. Limity tokenů pro gpt-4 a gpt-4-32k jsou 8 192 a 32 768. Mezi tato omezení patří počet tokenů ze seznamu zpráv odeslaných i odpovědí modelu. Počet tokenů v seznamu zpráv v kombinaci s hodnotou parametru max_tokens musí zůstat pod těmito limity nebo se zobrazí chyba.

Je vaší zodpovědností zajistit, aby výzva a dokončení spadají do limitu tokenu. U delších konverzací je potřeba sledovat počet tokenů a odeslat model pouze výzvu, která spadá do limitu.

Poznámka:

Důrazně doporučujeme zůstat v rámci zdokumentovaného vstupního limitu tokenu pro všechny modely, i když zjistíte, že tento limit můžete překročit.

Následující ukázka kódu ukazuje jednoduchý příklad smyčky chatu s technikou pro zpracování počtu 4 096 tokenů pomocí knihovny tiktoken openAI.

Kód používá tiktoken 0.5.1. Pokud máte starší verzi, spusťte pip install tiktoken --upgradepříkaz .

import tiktoken
import os
from openai import AzureOpenAI

client = AzureOpenAI(
  api_key = os.getenv("AZURE_OPENAI_API_KEY"),  
  api_version = "2024-02-01",
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")  # Your Azure OpenAI resource's endpoint value.
)

system_message = {"role": "system", "content": "You are a helpful assistant."}
max_response_tokens = 250
token_limit = 4096
conversation = []
conversation.append(system_message)

def num_tokens_from_messages(messages, model="gpt-3.5-turbo-0613"):
    """Return the number of tokens used by a list of messages."""
    try:
        encoding = tiktoken.encoding_for_model(model)
    except KeyError:
        print("Warning: model not found. Using cl100k_base encoding.")
        encoding = tiktoken.get_encoding("cl100k_base")
    if model in {
        "gpt-3.5-turbo-0613",
        "gpt-3.5-turbo-16k-0613",
        "gpt-4-0314",
        "gpt-4-32k-0314",
        "gpt-4-0613",
        "gpt-4-32k-0613",
        }:
        tokens_per_message = 3
        tokens_per_name = 1
    elif model == "gpt-3.5-turbo-0301":
        tokens_per_message = 4  # every message follows <|start|>{role/name}\n{content}<|end|>\n
        tokens_per_name = -1  # if there's a name, the role is omitted
    elif "gpt-3.5-turbo" in model:
        print("Warning: gpt-3.5-turbo may update over time. Returning num tokens assuming gpt-3.5-turbo-0613.")
        return num_tokens_from_messages(messages, model="gpt-3.5-turbo-0613")
    elif "gpt-4" in model:
        print("Warning: gpt-4 may update over time. Returning num tokens assuming gpt-4-0613.")
        return num_tokens_from_messages(messages, model="gpt-4-0613")
    else:
        raise NotImplementedError(
            f"""num_tokens_from_messages() is not implemented for model {model}."""
        )
    num_tokens = 0
    for message in messages:
        num_tokens += tokens_per_message
        for key, value in message.items():
            num_tokens += len(encoding.encode(value))
            if key == "name":
                num_tokens += tokens_per_name
    num_tokens += 3  # every reply is primed with <|start|>assistant<|message|>
    return num_tokens
while True:
    user_input = input("Q:")      
    conversation.append({"role": "user", "content": user_input})
    conv_history_tokens = num_tokens_from_messages(conversation)

    while conv_history_tokens + max_response_tokens >= token_limit:
        del conversation[1] 
        conv_history_tokens = num_tokens_from_messages(conversation)

    response = client.chat.completions.create(
        model="gpt-35-turbo", # model = "deployment_name".
        messages=conversation,
        temperature=0.7,
        max_tokens=max_response_tokens
    )


    conversation.append({"role": "assistant", "content": response.choices[0].message.content})
    print("\n" + response.choices[0].message.content + "\n")

V tomto příkladu se po dosažení počtu tokenů odeberou nejstarší zprávy v přepisu konverzace. Pro efektivitu delpop()se používá místo . Začneme indexem 1, abychom vždy zachovali systémovou zprávu a odebrali pouze zprávy uživatele nebo asistenta. V průběhu času může tato metoda správy konverzace způsobit snížení kvality konverzace, protože model postupně ztratí kontext dřívějších částí konverzace.

Alternativním přístupem je omezit dobu trvání konverzace na maximální délku tokenu nebo určitý počet otočení. Po dosažení maximálního limitu tokenu by model ztratil kontext, pokud byste konverzaci umožnili pokračovat. Můžete vyzvat uživatele, aby zahájil novou konverzaci a vymazat seznam zpráv, aby zahájil novou konverzaci s dostupným limitem úplného tokenu.

Část kódu pro počítání tokenů, která byla ukázaná dříve, je zjednodušená verze jednoho z příkladů kuchařů OpenAI.

Řešení problému

Tady je tip pro řešení potíží.

Nepoužívejte syntaxi ChatML ani speciální tokeny s koncovým bodem dokončení chatu.

Někteří zákazníci se pokusí použít starší syntaxi ChatML s koncovými body dokončení chatu a novějšími modely. ChatML byl funkce preview, která fungovala pouze s koncovým bodem starších dokončení s modelem gpt-35-turbo verze 0301. Tento model je určený pro vyřazení. Pokud se pokusíte použít syntaxi ChatML s novějšími modely a koncovým bodem dokončení chatu, může to vést k chybám a neočekávanému chování odpovědi modelu. Toto použití nedoporučujeme. K tomuto problému může dojít při použití běžných speciálních tokenů.

Kód chyby Chybová zpráva Řešení
400 400 – Nepodařilo se vygenerovat výstup kvůli speciálním tokenům ve vstupu. Výzva obsahuje speciální tokeny nebo starší tokeny ChatML, které model nebo koncový bod nerozpoznal nebo nepodporuje. Ujistěte se, že pole výzvy nebo zprávy neobsahuje žádné starší tokeny Nebo speciální tokeny ChatML. Pokud upgradujete ze starší verze modelu, před odesláním požadavku rozhraní API do modelu vyloučíte všechny speciální tokeny.

Nepodařilo se vytvořit dokončení, protože model vygeneroval neplatný výstup unicode.

Kód chyby Chybová zpráva Alternativní řešení
500 500 – InternalServerError: Kód chyby: 500 – {'error': {'message': 'Failed to create completion as the model generated invalid Unicode output}}. Výskyt těchto chyb můžete minimalizovat snížením teploty výzev na méně než 1 a zajištěním, že používáte klienta s logikou opakování. Opětovné nahrazování požadavku často vede k úspěšné odpovědi.

Další kroky