Share via


A GPT-3.5-Turbo és a GPT-4 modellek kezelése

A GPT-3.5-Turbo és GPT-4 modellek olyan nyelvi modellek, amelyek beszélgetési felületekre vannak optimalizálva. A modellek másképp viselkednek, mint a régebbi GPT-3 modellek. A korábbi modellek szövegbeviteli és szövegkiírási modellek voltak, ami azt jelenti, hogy elfogadtak egy parancssori sztringet, és visszaadtak egy befejezést a kéréshez való hozzáfűzéshez. A GPT-3.5-Turbo és a GPT-4 modellek azonban beszélgetések és üzenetek küldése. A modellek egy adott csevegéshez hasonló átiratformátumú bemenetet várnak. Olyan befejezést adnak vissza, amely egy modell által írt üzenetet jelöl a csevegésben. Ez a formátum kifejezetten többfordulós beszélgetésekhez készült, de nemchates forgatókönyvekhez is jól használható.

Ez a cikk bemutatja a GPT-3.5-Turbo és a GPT-4 modellek használatának első lépéseit. A legjobb eredmények eléréséhez használja az itt leírt technikákat. Ne próbálja meg ugyanúgy használni a modelleket, mint a régebbi modellsorozatok esetében, mert a modellek gyakran részletesek, és kevésbé hasznos válaszokat adnak.

A GPT-3.5-Turbo és a GPT-4 modellek kezelése

Az alábbi kódrészlet bemutatja a GPT-3.5-Turbo és GPT-4 modellek használatának legalapvetőbb módját a Csevegés befejezése API-val. Ha ez az első alkalom, hogy programozott módon használja ezeket a modelleket, javasoljuk, hogy kezdje a GPT-3.5-Turbo és a GPT-4 gyorsútmutatóval.

Feljegyzés

Az Azure OpenAI dokumentációjában a GPT-3.5-Turbo és a GPT-35-Turbo felcserélhetően hivatkozunk. A modell hivatalos neve az OpenAI-n: gpt-3.5-turbo. Az Azure OpenAI esetében az Azure-specifikus karakterkorlátozások miatt az alapul szolgáló modell neve .gpt-35-turbo

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.

Feljegyzés

Az alábbi paraméterek nem érhetők el az új GPT-35-Turbo és GPT-4 modelleknél: logprobs, best_ofés echo. Ha ezen paraméterek bármelyikét beállítja, hibaüzenet jelenik meg.

Minden válasz tartalmazza a következőt finish_reason: . A lehetséges értékek a finish_reason következők:

  • stop: Az API teljes modellkimenetet adott vissza.
  • hossz: Hiányos modellkimenet a paraméter vagy a max_tokens jogkivonat korlátja miatt.
  • content_filter: A tartalomszűrők jelölője miatt kihagyott tartalom.
  • null: Az API-válasz még folyamatban van, vagy nem fejeződött be.

Érdemes lehet a normálnál valamivel magasabb értéket beállítani max_tokens , például 300-at vagy 500-at. A magasabb érték biztosítja, hogy a modell ne állítsa le a szöveg generálását, mielőtt az üzenet végére ér.

Modell verziószámozása

Feljegyzés

A verzió gpt-35-turbo megegyezik az gpt-3.5-turbo OpenAI-ból származó modellel.

A korábbi GPT-3 és GPT-3.5 modellektől eltérően a gpt-35-turbo modell és a gpt-4gpt-4-32k modellek továbbra is frissülnek. Ezeknek a modelleknek az üzembe helyezésekor meg kell adnia egy modellverziót is.

Ezeknek a modelleknek a kivonási dátumát a modellek oldalán találja.

A Csevegés befejezése API használata

Az OpenAI betanított a GPT-35-Turbo és a GPT-4 modelleket, hogy beszélgetésként formázott bemenetet fogadjon el. Az üzenetparaméter egy üzenetobjektum-tömböt vesz fel egy szerepkör szerint rendezett beszélgetéssel. A Python API használatakor a rendszer a szótárak listáját használja.

Az egyszerű csevegés befejezésének formátuma a következő:

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

Egy példaválaszt tartalmazó beszélgetés, amelyet egy kérdés követ, a következőképpen nézne ki:

{"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."}

Rendszerszerepkör

A rendszerszerepkör, más néven a rendszerüzenet a tömb elején található. Ez az üzenet a modell kezdeti utasításait tartalmazza. A rendszerszerepkörben különböző információkat adhat meg, például:

  • Az asszisztens rövid leírása.
  • Az asszisztens személyiségjegyei.
  • Utasítások vagy szabályok, amelyeket az asszisztensnek követnie kell.
  • A modellhez szükséges adatok vagy információk, például a gyakori kérdések releváns kérdései.

