다음을 통해 공유


채팅 태그 언어 ChatML(미리 보기)

Important

이 문서에 설명된 대로 완성 엔드포인트와 함께 GPT-3.5-Turbo 모델을 사용하는 것은 미리 보기로 유지되며 빠르면 2024년 8월 1일에 사용 중지될gpt-35-turbo 버전(0301)에서만 사용할 수 있습니다. GA 채팅 완료 API/엔드포인트를 사용하는 것이 좋습니다. 채팅 완료 API는 GPT-3.5-Turbo 모델과 상호 작용하는 데 권장되는 방법입니다. 채팅 완료 API는 GPT-4 모델에 액세스하는 유일한 방법이기도 합니다.

다음 코드 조각은 ChatML에서 GPT-3.5-Turbo 모델을 사용하는 가장 기본적인 방법을 보여 줍니다. 이러한 모델을 프로그래밍 방식으로 처음 사용하는 경우 GPT-35-Turbo 및 GPT-4 빠른 시작부터 시작하는 것이 좋습니다.

참고 항목

Azure OpenAI 설명서에서는 GPT-3.5-Turbo 및 GPT-35-Turbo를 같은 의미로 언급합니다. OpenAI에서 모델의 공식 이름은 gpt-3.5-turbo이지만, Azure 특정 문자 제약 조건으로 인해 Azure OpenAI의 경우 기본 모델 이름은 gpt-35-turbo입니다.

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'])

참고 항목

gpt-35-turbo 모델에서는 logprobs, best_of, echo 매개 변수를 사용할 수 없습니다. 이러한 매개 변수를 설정하면 오류가 발생합니다.

<|im_end|> 토큰은 메시지의 끝을 나타냅니다. ChatML을 사용하는 경우 모델에서 메시지 끝에 도달할 때 텍스트 생성을 중지하도록 <|im_end|> 토큰을 중지 시퀀스로 포함하는 것이 좋습니다.

max_tokens을 300 또는 500과 같이 평소보다 약간 더 높은 값으로 설정하는 것이 좋습니다. 이렇게 하면 모델이 메시지의 끝에 도달하기 전에는 텍스트 생성을 중지하지 않습니다.

모델 버전 관리

참고 항목

gpt-35-turbo는 OpenAI의 gpt-3.5-turbo 모델과 동일합니다.

이전 GPT-3 및 GPT-3.5 모델과 달리 gpt-35-turbo 모델, gpt-4 모델, gpt-4-32k 모델은 계속 업데이트됩니다. 이러한 모델의 배포를 만들 때 모델 버전도 지정해야 합니다.

모델 페이지에서 해당 모델의 모델 사용 중지 날짜를 확인할 수 있습니다.

ChatML(Chat Markup Language) 작업

참고 항목

OpenAI는 GPT-35-Turbo를 지속적으로 개선하고 모델과 함께 사용되는 채팅 Markup Language는 앞으로도 계속 발전할 것입니다. 이 문서는 최신 정보로 계속 업데이트됩니다.

OpenAI는 프롬프트의 다양한 부분을 설명하는 특수 토큰에 대해 GPT-35-Turbo를 학습했습니다. 프롬프트는 모델을 초기화하는 데 사용되는 시스템 메시지로 시작하여 사용자와 도우미 간 일련의 메시지가 이어집니다.

기본 ChatML 프롬프트의 형식은 다음과 같습니다.

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

시스템 메시지

시스템 메시지는 <|im_start|>system<|im_end|> 토큰의 프롬프트 시작 부분에 포함됩니다. 이 메시지는 모델에 초기 지침을 제공합니다. 시스템 메시지에서 다음과 같은 다양한 정보를 제공할 수 있습니다.

  • 도우미에 대한 간략한 설명
  • 도우미의 성격 특성
  • 도우미가 따라야 할 지침 또는 규칙
  • 모델에 필요한 데이터 또는 정보(예: FAQ의 관련 질문)

사용 사례에 맞게 시스템 메시지를 사용자 지정하거나 기본 시스템 메시지만 포함할 수 있습니다. 시스템 메시지는 선택 사항이지만 최상의 결과를 얻으려면 최소한 기본 메시지를 포함하는 것이 좋습니다.

메시지

시스템 메시지 이후에는 사용자도우미 간 일련의 메시지를 포함할 수 있습니다. 각 메시지는 <|im_start|> 토큰으로 시작하여 그 뒤에 역할(user 또는 assistant)로 이어져 <|im_end|> 토큰으로 끝나야 합니다.

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

모델에서 응답을 트리거하려면 프롬프트는 도우미가 응답할 차례임을 나타내는 <|im_start|>assistant 토큰으로 끝나야 합니다. 또한 몇 가지 샷 학습을 수행하는 방법으로 프롬프트에 사용자와 도우미 간 메시지를 포함할 수도 있습니다.

프롬프트 예시

