Chat Markup Language ChatML (предварительная версия)

Внимание

Использование моделей GPT-3.5-Turbo с конечной точкой завершения, как описано в этой статье, остается в предварительной версии и возможно только с gpt-35-turbo версией (0301), которая планируется выйти на пенсию до 1 августа 2024 года. Настоятельно рекомендуется использовать API завершения чата или конечную точку. API завершения чата — это рекомендуемый метод взаимодействия с моделями GPT-3.5-Turbo. API завершения чата также является единственным способом доступа к моделям GPT-4.

В следующем фрагменте кода показан самый простой способ использования моделей GPT-3.5-Turbo с ChatML. Если вы впервые используете эти модели программным способом, мы рекомендуем начать с нашего краткого руководства по GPT-35-Turbo и GPT-4.

Примечание.

В документации по Azure OpenAI мы ссылаемся на GPT-3.5-Turbo и GPT-35-Turbo взаимозаменяемо. Официальное имя модели в OpenAI— gpt-3.5-turboно для Azure OpenAI из-за ограничений конкретного символа Azure используется имя 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 эквивалентен gpt-3.5-turbo модели из OpenAI.

В отличие от предыдущих моделей GPT-3 и GPT-3.5, gpt-35-turbo модель, а также gpt-4 gpt-4-32k модели будут продолжать обновляться. При создании развертывания этих моделей также необходимо указать версию модели.

Даты выхода на пенсию модели можно найти на странице моделей .

Работа с языком разметки чата (ChatML)

Примечание.

OpenAI продолжает улучшать GPT-35-Turbo и язык разметки чата, используемый с моделями, будет продолжать развиваться в будущем. Мы будем обновлять этот документ с последними сведениями.

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|> маркерами. Это сообщение содержит начальные инструкции для модели. Вы можете предоставить различные сведения в системном сообщении, в том числе:

  • Краткое описание помощника
  • Черты личности помощника
  • Инструкции или правила, которые вы хотите выполнить помощнику
  • Данные или сведения, необходимые для модели, например соответствующие вопросы из часто задаваемых вопросов

Вы можете настроить системное сообщение для вашего варианта использования или просто включить базовое системное сообщение. Системное сообщение является необязательным, но рекомендуется по крайней мере включить базовый, чтобы получить лучшие результаты.

Сообщения

После системного сообщения можно включить ряд сообщений между пользователем и помощником. Каждое сообщение должно начинаться с маркера <|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, для получения наиболее важных сведений во время запроса.

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

Использование языка разметки чата для сценариев, отличных от чата

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

Предотвращение небезопасных входных данных пользователей

Важно добавить в приложение средства устранения рисков, чтобы обеспечить безопасное использование языка разметки чата.

Рекомендуется запретить конечным пользователям включать специальные маркеры в входные данные, например <|im_start|> и <|im_end|>. Мы также рекомендуем включить дополнительную проверку, чтобы убедиться, что запросы, которые вы отправляете в модель, хорошо сформированы и следуйте формату языка разметки чата, как описано в этом документе.

Вы также можете указать инструкции в системном сообщении, чтобы помочь модели реагировать на определенные типы входных данных пользователей. Например, можно указать модели ответить только на сообщения о определенной теме. Это поведение можно также укрепить с помощью нескольких примеров снимка.

Управление беседами

Ограничение 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'])

Оставаясь под ограничением маркера

Самый простой подход к пребыванию под ограничением маркера заключается в удалении старейших сообщений в беседе при достижении предела маркера.

Вы можете всегда включать как можно больше маркеров, оставаясь в пределах предела или всегда включать заданное число предыдущих сообщений, если эти сообщения остаются в пределах предела. Важно помнить, что более длинные запросы занимают больше времени, чтобы создать ответ и повлечь за собой более высокую стоимость, чем более короткие запросы.

Вы можете оценить количество токенов в строке с помощью библиотеки Python tiktoken , как показано ниже.

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]

Следующие шаги