Testre szabhatja a rendszerszerepkört a használati esethez, vagy alapvető utasításokat is megadhat. A rendszerszerepkör/üzenet megadása nem kötelező, de azt javasoljuk, hogy legalább egy alapszintűt adjon meg a legjobb eredmények eléréséhez.

Üzenetek

A rendszerszerepkör után üzenetek sorozatát is felveheti a rendszer és a userassistantrendszer között.

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

A modell válaszának aktiválásához egy felhasználói üzenettel fejezze be, amely azt jelzi, hogy az asszisztens a válaszhoz fordul. Néhány példaüzenetet is felvehet a felhasználó és az asszisztens között, hogy néhány lövéses tanulást végezhessenek.

Üzenetkérési példák

Az alábbi szakasz példákat mutat be a GPT-35-Turbo és GPT-4 modellekhez használható kérésstílusokra. Ezek a példák csak kiindulópontok. Kísérletezhet különböző kérésekkel a saját használati esetek viselkedésének testreszabásához.

Egyszerű példa

Ha azt szeretné, hogy a GPT-35-Turbo modell a chat.openai.com hasonlóan viselkedjen, használhat egy egyszerű rendszerüzenetet, példáulAssistant 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élda utasításokra

Bizonyos esetekben érdemes lehet további utasításokat adni a modellnek a modell által elvégezhető védőkorlátok meghatározásához.

{"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?"}

Adatok használata földeléshez

A rendszerüzenetben releváns adatokat vagy információkat is megadhat, hogy a modell további kontextust biztosítson a beszélgetéshez. Ha csak kis mennyiségű információt kell tartalmaznia, a rendszerüzenetben keményen kódozhatja. Ha nagy mennyiségű adatra van szüksége, amelyet a modellnek tudnia kell, beágyazásokkal vagy olyan termékekkel, mint az Azure AI Search, lekérheti a legrelevánsabb információkat a lekérdezési időpontban.

{"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?"}

Néhány lövéses tanulás a csevegés befejezésével

Néhány példát is megadhat a modellre. A kevés képből álló tanulás megközelítése kissé megváltozott az új parancssori formátum miatt. Most már néhány példaként felvehet egy üzenetsort a felhasználó és az asszisztens között. Ezekkel a példákkal válaszokat adhat a modell alapkontrasztjára vonatkozó gyakori kérdésekre, vagy adott viselkedéseket taníthat a modellnek.

Ez a példa bemutatja, hogyan használhat néhány lövéses tanulást a GPT-35-Turbo és a GPT-4 használatával. Kísérletezhet különböző megközelítésekkel, hogy lássa, mi működik a legjobban a használati esethez.

{"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"}

Csevegés befejezésének használata nemchates forgatókönyvekhez

A Csevegés befejezése API úgy lett kialakítva, hogy többfordulós beszélgetésekkel működjön, de nemchates helyzetekben is jól működik.

Entitás-kinyerési forgatókönyv esetén például a következő parancssort használhatja:

{"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?"}

Alapszintű beszélgetési ciklus létrehozása

Az eddigi példák a Csevegés befejezése API használatának alapvető mechanikáit mutatják be. Ez a példa bemutatja, hogyan hozhat létre olyan beszélgetési hurkot, amely a következő műveleteket hajtja végre:

  • Folyamatosan használja a konzolbemenetet, és megfelelően formázja azt az üzenetlista részeként felhasználói szerepkör-tartalomként.
  • A konzolra nyomtatott és az üzenetlistához segédszerepkör-tartalomként hozzáadott válaszokat ad ki.

Minden alkalommal, amikor új kérdést kérdeznek fel, a rendszer elküldi a beszélgetés eddigi futó átiratát a legújabb kérdésgel együtt. Mivel a modellnek nincs memóriája, minden új kérdéshez meg kell küldenie egy frissített átiratot, különben a modell elveszíti az előző kérdések és válaszok kontextusát.

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")

Az előző kód futtatásakor üres konzolablakot kap. Írja be az első kérdést az ablakban, majd válassza ki a Enter kulcsot. A válasz visszaadása után megismételheti a folyamatot, és továbbra is kérdéseket tehet fel.

Beszélgetések kezelése

