Share via


Lenguaje de marcado de che ChatML (versión preliminar)

Importante

El uso de modelos GPT-3.5-Turbo con el punto de conexión de finalización como se describe en este artículo permanece en versión preliminar y solo es posible con la versión gpt-35-turbo (0301), que está programada para su retirada a partir del 1 de agosto de 2024. Se recomienda encarecidamente usar la API de finalización de chat de disponibilidad general. La API de finalización de chat es el método recomendado para interactuar con los modelos GPT-3.5-Turbo. La API Chat Completion es también la única manera de acceder a los modelos GPT-4.

El siguiente fragmento de código muestra la manera más básica de usar los modelos GPT-3.5-Turbo con ChatML. Si esta es la primera vez que usa estos modelos mediante programación, se recomienda comenzar con el Inicio rápido de GPT-35-Turbo y GPT-4.

Nota:

En la documentación de Azure OpenAI, nos referimos a GPT-3.5-Turbo y GPT-35-Turbo indistintamente. El nombre oficial del modelo en OpenAI es gpt-3.5-turbo, pero para Azure OpenAI debido a restricciones de caracteres específicos de Azure, el nombre del modelo subyacente es 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'])

Nota:

Los parámetros siguientes no están disponibles con el modelo gpt-35-turbo: logprobs, best_of y echo. Si establece cualquiera de estos parámetros, obtendrá un error.

El token <|im_end|> indica el final de un mensaje. Al usar ChatML, se recomienda incluir el token <|im_end|> como secuencia de detención para asegurarse de que el modelo deja de generar texto cuando llega al final del mensaje.

Considere la posibilidad de establecer max_tokens en un valor ligeramente superior al normal, como 300 o 500. Esto garantiza que el modelo no deje de generar texto antes de que llegue al final del mensaje.

Control de versiones de los modelos

Nota

gpt-35-turbo es equivalente al modelo gpt-3.5-turbo de OpenAI.

A diferencia de los modelos anteriores GPT-3 y GPT-3.5, tanto el modelo gpt-35-turbo como los modelos gpt-4 y gpt-4-32k seguirán actualizándose. Al crear una implementación de estos modelos, también deberá especificar una versión del modelo.

Puede encontrar las fechas de retiro de estos modelos en nuestra página de modelos.

Trabajar con el lenguaje de marcado de chat (ChatML)

Nota

OpenAI sigue mejorando GPT-35-Turbo y el lenguaje de marcado de chat usado con los modelos seguirá evolucionando en el futuro. Mantendremos actualizado este documento con la información más reciente.

OpenAI entrenó GPT-35-Turbo en tokens especiales que delimitan las distintas partes de la solicitud. La solicitud comienza con un mensaje del sistema que se usa para preparar el modelo seguido de una serie de mensajes entre el usuario y el asistente.

El formato de una solicitud de ChatML básico es el siguiente:

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

Mensaje del sistema

El mensaje del sistema se incluye al principio de la solicitud entre los tokens <|im_start|>system y <|im_end|>. Este mensaje proporciona las instrucciones iniciales para el modelo. Puede proporcionar varias informaciones en el mensaje del sistema, entre las que se incluyen:

  • Una breve descripción del asistente
  • Rasgos de personalidad del asistente
  • Instrucciones o reglas que le gustaría que siguiera el asistente
  • Datos o información necesarios para el modelo, como preguntas relevantes provenientes de preguntas frecuentes

Puede personalizar el mensaje del sistema para su caso de uso o simplemente incluir un mensaje básico del sistema. El mensaje del sistema es opcional, pero se recomienda incluir al menos uno básico para obtener los mejores resultados.

error de Hadoop

Después del mensaje del sistema, puede incluir una serie de mensajes entre el usuario y el asistente. Cada mensaje debe comenzar con el token <|im_start|> seguido del rol (user o assistant) y terminar con el token <|im_end|>.

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

Para desencadenar una respuesta del modelo, la solicitud debe terminar con el token <|im_start|>assistant que indica que es el turno de responder del asistente. También se pueden incluir mensajes entre el usuario y el asistente en la solicitud como una forma de realizar un aprendizaje de pocas etapas.

Ejemplos de solicitudes

