Sdílet prostřednictvím


Chat Markup Language ChatML (Preview)

Důležité

Použití modelů GPT-3.5-Turbo s koncovým bodem dokončení, jak je popsáno v tomto článku, zůstává ve verzi Preview a je možné pouze s gpt-35-turbo verzí (0301), která se plánuje pro vyřazení z provozu na začátku 1. srpna 2024. Důrazně doporučujeme použít rozhraní API nebo koncový bod pro dokončování chatu hosta. Rozhraní API pro dokončování chatu je doporučená metoda interakce s modely GPT-3.5-Turbo. Rozhraní API pro dokončování chatu je také jediným způsobem, jak získat přístup k modelům GPT-4.

Následující fragment kódu ukazuje nejzásadnější způsob použití modelů GPT-3.5-Turbo s ChatML. Pokud používáte tyto modely poprvé programově, doporučujeme začít s naším rychlým startem GPT-35-Turbo & 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 platformě OpenAI je gpt-3.5-turbo, ale pro Azure OpenAI kvůli omezením konkrétních znaků Azure je gpt-35-turbonázev základního modelu .

import os
import openai
openai.api_type = "azure"
openai.api_base = "https://{your-resource-name}.openai.azure.com/"
openai.api_version = "2024-02-01"
openai.api_key = os.getenv("OPENAI_API_KEY")

response = openai.Completion.create(
  engine="gpt-35-turbo", # The deployment name you chose when you deployed the GPT-35-Turbo model
  prompt="<|im_start|>system\nAssistant is a large language model trained by OpenAI.\n<|im_end|>\n<|im_start|>user\nWho were the founders of Microsoft?\n<|im_end|>\n<|im_start|>assistant\n",
  temperature=0,
  max_tokens=500,
  top_p=0.5,
  stop=["<|im_end|>"])

print(response['choices'][0]['text'])

Poznámka:

Následující parametry nejsou k dispozici s modelem gpt-35-turbo: logprobs, best_ofa echo. Pokud nastavíte některý z těchto parametrů, zobrazí se chyba.

Token <|im_end|> označuje konec zprávy. Při použití ChatML se doporučuje zahrnout <|im_end|> token jako sekvenci zastavení, aby se zajistilo, že model přestane generovat text, když dosáhne konce zprávy.

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

Správa verzí modelů

Poznámka:

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 i gpt-4 gpt-4-32k modely i nadále aktualizují. Při vytváření nasazení těchto modelů budete také muset zadat verzi modelu.

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

Práce s jazykem Chat Markup Language (ChatML)

Poznámka:

OpenAI i nadále vylepšuje GPT-35-Turbo a jazyk chatových značek používaný s modely se v budoucnu bude dále vyvíjet. Tento dokument budeme aktualizovat nejnovějšími informacemi.

OpenAI vytrénoval GPT-35-Turbo na speciálních tokenech, které označují různé části výzvy. Tato výzva začíná systémovou zprávou, která se používá k vytvoření modelu a následuje řada zpráv mezi uživatelem a asistentem.

Formát základní výzvy ChatML je následující:

<|im_start|>system 
Provide some context and/or instructions to the model.
<|im_end|> 
<|im_start|>user 
The user’s message goes here
<|im_end|> 
<|im_start|>assistant 

Systémová zpráva

Systémová zpráva je zahrnuta na začátku výzvy mezi <|im_start|>system tokeny a <|im_end|> tokeny. Tato zpráva obsahuje počáteční pokyny k modelu. V systémové zprávě můžete zadat různé informace, mezi které patří:

  • Stručný popis asistenta
  • Osobnostní vlastnosti asistenta
  • Pokyny nebo pravidla, která chcete, aby asistent postupoval
  • Data nebo informace potřebné pro model, například relevantní otázky z nejčastějších dotazů

Systémovou zprávu můžete přizpůsobit pro váš případ použití nebo jenom zahrnout základní systémovou zprávu. Systémová zpráva je nepovinná, ale doporučuje se alespoň zahrnout základní zprávu, aby získala nejlepší výsledky.

Zprávy

Za systémovou zprávou můžete zahrnout řadu zpráv mezi uživatelem a asistentem. Každá zpráva by měla začínat tokenem <|im_start|> následovaným rolí (user nebo assistant) a končit tokenem <|im_end|> .

<|im_start|>user
What is thermodynamics?
<|im_end|>

Pokud chcete aktivovat odpověď z modelu, měla by výzva končit tokenem <|im_start|>assistant označujícím, že se jedná o asistenta, který reaguje. Do výzvy můžete také zahrnout zprávy mezi uživatelem a asistentem jako způsob, jak provést několik snímků učení.

Příklady dotazů

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 jsou jen výchozím bodem a 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 modely GPT-35-Turbo a GPT-4 chovaly podobně jako chat.openai.com, můžete použít základní systémovou zprávu jako "Assistant je velký jazykový model natrénovaný aplikací OpenAI".

<|im_start|>system
Assistant is a large language model trained by OpenAI.
<|im_end|>
<|im_start|>user
Who were the founders of Microsoft?
<|im_end|>
<|im_start|>assistant

Příklad s pokyny

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

<|im_start|>system
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.
<|im_end|>
<|im_start|>user
When are my taxes due?
<|im_end|>
<|im_start|>assistant

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.

<|im_start|>system
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
<|im_end|>
<|im_start|>user
What is Azure OpenAI Service?
<|im_end|>
<|im_start|>assistant