Az előző példa addig fut, amíg el nem éri a modell jogkivonatkorlátját. Az egyes kérdések és válaszok beérkezése után a messages lista mérete nő. A jogkivonatok gpt-35-turbo korlátja 4096 token. A jogkivonatok korlátja gpt-4gpt-4-32k 8192, illetve 32 768. Ezek a korlátok tartalmazzák a jogkivonatok számát az elküldött üzenetlistából és a modell válaszából is. Az üzenetlistában szereplő tokenek és a paraméter értékének együttes számának max_tokens ezen korlátok alatt kell maradnia, vagy hibaüzenet jelenik meg.

Az Ön felelőssége annak biztosítása, hogy a kérés és a befejezés a jogkivonatok korlátján belül legyen. Hosszabb beszélgetések esetén nyomon kell követnie a jogkivonatok számát, és csak a korláton belül eső kérést kell küldenie a modellnek.

Feljegyzés

Határozottan javasoljuk, hogy minden modell esetében maradjon a dokumentált bemeneti jogkivonat-korláton belül, még akkor is, ha azt tapasztalja, hogy túllépheti ezt a korlátot.

Az alábbi kódminta egy egyszerű csevegési ciklus példáját mutatja be, amely egy 4096-os tokenszám kezelésére szolgáló technikát mutat be az OpenAI tiktoken kódtárával.

A kód tiktokent 0.5.1használ. Ha régebbi verzióval rendelkezik, futtassa a parancsot pip install tiktoken --upgrade.

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")

Ebben a példában a jogkivonatok számának elérése után a beszélgetési átirat legrégebbi üzenetei törlődnek. A hatékonyság del érdekében a rendszer pop()a . Az 1. indexnél kezdjük, hogy mindig megőrizzük a rendszerüzenetet, és csak a felhasználói vagy asszisztensi üzeneteket távolítsuk el. A beszélgetés kezelésének ez a módszere idővel a beszélgetés minőségének romlását okozhatja, mivel a modell fokozatosan elveszíti a beszélgetés korábbi részeinek kontextusát.

Egy másik módszer, ha a beszélgetés időtartamát a jogkivonat maximális hosszára vagy adott számú fordulatra korlátozza. A maximális jogkivonat-korlát elérése után a modell elveszíti a kontextust, ha engedélyezi a beszélgetés folytatását. Megkérheti a felhasználót, hogy kezdjen el egy új beszélgetést, és törölje az üzenetlistát, hogy az elérhető teljes jogkivonat-korláttal kezdjen új beszélgetést.

A kód korábban bemutatott jogkivonatszámláló része az OpenAI egyik szakácskönyvének egyszerűsített verziója.

Hibaelhárítás

Az alábbiakban egy hibaelhárítási tippet talál.

Ne használjon ChatML-szintaxist vagy speciális jogkivonatokat a csevegés befejezésének végpontjával

Egyes ügyfelek az örökölt ChatML-szintaxist próbálják használni a csevegés befejező végpontjaival és újabb modelljeivel. A ChatML egy előzetes verziójú képesség volt, amely csak az örökölt befejezési végponttal működött a gpt-35-turbo 0301-es modellel. Ez a modell a kivonásra van beállítva. Ha a ChatML szintaxist újabb modellekkel és a csevegés befejezési végpontjával próbálja meg használni, az hibákat és váratlan modellválasz-viselkedést eredményezhet. Ezt a használatot nem javasoljuk. Ugyanez a probléma gyakori speciális jogkivonatok használatakor is előfordulhat.

Hibakód Hibaüzenet Megoldás
400 400 – "A bemenetben lévő speciális jogkivonatok miatt nem sikerült kimenetet létrehozni." A parancssor speciális jogkivonatokat vagy régi ChatML-jogkivonatokat tartalmaz, amelyeket a modell/végpont nem ismer fel vagy támogat. Győződjön meg arról, hogy a parancssori/üzenettömb nem tartalmaz örökölt ChatML-jogkivonatokat/speciális jogkivonatokat. Ha régi modellről frissít, zárja ki az összes speciális jogkivonatot, mielőtt API-kérést küld a modellnek.

Nem sikerült létrehozni a befejezést, mivel a modell érvénytelen Unicode-kimenetet hozott létre

Hibakód Hibaüzenet Áthidaló megoldás
500 500 – InternalServerError: Hibakód: 500 – {'error': {'message': "Nem sikerült létrehozni a befejezést, mivel a modell érvénytelen Unicode-kimenetet hozott létre}}. A hibák előfordulását minimalizálhatja úgy, hogy a kérések hőmérsékletét 1-nél kisebbre csökkenti, és biztosítja, hogy újrapróbálkozással rendelkező ügyfelet használjon. A kérés újbóli megismétlése gyakran sikeres választ eredményez.

Következő lépések