En la siguiente sección, se muestran ejemplos de diferentes estilos de solicitudes que podría utilizar con los modelos GPT-35-Turbo y GPT-4. Estos ejemplos son solo un punto de partida, y puede experimentar con diferentes solicitudes para personalizar el comportamiento para sus propios casos de uso.

Ejemplo básico

Si desea que los modelos GPT-35-Turbo y GPT-4 se comporten de forma similar a chat.openai.com, puede usar un mensaje básico del sistema como "El asistente es un modelo de lenguaje grande entrenado por 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

Ejemplo con instrucciones

En algunos escenarios, puede que desee proporcionar instrucciones adicionales al modelo para definir límites de protección para lo que el modelo puede hacer.

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

Uso de datos para la conexión a tierra

También puede incluir información o datos relevantes en el mensaje del sistema para dar al modelo contexto adicional para la conversación. Si solo necesita incluir una pequeña cantidad de información, puede codificarla manualmente en el mensaje del sistema. Si tiene una gran cantidad de datos que el modelo debe tener en cuenta, puede usar inserciones o un producto como Azure AI Search para recuperar la información más relevante en el momento de la consulta.

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

Pocas etapas de aprendizaje con ChatML

También puede dar algunos ejemplos de etapas al modelo. El enfoque para el aprendizaje de pocas etapas ha cambiado ligeramente debido al nuevo formato de solicitud. Ahora puede incluir una serie de mensajes entre el usuario y el asistente en la solicitud como algunos ejemplos de etapa. Estos ejemplos se pueden usar para inicializar respuestas a preguntas comunes para preparar el modelo o enseñar comportamientos concretos al modelo.

Esta es solo una muestra de cómo puede usar GPT-35-Turbo con pocos ejemplos. Puede experimentar con diferentes enfoques para ver el más adecuado para su caso de uso.

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

Uso del lenguaje de marcado de chat para escenarios que no son de chat

ChatML está diseñado para facilitar la administración de conversaciones multiturno, pero también funciona bien en escenarios que no son de chat.

Por ejemplo, para un escenario de extracción de entidad, puede usar la solicitud del sistema:

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

Impedir entradas de usuario no seguras

Es importante agregar mitigaciones a la aplicación para garantizar un uso seguro del lenguaje de marcado de chat.

Se recomienda evitar que los usuarios finales puedan incluir tokens especiales en sus entradas, como <|im_start|> y <|im_end|>. También se recomienda incluir una validación adicional para asegurarse que las solicitudes que envía al modelo están bien formadas y siguen el formato del lenguaje de marcado de chat, tal y como se describe en este documento.

También puede proporcionar instrucciones en el mensaje del sistema para guiar el modelo sobre cómo responder a determinados tipos de entradas de usuario. Por ejemplo, puede indicar al modelo que solo responda a los mensajes sobre un asunto determinado. También puede reforzar este comportamiento con algunos ejemplos de etapas.

Administración de conversaciones

El límite de tokens para gpt-35-turbo es de 4096 tokens. Este límite incluye el número de tokens de la solicitud y la finalización. El número de tokens de la solicitud combinado con el valor del parámetro max_tokens debe permanecer en 4096 o recibirá un error.

Es su responsabilidad asegurarse de que la solicitud y la finalización se encuentran dentro del límite de tokens. Esto significa que, para conversaciones más largas, debe realizar un seguimiento del recuento de tokens y enviar solo al modelo una solicitud que se encuentre dentro del límite de tokens.

En el ejemplo de código siguiente se muestra un ejemplo sencillo de cómo se puede realizar un seguimiento de los mensajes independientes de la conversación.

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

Permanecer por debajo del límite de tokens

El enfoque más sencillo para mantenerse bajo el límite de tokens es quitar los mensajes más antiguos de la conversación cuando se alcanza el límite de tokens.

Puede optar por incluir siempre el mayor número posible de tokens sin sobrepasar el límite, o bien incluir siempre un número determinado de mensajes anteriores suponiendo que estos mensajes no sobrepasan el límite. Es importante tener en cuenta que las solicitudes más largos tardan más tiempo en generar una respuesta e incurren en un costo mayor que las solicitudes más cortas.

Puede calcular el número de tokens de una cadena mediante la biblioteca de Python tiktoken, tal y como se muestra a continuación.

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]

Pasos siguientes