다음 섹션에서는 GPT-35-Turbo 및 GPT-4 모델과 함께 사용할 수 있는 다양한 스타일의 프롬프트 예를 보여 줍니다. 이러한 예제는 시작에 불과하며 다양한 프롬프트를 통해 사용자 고유의 사용 사례에 맞게 동작을 사용자 지정할 수 있습니다.

기본 예제

GPT-35-Turbo 및 GPT-4 모델이 chat.openai.com과 유사하게 작동하도록 하려면 “도우미는 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

지침이 포함된 예

일부 시나리오의 경우 모델에 추가 지침을 제공하여 모델이 수행할 수 있는 작업에 대한 가드레일을 정의할 수 있습니다.

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

접지용 데이터 사용

또한 시스템 메시지에 관련 데이터 또는 정보를 포함하여 대화를 위한 추가 컨텍스트를 모델에 제공할 수도 있습니다. 소량의 정보만 포함해야 하는 경우에는 시스템 메시지에서 하드 코딩할 수 있습니다. 모델이 유의해야 할 많은 양의 데이터가 있는 경우에는 포함을 사용하거나 또는 Azure AI Search와 같은 제품을 사용하여 쿼리 시 가장 관련성이 높은 정보를 검색할 수 있습니다.

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

ChatML을 사용하여 몇 가지 샷 학습

모델에 몇 가지 샷 예제를 제공할 수도 있습니다. 새로운 프롬프트 형식으로 인해 몇 가지 샷 학습에 대한 접근 방식이 약간 변경되었습니다. 이제 사용자와 도우미 간 일련의 메시지를 몇 가지 샷 예제로 프롬프트에 포함할 수 있습니다. 이러한 예제는 일반적인 질문에 대한 답변을 시드하여 모델을 초기화하거나 모델에 특정 동작을 가르치는 데 사용할 수 있습니다.

이는 GPT-35-Turbo로 몇 번의 샷 학습을 사용할 수 있는 방법의 한 예일 뿐입니다. 다양한 접근 방식을 실험하여 사용 사례에 가장 적합한 접근 방식을 확인할 수 있습니다.

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

채팅이 아닌 시나리오에 Chat Markup Language 사용

ChatML은 멀티 턴 대화를 보다 쉽게 관리할 수 있도록 설계되었지만 채팅이 아닌 시나리오에서도 잘 작동합니다.

예를 들어 엔터티 추출 시나리오의 경우 다음 프롬프트를 사용할 수 있습니다.

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

안전하지 않은 사용자 입력 방지

Chat Markup Language를 안전하게 사용할 수 있도록 애플리케이션에 완화 기능을 추가하는 것이 중요합니다.

최종 사용자가 <|im_start|><|im_end|>와 같은 특수 토큰을 입력에 포함할 수 없도록 하는 것이 좋습니다. 또한 모델에 보내는 프롬프트가 올바른 형식인지 확인하고 이 문서에 설명된 대로 Chat Markup Language 형식을 따르도록 추가 유효성 검사를 포함하는 것이 좋습니다.

또한 시스템 메시지의 지침을 제공하여 특정 유형의 사용자 입력에 응답하는 방법에 대한 모델을 안내할 수도 있습니다. 예를 들어 특정 주제에 대한 메시지에만 회신하도록 모델에 지시할 수 있습니다. 몇 가지 샷 예제를 사용하여 이 동작을 강화할 수도 있습니다.

대화 관리

gpt-35-turbo의 토큰 한도는 4096 토큰입니다. 이 제한에는 프롬프트와 완료 모두의 토큰 수가 포함됩니다. max_tokens 매개 변수 값과 결합된 프롬프트의 토큰 수는 4096에서 유지되어야 합니다. 그렇지 않으면 오류가 발생합니다.

프롬프트 및 완료가 토큰 한도 내에 있도록 하는 것은 사용자의 책임입니다. 즉, 대화가 길어질 수록 토큰 수를 추적하고 토큰 한도 내에 속하는 프롬프트만 모델에 보내야 함을 의미합니다.

다음 코드 샘플은 대화에서 별도의 메시지를 추적하는 방법의 간단한 예제를 보여 줍니다.

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'])

토큰 한도 미만으로 유지

토큰 한도 미만으로 유지하는 가장 간단한 방법은 토큰 한도에 도달할 때 대화에서 가장 오래된 메시지를 제거하는 것입니다.

한도 미만으로 유지하면서 가능한 한 많은 토큰을 항상 포함하도록 선택하거나 해당 메시지가 한도 내에 유지되는 경우 항상 설정된 수의 이전 메시지를 포함할 수 있습니다. 더 긴 프롬프트는 응답을 생성하는 데 더 오래 걸리고 짧은 프롬프트보다 더 높은 비용이 발생한다는 점을 명심해야 합니다.

아래와 같이 tiktoken Python 라이브러리를 사용하여 문자열의 토큰 수를 예측할 수 있습니다.

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]

다음 단계