Několik snímků učení pomocí ChatML

Do modelu můžete také uvést několik příkladů. Přístup pro několik snímků učení se mírně změnil kvůli novému formátu výzvy. Teď můžete do výzvy zahrnout řadu zpráv mezi uživatelem a asistentem, a to v několika příkladech. Tyto příklady se dají použít k počátečním odpovědím na běžné otázky k vytvoření modelu nebo k výuce konkrétního chování modelu.

Toto je jen jeden příklad použití několika snímků učení s GPT-35-Turbo. Můžete experimentovat s různými přístupy a zjistit, co je pro váš případ použití nejvhodnější.

<|im_start|>system
Assistant is an intelligent chatbot designed to help users answer their tax related questions. 
<|im_end|>
<|im_start|>user
When do I need to file my taxes by?
<|im_end|>
<|im_start|>assistant
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
<|im_end|>
<|im_start|>user
How can I check the status of my tax refund?
<|im_end|>
<|im_start|>assistant
You can check the status of your tax refund by visiting https://www.irs.gov/refunds
<|im_end|>

Použití jazyka značek chatu pro scénáře, které nejsou chatované

ChatML je navržený tak, aby usnadnil správu konverzací s více možnostmi, ale funguje dobře i pro scénáře, které nejsou chatované.

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

<|im_start|>system
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": ""
}
<|im_end|>
<|im_start|>user
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?
<|im_end|>
<|im_start|>assistant

Zabránění nebezpečným uživatelským vstupům

Je důležité do aplikace přidat zmírnění rizik, aby se zajistilo bezpečné použití jazyka Chat Markup Language.

Doporučujeme, abyste koncovým uživatelům zabránili v zahrnutí speciálních tokenů do jejich vstupu, například <|im_start|> a <|im_end|>. Doporučujeme také zahrnout další ověření, abyste zajistili, že výzvy, které odesíláte do modelu, budou správně vytvořené a budou postupovat podle formátu Chat Markup Language, jak je popsáno v tomto dokumentu.

V systémové zprávě můžete také poskytnout pokyny, které povedou model k tomu, jak reagovat na určité typy uživatelských vstupů. Můžete například dát modelu pokyn, aby odpovídal pouze na zprávy týkající se určitého předmětu. Toto chování můžete také posílit několika příklady snímků.

Správa konverzací

Limit tokenu je gpt-35-turbo 4096 tokenů. Tento limit zahrnuje počet tokenů z výzvy i dokončení. Počet tokenů v příkazovém řádku v kombinaci s hodnotou max_tokens parametru musí zůstat pod 4096 nebo se zobrazí chyba.

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

Následující ukázka kódu ukazuje jednoduchý příklad toho, jak můžete sledovat samostatné zprávy v konverzaci.

import os
import openai
openai.api_type = "azure"
openai.api_base = "https://{your-resource-name}.openai.azure.com/" #This corresponds to your Azure OpenAI resource's endpoint value
openai.api_version = "2024-02-01" 
openai.api_key = os.getenv("OPENAI_API_KEY")

# defining a function to create the prompt from the system message and the conversation messages
def create_prompt(system_message, messages):
    prompt = system_message
    for message in messages:
        prompt += f"\n<|im_start|>{message['sender']}\n{message['text']}\n<|im_end|>"
    prompt += "\n<|im_start|>assistant\n"
    return prompt

# defining the user input and the system message
user_input = "<your user input>" 
system_message = f"<|im_start|>system\n{'<your system message>'}\n<|im_end|>"

# creating a list of messages to track the conversation
messages = [{"sender": "user", "text": user_input}]

response = openai.Completion.create(
    engine="gpt-35-turbo", # The deployment name you chose when you deployed the GPT-35-Turbo model.
    prompt=create_prompt(system_message, messages),
    temperature=0.5,
    max_tokens=250,
    top_p=0.9,
    frequency_penalty=0,
    presence_penalty=0,
    stop=['<|im_end|>']
)

messages.append({"sender": "assistant", "text": response['choices'][0]['text']})
print(response['choices'][0]['text'])

Zůstat pod limitem tokenu

Nejjednodušším přístupem k zachování limitu tokenu je odebrání nejstarších zpráv v konverzaci, když dosáhnete limitu tokenu.

Při zachování limitu můžete vždy zahrnout co nejvíce tokenů, nebo můžete vždy zahrnout nastavený počet předchozích zpráv za předpokladu, že tyto zprávy zůstanou v limitu. Je důležité mít na paměti, že generování odpovědi delšími výzvami trvá déle a účtují se vyšší náklady než kratší výzvy.

Počet tokenů v řetězci můžete odhadnout pomocí knihovny tiktoken Pythonu, jak je znázorněno níže.

import tiktoken 

cl100k_base = tiktoken.get_encoding("cl100k_base") 

enc = tiktoken.Encoding( 
    name="gpt-35-turbo",  
    pat_str=cl100k_base._pat_str, 
    mergeable_ranks=cl100k_base._mergeable_ranks, 
    special_tokens={ 
        **cl100k_base._special_tokens, 
        "<|im_start|>": 100264, 
        "<|im_end|>": 100265
    } 
) 

tokens = enc.encode( 
    "<|im_start|>user\nHello<|im_end|><|im_start|>assistant",  
    allowed_special={"<|im_start|>", "<|im_end|>"} 
) 

assert len(tokens) == 7 
assert tokens == [100264, 882, 198, 9906, 100265, 100264, 78191]

Další kroky