Compartir vía


Uso de modelos de razonamiento con inferencia de modelos de Azure AI

Importante

Los elementos marcados (versión preliminar) en este artículo se encuentran actualmente en versión preliminar pública. Esta versión preliminar se ofrece sin acuerdo de nivel de servicio y no se recomienda para las cargas de trabajo de producción. Es posible que algunas características no sean compatibles o que tengan sus funcionalidades limitadas. Para más información, consulte Términos de uso complementarios de las Versiones Preliminares de Microsoft Azure.

En este artículo se explica cómo usar las funcionalidades de razonamiento de las finalizaciones de chat con modelos implementados en la inferencia de modelos de Azure AI en los servicios de Azure AI.

Modelos de razonamiento

Los modelos de razonamiento pueden alcanzar mayores niveles de rendimiento en dominios como matemáticas, codificación, ciencia, estrategia y logística. La forma en que estos modelos generan salidas es mediante explícitamente el uso de la cadena de pensamiento para explorar todas las rutas posibles antes de generar una respuesta. Comprueban sus respuestas a medida que las producen, lo que les ayuda a llegar a conclusiones más precisas. Esto significa que los modelos de razonamiento pueden requerir menos contexto para solicitar resultados efectivos.

Esta forma de escalar el rendimiento del modelo se conoce como tiempo de proceso de inferencia, ya que intercambia el rendimiento con una mayor latencia y coste. Contrasta con otros enfoques que se escalan a través del tiempo de proceso de entrenamiento.

A continuación, los modelos de razonamiento generan dos tipos de salidas:

  • Finalizaciones de razonamiento
  • Finalizaciones de salida

Ambas finalizaciones cuentan para el contenido generado a partir del modelo y, por tanto, hacia los límites de token y los costos asociados al modelo. Algunos modelos pueden generar el contenido de razonamiento, como DeepSeek-R1. Otros, como o1, solo genera la parte de salida de las finalizaciones.

Requisitos previos

Para completar este tutorial, necesita:

Uso de funcionalidades de razonamiento con chat

En primer lugar, cree el cliente para consumir el modelo. El código siguiente usa una dirección URL de punto de conexión y una clave que se almacenan en variables de entorno.

import os
from azure.ai.inference import ChatCompletionsClient
from azure.core.credentials import AzureKeyCredential

client = ChatCompletionsClient(
    endpoint="https://<resource>.services.ai.azure.com/models",
    credential=AzureKeyCredential(os.environ["AZURE_INFERENCE_CREDENTIAL"]),
    model="deepseek-r1"
)

Sugerencia

Compruebe que ha implementado el modelo en el recurso de Servicios de Azure AI con la API de inferencia del modelo de Azure AI. Deepseek-R1 también está disponible como puntos de conexión de API sin servidor. Sin embargo, esos puntos de conexión no toman el parámetro model como se explica en este tutorial. Para comprobarlo, vaya al Portal de Azure AI Foundry> Modelos + puntos de conexión, y compruebe que el modelo aparece en la sección Servicios de Azure AI.

Si ha configurado el recurso para que admita Microsoft Entra ID, puede utilizar el siguiente fragmento de código para crear un cliente.

import os
from azure.ai.inference import ChatCompletionsClient
from azure.identity import DefaultAzureCredential

client = ChatCompletionsClient(
    endpoint="https://<resource>.services.ai.azure.com/models",
    credential=DefaultAzureCredential(),
    credential_scopes=["https://cognitiveservices.azure.com/.default"],
    model="deepseek-r1"
)

Creación de una solicitud de finalización de chat

En el ejemplo siguiente, se muestra cómo crear solicitudes básicas de chat al modelo.

from azure.ai.inference.models import SystemMessage, UserMessage

response = client.complete(
    messages=[
        UserMessage(content="How many languages are in the world?"),
    ],
)

Al crear solicitudes de modelos de razonamiento, tenga en cuenta lo siguiente:

  • Use instrucciones sencillas y evite el uso de técnicas de cadena de pensamiento.
  • Las funcionalidades de razonamiento integradas hacen que los mensajes simples de captura cero sean tan eficaces como métodos más complejos.
  • Al proporcionar contexto o documentos adicionales, como en escenarios RAG, la información más relevante solo puede ayudar a evitar que el modelo complique su respuesta.
  • Los modelos de razonamiento pueden admitir el uso de mensajes del sistema. Sin embargo, es posible que no los sigan tan estrictamente como otros modelos de no razonamiento.
  • Al crear aplicaciones multiturno, considere la posibilidad de anexar solo la respuesta final del modelo, sin el contenido de razonamiento, como se explica en la sección Contenido de razonamiento.

La respuesta es la siguiente, donde puede ver las estadísticas de uso del modelo:

print("Response:", response.choices[0].message.content)
print("Model:", response.model)
print("Usage:")
print("\tPrompt tokens:", response.usage.prompt_tokens)
print("\tTotal tokens:", response.usage.total_tokens)
print("\tCompletion tokens:", response.usage.completion_tokens)
Response: <think>Okay, the user is asking how many languages exist in the world. I need to provide a clear and accurate answer...</think>As of now, it's estimated that there are about 7,000 languages spoken around the world. However, this number can vary as some languages become extinct and new ones develop. It's also important to note that the number of speakers can greatly vary between languages, with some having millions of speakers and others only a few hundred.
Model: deepseek-r1
Usage: 
  Prompt tokens: 11
  Total tokens: 897
  Completion tokens: 886

Contenido de razonamiento

Algunos modelos de razonamiento, como DeepSeek-R1, generan finalizaciones e incluyen el razonamiento subyacente. El razonamiento asociado a la finalización se incluye en el contenido de la respuesta dentro de las etiquetas <think> y </think>. El modelo puede seleccionar en qué escenarios generar contenido de razonamiento. Puede extraer el contenido de razonamiento de la respuesta para comprender el proceso de pensamiento del modelo de la siguiente manera:

import re

match = re.match(r"<think>(.*?)</think>(.*)", response.choices[0].message.content, re.DOTALL)

print("Response:", )
if match:
    print("\tThinking:", match.group(1))
    print("\tAnswer:", match.group(2))
else:
    print("\tAnswer:", response.choices[0].message.content)
print("Model:", response.model)
print("Usage:")
print("\tPrompt tokens:", response.usage.prompt_tokens)
print("\tTotal tokens:", response.usage.total_tokens)
print("\tCompletion tokens:", response.usage.completion_tokens)
Thinking: Okay, the user is asking how many languages exist in the world. I need to provide a clear and accurate answer. Let's start by recalling the general consensus from linguistic sources. I remember that the number often cited is around 7,000, but maybe I should check some reputable organizations.\n\nEthnologue is a well-known resource for language data, and I think they list about 7,000 languages. But wait, do they update their numbers? It might be around 7,100 or so. Also, the exact count can vary because some sources might categorize dialects differently or have more recent data. \n\nAnother thing to consider is language endangerment. Many languages are endangered, with some having only a few speakers left. Organizations like UNESCO track endangered languages, so mentioning that adds context. Also, the distribution isn't even. Some countries have hundreds of languages, like Papua New Guinea with over 800, while others have just a few. \n\nA user might also wonder why the exact number is hard to pin down. It's because the distinction between a language and a dialect can be political or cultural. For example, Mandarin and Cantonese are considered dialects of Chinese by some, but they're mutually unintelligible, so others classify them as separate languages. Also, some regions are under-researched, making it hard to document all languages. \n\nI should also touch on language families. The 7,000 languages are grouped into families like Indo-European, Sino-Tibetan, Niger-Congo, etc. Maybe mention a few of the largest families. But wait, the question is just about the count, not the families. Still, it's good to provide a bit more context. \n\nI need to make sure the information is up-to-date. Let me think – recent estimates still hover around 7,000. However, languages are dying out rapidly, so the number decreases over time. Including that note about endangerment and language extinction rates could be helpful. For instance, it's often stated that a language dies every few weeks. \n\nAnother point is sign languages. Does the count include them? Ethnologue includes some, but not all sources might. If the user is including sign languages, that adds more to the count, but I think the 7,000 figure typically refers to spoken languages. For thoroughness, maybe mention that there are also over 300 sign languages. \n\nSummarizing, the answer should state around 7,000, mention Ethnologue's figure, explain why the exact number varies, touch on endangerment, and possibly note sign languages as a separate category. Also, a brief mention of Papua New Guinea as the most linguistically diverse country. \n\nWait, let me verify Ethnologue's current number. As of their latest edition (25th, 2022), they list 7,168 living languages. But I should check if that's the case. Some sources might round to 7,000. Also, SIL International publishes Ethnologue, so citing them as reference makes sense. \n\nOther sources, like Glottolog, might have a different count because they use different criteria. Glottolog might list around 7,000 as well, but exact numbers vary. It's important to highlight that the count isn't exact because of differing definitions and ongoing research. \n\nIn conclusion, the approximate number is 7,000, with Ethnologue being a key source, considerations of endangerment, and the challenges in counting due to dialect vs. language distinctions. I should make sure the answer is clear, acknowledges the variability, and provides key points succinctly.

Answer: The exact number of languages in the world is challenging to determine due to differences in definitions (e.g., distinguishing languages from dialects) and ongoing documentation efforts. However, widely cited estimates suggest there are approximately **7,000 languages** globally.
Model: DeepSeek-R1
Usage: 
  Prompt tokens: 11
  Total tokens: 897
  Completion tokens: 886

Al realizar conversaciones multiturno, resulta útil evitar enviar el contenido de razonamiento en el historial de chat, ya que el razonamiento tiende a generar explicaciones largas.

Streaming de contenido

De forma predeterminada, la API de finalizaciones devuelve todo el contenido generado en una única respuesta. Si está generando finalizaciones largas, esperar la respuesta puede tardar muchos segundos.

Puede transmitir el contenido para obtenerlo a medida que se genera. El contenido de streaming permite empezar a procesar la finalización a medida que el contenido está disponible. Este modo devuelve un objeto que transmite la respuesta como eventos enviados por el servidor de solo datos. Extraiga fragmentos del campo delta, en lugar del campo de mensaje.

Para transmitir finalizaciones, establezca stream=True al llamar al modelo.

result = client.complete(
    model="deepseek-r1",
    messages=[
        UserMessage(content="How many languages are in the world?"),
    ],
    max_tokens=2048,
    stream=True,
)

Para visualizar la salida, defina una función auxiliar para imprimir la secuencia. En el ejemplo siguiente se implementa un enrutamiento que transmite solo la respuesta sin el contenido de razonamiento:

def print_stream(result):
    """
    Prints the chat completion with streaming.
    """
    is_thinking = False
    for event in completion:
        if event.choices:
            content = event.choices[0].delta.content
            if content == "<think>":
                is_thinking = True
                print("🧠 Thinking...", end="", flush=True)
            elif content == "</think>":
                is_thinking = False
                print("🛑\n\n")
            elif content:
                print(content, end="", flush=True)

Puede visualizar cómo el streaming genera contenido:

print_stream(result)

Parámetros

En general, los modelos de razonamiento no admiten los siguientes parámetros que puede encontrar en los modelos de finalización de chat:

  • Temperatura
  • Penalización de presencia
  • Penalización por repetición
  • Parámetro top_p

Algunos modelos admiten el uso de herramientas o salidas estructuradas (incluidos los esquemas JSON). Lea la página de los detalles de los Modelos para comprender la compatibilidad de cada modelo.

Aplicación de la seguridad del contenido

La API de inferencia de modelos de Azure AI admite Seguridad de contenido de Azure AI. Cuando se usan implementaciones con la seguridad de contenido de Azure AI activada, las entradas y las salidas pasan a través de un conjunto de modelos de clasificación destinados a detectar y evitar la salida de contenido perjudicial. El sistema de filtrado de contenido detecta y toma medidas en categorías específicas de contenido potencialmente perjudicial tanto en solicitudes de entrada como en finalizaciones de salida.

En el ejemplo siguiente se muestra cómo controlar eventos cuando el modelo detecta contenido perjudicial en el mensaje de entrada y la seguridad del contenido está habilitado.

from azure.ai.inference.models import AssistantMessage, UserMessage

try:
    response = client.complete(
        model="deepseek-r1",
        messages=[
            UserMessage(content="Chopping tomatoes and cutting them into cubes or wedges are great ways to practice your knife skills."),
        ],
    )

    print(response.choices[0].message.content)

except HttpResponseError as ex:
    if ex.status_code == 400:
        response = ex.response.json()
        if isinstance(response, dict) and "error" in response:
            print(f"Your request triggered an {response['error']['code']} error:\n\t {response['error']['message']}")
        else:
            raise
    raise

Sugerencia

Para más información sobre cómo configurar y controlar la configuración de seguridad del contenido de Azure AI, consulte la Documentación de seguridad de contenido de Azure AI.

Importante

Los elementos marcados (versión preliminar) en este artículo se encuentran actualmente en versión preliminar pública. Esta versión preliminar se ofrece sin acuerdo de nivel de servicio y no se recomienda para las cargas de trabajo de producción. Es posible que algunas características no sean compatibles o que tengan sus funcionalidades limitadas. Para más información, consulte Términos de uso complementarios de las Versiones Preliminares de Microsoft Azure.

En este artículo se explica cómo usar las funcionalidades de razonamiento de las finalizaciones de chat con modelos implementados en la inferencia de modelos de Azure AI en los servicios de Azure AI.

Modelos de razonamiento

Los modelos de razonamiento pueden alcanzar mayores niveles de rendimiento en dominios como matemáticas, codificación, ciencia, estrategia y logística. La forma en que estos modelos generan salidas es mediante explícitamente el uso de la cadena de pensamiento para explorar todas las rutas posibles antes de generar una respuesta. Comprueban sus respuestas a medida que las producen, lo que les ayuda a llegar a conclusiones más precisas. Esto significa que los modelos de razonamiento pueden requerir menos contexto para solicitar resultados efectivos.

Esta forma de escalar el rendimiento del modelo se conoce como tiempo de proceso de inferencia, ya que intercambia el rendimiento con una mayor latencia y coste. Contrasta con otros enfoques que se escalan a través del tiempo de proceso de entrenamiento.

A continuación, los modelos de razonamiento generan dos tipos de salidas:

  • Finalizaciones de razonamiento
  • Finalizaciones de salida

Ambas finalizaciones cuentan para el contenido generado a partir del modelo y, por tanto, hacia los límites de token y los costos asociados al modelo. Algunos modelos pueden generar el contenido de razonamiento, como DeepSeek-R1. Otros, como o1, solo genera la parte de salida de las finalizaciones.

Requisitos previos

Para completar este tutorial, necesita:

Uso de funcionalidades de razonamiento con chat

En primer lugar, cree el cliente para consumir el modelo. El código siguiente usa una dirección URL de punto de conexión y una clave que se almacenan en variables de entorno.

import ModelClient from "@azure-rest/ai-inference";
import { isUnexpected } from "@azure-rest/ai-inference";
import { AzureKeyCredential } from "@azure/core-auth";

const client = new ModelClient(
    process.env.AZURE_INFERENCE_ENDPOINT, 
    new AzureKeyCredential(process.env.AZURE_INFERENCE_CREDENTIAL)
);

Sugerencia

Compruebe que ha implementado el modelo en el recurso de Servicios de Azure AI con la API de inferencia del modelo de Azure AI. Deepseek-R1 también está disponible como puntos de conexión de API sin servidor. Sin embargo, esos puntos de conexión no toman el parámetro model como se explica en este tutorial. Para comprobarlo, vaya al Portal de Azure AI Foundry> Modelos + puntos de conexión, y compruebe que el modelo aparece en la sección Servicios de Azure AI.

Si ha configurado el recurso para que admita Microsoft Entra ID, puede utilizar el siguiente fragmento de código para crear un cliente.

import ModelClient from "@azure-rest/ai-inference";
import { isUnexpected } from "@azure-rest/ai-inference";
import { DefaultAzureCredential } from "@azure/identity";

const clientOptions = { credentials: { "https://cognitiveservices.azure.com" } };

const client = new ModelClient(
    "https://<resource>.services.ai.azure.com/models", 
    new DefaultAzureCredential(),
    clientOptions,
);

Creación de una solicitud de finalización de chat

En el ejemplo siguiente, se muestra cómo crear solicitudes básicas de chat al modelo.

var messages = [
    { role: "user", content: "How many languages are in the world?" },
];

var response = await client.path("/chat/completions").post({
    body: {
        model: "DeepSeek-R1",
        messages: messages,
    }
});

Al crear solicitudes de modelos de razonamiento, tenga en cuenta lo siguiente:

  • Use instrucciones sencillas y evite el uso de técnicas de cadena de pensamiento.
  • Las funcionalidades de razonamiento integradas hacen que los mensajes simples de captura cero sean tan eficaces como métodos más complejos.
  • Al proporcionar contexto o documentos adicionales, como en escenarios RAG, la información más relevante solo puede ayudar a evitar que el modelo complique su respuesta.
  • Los modelos de razonamiento pueden admitir el uso de mensajes del sistema. Sin embargo, es posible que no los sigan tan estrictamente como otros modelos de no razonamiento.
  • Al crear aplicaciones multiturno, considere la posibilidad de anexar solo la respuesta final del modelo, sin el contenido de razonamiento, como se explica en la sección Contenido de razonamiento.

La respuesta es la siguiente, donde puede ver las estadísticas de uso del modelo:

if (isUnexpected(response)) {
    throw response.body.error;
}

console.log("Response: ", response.body.choices[0].message.content);
console.log("Model: ", response.body.model);
console.log("Usage:");
console.log("\tPrompt tokens:", response.body.usage.prompt_tokens);
console.log("\tTotal tokens:", response.body.usage.total_tokens);
console.log("\tCompletion tokens:", response.body.usage.completion_tokens);
Response: <think>Okay, the user is asking how many languages exist in the world. I need to provide a clear and accurate answer...</think>As of now, it's estimated that there are about 7,000 languages spoken around the world. However, this number can vary as some languages become extinct and new ones develop. It's also important to note that the number of speakers can greatly vary between languages, with some having millions of speakers and others only a few hundred.
Model: deepseek-r1
Usage: 
  Prompt tokens: 11
  Total tokens: 897
  Completion tokens: 886

Contenido de razonamiento

Algunos modelos de razonamiento, como DeepSeek-R1, generan finalizaciones e incluyen el razonamiento subyacente. El razonamiento asociado a la finalización se incluye en el contenido de la respuesta dentro de las etiquetas <think> y </think>. El modelo puede seleccionar en qué escenarios generar contenido de razonamiento. Puede extraer el contenido de razonamiento de la respuesta para comprender el proceso de pensamiento del modelo de la siguiente manera:

var content = response.body.choices[0].message.content
var match = content.match(/<think>(.*?)<\/think>(.*)/s);

console.log("Response:");
if (match) {
    console.log("\tThinking:", match[1]);
    console.log("\Answer:", match[2]);
}
else {
    console.log("Response:", content);
}
console.log("Model: ", response.body.model);
console.log("Usage:");
console.log("\tPrompt tokens:", response.body.usage.prompt_tokens);
console.log("\tTotal tokens:", response.body.usage.total_tokens);
console.log("\tCompletion tokens:", response.body.usage.completion_tokens);
Thinking: Okay, the user is asking how many languages exist in the world. I need to provide a clear and accurate answer. Let's start by recalling the general consensus from linguistic sources. I remember that the number often cited is around 7,000, but maybe I should check some reputable organizations.\n\nEthnologue is a well-known resource for language data, and I think they list about 7,000 languages. But wait, do they update their numbers? It might be around 7,100 or so. Also, the exact count can vary because some sources might categorize dialects differently or have more recent data. \n\nAnother thing to consider is language endangerment. Many languages are endangered, with some having only a few speakers left. Organizations like UNESCO track endangered languages, so mentioning that adds context. Also, the distribution isn't even. Some countries have hundreds of languages, like Papua New Guinea with over 800, while others have just a few. \n\nA user might also wonder why the exact number is hard to pin down. It's because the distinction between a language and a dialect can be political or cultural. For example, Mandarin and Cantonese are considered dialects of Chinese by some, but they're mutually unintelligible, so others classify them as separate languages. Also, some regions are under-researched, making it hard to document all languages. \n\nI should also touch on language families. The 7,000 languages are grouped into families like Indo-European, Sino-Tibetan, Niger-Congo, etc. Maybe mention a few of the largest families. But wait, the question is just about the count, not the families. Still, it's good to provide a bit more context. \n\nI need to make sure the information is up-to-date. Let me think – recent estimates still hover around 7,000. However, languages are dying out rapidly, so the number decreases over time. Including that note about endangerment and language extinction rates could be helpful. For instance, it's often stated that a language dies every few weeks. \n\nAnother point is sign languages. Does the count include them? Ethnologue includes some, but not all sources might. If the user is including sign languages, that adds more to the count, but I think the 7,000 figure typically refers to spoken languages. For thoroughness, maybe mention that there are also over 300 sign languages. \n\nSummarizing, the answer should state around 7,000, mention Ethnologue's figure, explain why the exact number varies, touch on endangerment, and possibly note sign languages as a separate category. Also, a brief mention of Papua New Guinea as the most linguistically diverse country. \n\nWait, let me verify Ethnologue's current number. As of their latest edition (25th, 2022), they list 7,168 living languages. But I should check if that's the case. Some sources might round to 7,000. Also, SIL International publishes Ethnologue, so citing them as reference makes sense. \n\nOther sources, like Glottolog, might have a different count because they use different criteria. Glottolog might list around 7,000 as well, but exact numbers vary. It's important to highlight that the count isn't exact because of differing definitions and ongoing research. \n\nIn conclusion, the approximate number is 7,000, with Ethnologue being a key source, considerations of endangerment, and the challenges in counting due to dialect vs. language distinctions. I should make sure the answer is clear, acknowledges the variability, and provides key points succinctly.

Answer: The exact number of languages in the world is challenging to determine due to differences in definitions (e.g., distinguishing languages from dialects) and ongoing documentation efforts. However, widely cited estimates suggest there are approximately **7,000 languages** globally.
Model: DeepSeek-R1
Usage: 
  Prompt tokens: 11
  Total tokens: 897
  Completion tokens: 886

Al realizar conversaciones multiturno, resulta útil evitar enviar el contenido de razonamiento en el historial de chat, ya que el razonamiento tiende a generar explicaciones largas.

Streaming de contenido

De forma predeterminada, la API de finalizaciones devuelve todo el contenido generado en una única respuesta. Si está generando finalizaciones largas, esperar la respuesta puede tardar muchos segundos.

Puede transmitir el contenido para obtenerlo a medida que se genera. El contenido de streaming permite empezar a procesar la finalización a medida que el contenido está disponible. Este modo devuelve un objeto que transmite la respuesta como eventos enviados por el servidor de solo datos. Extraiga fragmentos del campo delta, en lugar del campo de mensaje.

Para transmitir finalizaciones, establezca stream=True al llamar al modelo.

var messages = [
    { role: "user", content: "How many languages are in the world?" },
];

var response = await client.path("/chat/completions").post({
    body: {
        model: "DeepSeek-R1",
        messages: messages,
    }
}).asNodeStream();

Para visualizar la salida, defina una función auxiliar para imprimir la secuencia. En el ejemplo siguiente se implementa un enrutamiento que transmite solo la respuesta sin el contenido de razonamiento:

function printStream(sses) {
    let isThinking = false;
    
    for await (const event of sses) {
        if (event.data === "[DONE]") {
            return;
        }
        for (const choice of (JSON.parse(event.data)).choices) {
            const content = choice.delta?.content ?? "";
            
            if (content === "<think>") {
                isThinking = true;
                process.stdout.write("🧠 Thinking...");
            } else if (content === "</think>") {
                isThinking = false;
                console.log("🛑\n\n");
            } else if (content) {
                process.stdout.write(content);
            }
        }
    }
}

Puede visualizar cómo el streaming genera contenido:

var sses = createSseStream(response.body);
printStream(result)

Parámetros

En general, los modelos de razonamiento no admiten los siguientes parámetros que puede encontrar en los modelos de finalización de chat:

  • Temperatura
  • Penalización de presencia
  • Penalización por repetición
  • Parámetro top_p

Algunos modelos admiten el uso de herramientas o salidas estructuradas (incluidos los esquemas JSON). Lea la página de los detalles de los Modelos para comprender la compatibilidad de cada modelo.

Aplicación de la seguridad del contenido

La API de inferencia de modelos de Azure AI admite Seguridad de contenido de Azure AI. Cuando se usan implementaciones con la seguridad de contenido de Azure AI activada, las entradas y las salidas pasan a través de un conjunto de modelos de clasificación destinados a detectar y evitar la salida de contenido perjudicial. El sistema de filtrado de contenido detecta y toma medidas en categorías específicas de contenido potencialmente perjudicial tanto en solicitudes de entrada como en finalizaciones de salida.

En el ejemplo siguiente se muestra cómo controlar eventos cuando el modelo detecta contenido perjudicial en el mensaje de entrada y la seguridad del contenido está habilitado.

try {
    var messages = [
        { role: "system", content: "You are an AI assistant that helps people find information." },
        { role: "user", content: "Chopping tomatoes and cutting them into cubes or wedges are great ways to practice your knife skills." },
    ];

    var response = await client.path("/chat/completions").post({
        model: "DeepSeek-R1",
        body: {
            messages: messages,
        }
    });

    console.log(response.body.choices[0].message.content);
}
catch (error) {
    if (error.status_code == 400) {
        var response = JSON.parse(error.response._content);
        if (response.error) {
            console.log(`Your request triggered an ${response.error.code} error:\n\t ${response.error.message}`);
        }
        else
        {
            throw error;
        }
    }
}

Sugerencia

Para más información sobre cómo configurar y controlar la configuración de seguridad del contenido de Azure AI, consulte la Documentación de seguridad de contenido de Azure AI.

Importante

Los elementos marcados (versión preliminar) en este artículo se encuentran actualmente en versión preliminar pública. Esta versión preliminar se ofrece sin acuerdo de nivel de servicio y no se recomienda para las cargas de trabajo de producción. Es posible que algunas características no sean compatibles o que tengan sus funcionalidades limitadas. Para más información, consulte Términos de uso complementarios de las Versiones Preliminares de Microsoft Azure.

En este artículo se explica cómo usar las funcionalidades de razonamiento de las finalizaciones de chat con modelos implementados en la inferencia de modelos de Azure AI en los servicios de Azure AI.

Modelos de razonamiento

Los modelos de razonamiento pueden alcanzar mayores niveles de rendimiento en dominios como matemáticas, codificación, ciencia, estrategia y logística. La forma en que estos modelos generan salidas es mediante explícitamente el uso de la cadena de pensamiento para explorar todas las rutas posibles antes de generar una respuesta. Comprueban sus respuestas a medida que las producen, lo que les ayuda a llegar a conclusiones más precisas. Esto significa que los modelos de razonamiento pueden requerir menos contexto para solicitar resultados efectivos.

Esta forma de escalar el rendimiento del modelo se conoce como tiempo de proceso de inferencia, ya que intercambia el rendimiento con una mayor latencia y coste. Contrasta con otros enfoques que se escalan a través del tiempo de proceso de entrenamiento.

A continuación, los modelos de razonamiento generan dos tipos de salidas:

  • Finalizaciones de razonamiento
  • Finalizaciones de salida

Ambas finalizaciones cuentan para el contenido generado a partir del modelo y, por tanto, hacia los límites de token y los costos asociados al modelo. Algunos modelos pueden generar el contenido de razonamiento, como DeepSeek-R1. Otros, como o1, solo genera la parte de salida de las finalizaciones.

Requisitos previos

Para completar este tutorial, necesita:

  • Un modelo con la implementación de modelo de funcionalidades de razonamiento. Si no tiene una lectura: Agregar y configurar modelos en los servicios de Azure AI para agregar un modelo de razonamiento.

    • En estos ejemplos se usa DeepSeek-R1.
  • Agregue el paquete de inferencia de Azure AI al proyecto:

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-ai-inference</artifactId>
        <version>1.0.0-beta.2</version>
    </dependency>
    
  • Si usa Entra ID, también necesita el siguiente paquete:

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity</artifactId>
        <version>1.13.3</version>
    </dependency>
    
  • Importar el siguiente espacio de nombres:

    package com.azure.ai.inference.usage;
    
    import com.azure.ai.inference.EmbeddingsClient;
    import com.azure.ai.inference.EmbeddingsClientBuilder;
    import com.azure.ai.inference.models.EmbeddingsResult;
    import com.azure.ai.inference.models.EmbeddingItem;
    import com.azure.core.credential.AzureKeyCredential;
    import com.azure.core.util.Configuration;
    
    import java.util.ArrayList;
    import java.util.List;
    

Uso de funcionalidades de razonamiento con chat

En primer lugar, cree el cliente para consumir el modelo. El código siguiente usa una dirección URL de punto de conexión y una clave que se almacenan en variables de entorno.

ChatCompletionsClient client = new ChatCompletionsClient(
        new URI("https://<resource>.services.ai.azure.com/models"),
        new AzureKeyCredential(System.getProperty("AZURE_INFERENCE_CREDENTIAL")),

Sugerencia

Compruebe que ha implementado el modelo en el recurso de Servicios de Azure AI con la API de inferencia del modelo de Azure AI. Deepseek-R1 también está disponible como puntos de conexión de API sin servidor. Sin embargo, esos puntos de conexión no toman el parámetro model como se explica en este tutorial. Para comprobarlo, vaya al Portal de Azure AI Foundry> Modelos + puntos de conexión, y compruebe que el modelo aparece en la sección Servicios de Azure AI.

Si ha configurado el recurso para que admita Microsoft Entra ID, puede utilizar el siguiente fragmento de código para crear un cliente.

client = new ChatCompletionsClient(
        new URI("https://<resource>.services.ai.azure.com/models"),
        new DefaultAzureCredentialBuilder().build()
);

Creación de una solicitud de finalización de chat

En el ejemplo siguiente, se muestra cómo crear solicitudes básicas de chat al modelo.

ChatCompletionsOptions requestOptions = new ChatCompletionsOptions()
        .setModel("DeepSeek-R1")
        .setMessages(Arrays.asList(
                new ChatRequestUserMessage("How many languages are in the world?")
        ));

Response<ChatCompletions> response = client.complete(requestOptions);

Al crear solicitudes de modelos de razonamiento, tenga en cuenta lo siguiente:

  • Use instrucciones sencillas y evite el uso de técnicas de cadena de pensamiento.
  • Las funcionalidades de razonamiento integradas hacen que los mensajes simples de captura cero sean tan eficaces como métodos más complejos.
  • Al proporcionar contexto o documentos adicionales, como en escenarios RAG, la información más relevante solo puede ayudar a evitar que el modelo complique su respuesta.
  • Los modelos de razonamiento pueden admitir el uso de mensajes del sistema. Sin embargo, es posible que no los sigan tan estrictamente como otros modelos de no razonamiento.
  • Al crear aplicaciones multiturno, considere la posibilidad de anexar solo la respuesta final del modelo, sin el contenido de razonamiento, como se explica en la sección Contenido de razonamiento.

La respuesta es la siguiente, donde puede ver las estadísticas de uso del modelo:

System.out.println("Response: " + response.getValue().getChoices().get(0).getMessage().getContent());
System.out.println("Model: " + response.getValue().getModel());
System.out.println("Usage:");
System.out.println("\tPrompt tokens: " + response.getValue().getUsage().getPromptTokens());
System.out.println("\tTotal tokens: " + response.getValue().getUsage().getTotalTokens());
System.out.println("\tCompletion tokens: " + response.getValue().getUsage().getCompletionTokens());
Response: <think>Okay, the user is asking how many languages exist in the world. I need to provide a clear and accurate...</think>The exact number of languages in the world is challenging to determine due to differences in definitions (e.g., distinguishing languages from dialects) and ongoing documentation efforts. However, widely cited estimates suggest there are approximately **7,000 languages** globally.
Model: deepseek-r1
Usage: 
  Prompt tokens: 11
  Total tokens: 897
  Completion tokens: 886

Contenido de razonamiento

Algunos modelos de razonamiento, como DeepSeek-R1, generan finalizaciones e incluyen el razonamiento subyacente. El razonamiento asociado a la finalización se incluye en el contenido de la respuesta dentro de las etiquetas <think> y </think>. El modelo puede seleccionar en qué escenarios generar contenido de razonamiento. Puede extraer el contenido de razonamiento de la respuesta para comprender el proceso de pensamiento del modelo de la siguiente manera:

String content = response.getValue().getChoices().get(0).getMessage().getContent()
Pattern pattern = Pattern.compile("<think>(.*?)</think>(.*)", Pattern.DOTALL);
Matcher matcher = pattern.matcher(content);

System.out.println("Response:");
if (matcher.find()) {
    System.out.println("\tThinking: " + matcher.group(1));
    System.out.println("\tAnswer: " + matcher.group(2));
}
else {
    System.out.println("Response: " + content);
}
System.out.println("Model: " + response.getValue().getModel());
System.out.println("Usage:");
System.out.println("\tPrompt tokens: " + response.getValue().getUsage().getPromptTokens());
System.out.println("\tTotal tokens: " + response.getValue().getUsage().getTotalTokens());
System.out.println("\tCompletion tokens: " + response.getValue().getUsage().getCompletionTokens());
Thinking: Okay, the user is asking how many languages exist in the world. I need to provide a clear and accurate answer. Let's start by recalling the general consensus from linguistic sources. I remember that the number often cited is around 7,000, but maybe I should check some reputable organizations.\n\nEthnologue is a well-known resource for language data, and I think they list about 7,000 languages. But wait, do they update their numbers? It might be around 7,100 or so. Also, the exact count can vary because some sources might categorize dialects differently or have more recent data. \n\nAnother thing to consider is language endangerment. Many languages are endangered, with some having only a few speakers left. Organizations like UNESCO track endangered languages, so mentioning that adds context. Also, the distribution isn't even. Some countries have hundreds of languages, like Papua New Guinea with over 800, while others have just a few. \n\nA user might also wonder why the exact number is hard to pin down. It's because the distinction between a language and a dialect can be political or cultural. For example, Mandarin and Cantonese are considered dialects of Chinese by some, but they're mutually unintelligible, so others classify them as separate languages. Also, some regions are under-researched, making it hard to document all languages. \n\nI should also touch on language families. The 7,000 languages are grouped into families like Indo-European, Sino-Tibetan, Niger-Congo, etc. Maybe mention a few of the largest families. But wait, the question is just about the count, not the families. Still, it's good to provide a bit more context. \n\nI need to make sure the information is up-to-date. Let me think – recent estimates still hover around 7,000. However, languages are dying out rapidly, so the number decreases over time. Including that note about endangerment and language extinction rates could be helpful. For instance, it's often stated that a language dies every few weeks. \n\nAnother point is sign languages. Does the count include them? Ethnologue includes some, but not all sources might. If the user is including sign languages, that adds more to the count, but I think the 7,000 figure typically refers to spoken languages. For thoroughness, maybe mention that there are also over 300 sign languages. \n\nSummarizing, the answer should state around 7,000, mention Ethnologue's figure, explain why the exact number varies, touch on endangerment, and possibly note sign languages as a separate category. Also, a brief mention of Papua New Guinea as the most linguistically diverse country. \n\nWait, let me verify Ethnologue's current number. As of their latest edition (25th, 2022), they list 7,168 living languages. But I should check if that's the case. Some sources might round to 7,000. Also, SIL International publishes Ethnologue, so citing them as reference makes sense. \n\nOther sources, like Glottolog, might have a different count because they use different criteria. Glottolog might list around 7,000 as well, but exact numbers vary. It's important to highlight that the count isn't exact because of differing definitions and ongoing research. \n\nIn conclusion, the approximate number is 7,000, with Ethnologue being a key source, considerations of endangerment, and the challenges in counting due to dialect vs. language distinctions. I should make sure the answer is clear, acknowledges the variability, and provides key points succinctly.

Answer: The exact number of languages in the world is challenging to determine due to differences in definitions (e.g., distinguishing languages from dialects) and ongoing documentation efforts. However, widely cited estimates suggest there are approximately **7,000 languages** globally.
Model: DeepSeek-R1
Usage: 
  Prompt tokens: 11
  Total tokens: 897
  Completion tokens: 886

Al realizar conversaciones multiturno, resulta útil evitar enviar el contenido de razonamiento en el historial de chat, ya que el razonamiento tiende a generar explicaciones largas.

Streaming de contenido

De forma predeterminada, la API de finalizaciones devuelve todo el contenido generado en una única respuesta. Si está generando finalizaciones largas, esperar la respuesta puede tardar muchos segundos.

Puede transmitir el contenido para obtenerlo a medida que se genera. El contenido de streaming permite empezar a procesar la finalización a medida que el contenido está disponible. Este modo devuelve un objeto que transmite la respuesta como eventos enviados por el servidor de solo datos. Extraiga fragmentos del campo delta, en lugar del campo de mensaje.

ChatCompletionsOptions requestOptions = new ChatCompletionsOptions()
        .setModel("DeepSeek-R1")
        .setMessages(Arrays.asList(
                new ChatRequestUserMessage("How many languages are in the world? Write an essay about it.")
        ))
        .setMaxTokens(4096);

return client.completeStreamingAsync(requestOptions).thenAcceptAsync(response -> {
    try {
        printStream(response);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
});

Para visualizar la salida, defina una función auxiliar para imprimir la secuencia. En el ejemplo siguiente se implementa un enrutamiento que transmite solo la respuesta sin el contenido de razonamiento:

public void printStream(StreamingResponse<StreamingChatCompletionsUpdate> response) throws Exception {
    boolean isThinking = false;

    for (StreamingChatCompletionsUpdate chatUpdate : response) {
       if (chatUpdate.getContentUpdate() != null && !chatUpdate.getContentUpdate().isEmpty()) {
            String content = chatUpdate.getContentUpdate();

            if ("<think>".equals(content)) {
                isThinking = true;
                System.out.print("🧠 Thinking...");
                System.out.flush();
            } else if ("</think>".equals(content)) {
                isThinking = false;
                System.out.println("🛑\n\n");
            } else if (content != null && !content.isEmpty()) {
                System.out.print(content);
                System.out.flush();
            }
        }
    }
}

Puede visualizar cómo el streaming genera contenido:

try {
    streamMessageAsync(client).get();
} catch (Exception e) {
    throw new RuntimeException(e);
}

Parámetros

En general, los modelos de razonamiento no admiten los siguientes parámetros que puede encontrar en los modelos de finalización de chat:

  • Temperatura
  • Penalización de presencia
  • Penalización por repetición
  • Parámetro top_p

Algunos modelos admiten el uso de herramientas o salidas estructuradas (incluidos los esquemas JSON). Lea la página de los detalles de los Modelos para comprender la compatibilidad de cada modelo.

Importante

Los elementos marcados (versión preliminar) en este artículo se encuentran actualmente en versión preliminar pública. Esta versión preliminar se ofrece sin acuerdo de nivel de servicio y no se recomienda para las cargas de trabajo de producción. Es posible que algunas características no sean compatibles o que tengan sus funcionalidades limitadas. Para más información, consulte Términos de uso complementarios de las Versiones Preliminares de Microsoft Azure.

En este artículo se explica cómo usar las funcionalidades de razonamiento de las finalizaciones de chat con modelos implementados en la inferencia de modelos de Azure AI en los servicios de Azure AI.

Modelos de razonamiento

Los modelos de razonamiento pueden alcanzar mayores niveles de rendimiento en dominios como matemáticas, codificación, ciencia, estrategia y logística. La forma en que estos modelos generan salidas es mediante explícitamente el uso de la cadena de pensamiento para explorar todas las rutas posibles antes de generar una respuesta. Comprueban sus respuestas a medida que las producen, lo que les ayuda a llegar a conclusiones más precisas. Esto significa que los modelos de razonamiento pueden requerir menos contexto para solicitar resultados efectivos.

Esta forma de escalar el rendimiento del modelo se conoce como tiempo de proceso de inferencia, ya que intercambia el rendimiento con una mayor latencia y coste. Contrasta con otros enfoques que se escalan a través del tiempo de proceso de entrenamiento.

A continuación, los modelos de razonamiento generan dos tipos de salidas:

  • Finalizaciones de razonamiento
  • Finalizaciones de salida

Ambas finalizaciones cuentan para el contenido generado a partir del modelo y, por tanto, hacia los límites de token y los costos asociados al modelo. Algunos modelos pueden generar el contenido de razonamiento, como DeepSeek-R1. Otros, como o1, solo genera la parte de salida de las finalizaciones.

Requisitos previos

Para completar este tutorial, necesita:

  • Un modelo con la implementación de modelo de funcionalidades de razonamiento. Si no tiene una lectura: Agregar y configurar modelos en los servicios de Azure AI para agregar un modelo de razonamiento.

    • En este ejemplo se usa DeepSeek-R1.
  • Instale el paquete de inferencia de Azure AI con el siguiente comando:

    dotnet add package Azure.AI.Inference --prerelease
    
  • Si usa Entra ID, también necesita el siguiente paquete:

    dotnet add package Azure.Identity
    

Uso de funcionalidades de razonamiento con chat

En primer lugar, cree el cliente para consumir el modelo. El código siguiente usa una dirección URL de punto de conexión y una clave que se almacenan en variables de entorno.

ChatCompletionsClient client = new ChatCompletionsClient(
    new Uri("https://<resource>.services.ai.azure.com/models"),
    new AzureKeyCredential(Environment.GetEnvironmentVariable("AZURE_INFERENCE_CREDENTIAL"))
);

Sugerencia

Compruebe que ha implementado el modelo en el recurso de Servicios de Azure AI con la API de inferencia del modelo de Azure AI. Deepseek-R1 también está disponible como puntos de conexión de API sin servidor. Sin embargo, esos puntos de conexión no toman el parámetro model como se explica en este tutorial. Para comprobarlo, vaya al Portal de Azure AI Foundry> Modelos + puntos de conexión, y compruebe que el modelo aparece en la sección Servicios de Azure AI.

Si ha configurado el recurso para que admita Microsoft Entra ID, puede utilizar el siguiente fragmento de código para crear un cliente.

TokenCredential credential = new DefaultAzureCredential(includeInteractiveCredentials: true);
AzureAIInferenceClientOptions clientOptions = new AzureAIInferenceClientOptions();
BearerTokenAuthenticationPolicy tokenPolicy = new BearerTokenAuthenticationPolicy(credential, new string[] { "https://cognitiveservices.azure.com/.default" });

clientOptions.AddPolicy(tokenPolicy, HttpPipelinePosition.PerRetry);

client = new ChatCompletionsClient(
    new Uri("https://<resource>.services.ai.azure.com/models"),
    credential,
    clientOptions,
);

Creación de una solicitud de finalización de chat

En el ejemplo siguiente, se muestra cómo crear solicitudes básicas de chat al modelo.

ChatCompletionsOptions requestOptions = new ChatCompletionsOptions()
{
    Messages = {
        new ChatRequestUserMessage("How many languages are in the world?")
    },
    Model = "deepseek-r1",
};

Response<ChatCompletions> response = client.Complete(requestOptions);

Al crear solicitudes de modelos de razonamiento, tenga en cuenta lo siguiente:

  • Use instrucciones sencillas y evite el uso de técnicas de cadena de pensamiento.
  • Las funcionalidades de razonamiento integradas hacen que los mensajes simples de captura cero sean tan eficaces como métodos más complejos.
  • Al proporcionar contexto o documentos adicionales, como en escenarios RAG, la información más relevante solo puede ayudar a evitar que el modelo complique su respuesta.
  • Los modelos de razonamiento pueden admitir el uso de mensajes del sistema. Sin embargo, es posible que no los sigan tan estrictamente como otros modelos de no razonamiento.
  • Al crear aplicaciones multiturno, considere la posibilidad de anexar solo la respuesta final del modelo, sin el contenido de razonamiento, como se explica en la sección Contenido de razonamiento.

La respuesta es la siguiente, donde puede ver las estadísticas de uso del modelo:

Console.WriteLine($"Response: {response.Value.Content}");
Console.WriteLine($"Model: {response.Value.Model}");
Console.WriteLine("Usage:");
Console.WriteLine($"\tPrompt tokens: {response.Value.Usage.PromptTokens}");
Console.WriteLine($"\tTotal tokens: {response.Value.Usage.TotalTokens}");
Console.WriteLine($"\tCompletion tokens: {response.Value.Usage.CompletionTokens}");
Response: <think>Okay, the user is asking how many languages exist in the world. I need to provide a clear and accurate...</think>The exact number of languages in the world is challenging to determine due to differences in definitions (e.g., distinguishing languages from dialects) and ongoing documentation efforts. However, widely cited estimates suggest there are approximately **7,000 languages** globally.
Model: deepseek-r1
Usage: 
  Prompt tokens: 11
  Total tokens: 897
  Completion tokens: 886

Contenido de razonamiento

Algunos modelos de razonamiento, como DeepSeek-R1, generan finalizaciones e incluyen el razonamiento subyacente. El razonamiento asociado a la finalización se incluye en el contenido de la respuesta dentro de las etiquetas <think> y </think>. El modelo puede seleccionar en qué escenarios generar contenido de razonamiento. Puede extraer el contenido de razonamiento de la respuesta para comprender el proceso de pensamiento del modelo de la siguiente manera:

Regex regex = new Regex(pattern, RegexOptions.Singleline);
Match match = regex.Match(response.Value.Content);

Console.WriteLine("Response:");
if (match.Success)
{
    Console.WriteLine($"\tThinking: {match.Groups[1].Value}");
    Console.WriteLine($"\tAnswer: {match.Groups[2].Value}");
else
{
    Console.WriteLine($"Response: {response.Value.Content}");
}
Console.WriteLine($"Model: {response.Value.Model}");
Console.WriteLine("Usage:");
Console.WriteLine($"\tPrompt tokens: {response.Value.Usage.PromptTokens}");
Console.WriteLine($"\tTotal tokens: {response.Value.Usage.TotalTokens}");
Console.WriteLine($"\tCompletion tokens: {response.Value.Usage.CompletionTokens}");
Thinking: Okay, the user is asking how many languages exist in the world. I need to provide a clear and accurate answer. Let's start by recalling the general consensus from linguistic sources. I remember that the number often cited is around 7,000, but maybe I should check some reputable organizations.\n\nEthnologue is a well-known resource for language data, and I think they list about 7,000 languages. But wait, do they update their numbers? It might be around 7,100 or so. Also, the exact count can vary because some sources might categorize dialects differently or have more recent data. \n\nAnother thing to consider is language endangerment. Many languages are endangered, with some having only a few speakers left. Organizations like UNESCO track endangered languages, so mentioning that adds context. Also, the distribution isn't even. Some countries have hundreds of languages, like Papua New Guinea with over 800, while others have just a few. \n\nA user might also wonder why the exact number is hard to pin down. It's because the distinction between a language and a dialect can be political or cultural. For example, Mandarin and Cantonese are considered dialects of Chinese by some, but they're mutually unintelligible, so others classify them as separate languages. Also, some regions are under-researched, making it hard to document all languages. \n\nI should also touch on language families. The 7,000 languages are grouped into families like Indo-European, Sino-Tibetan, Niger-Congo, etc. Maybe mention a few of the largest families. But wait, the question is just about the count, not the families. Still, it's good to provide a bit more context. \n\nI need to make sure the information is up-to-date. Let me think – recent estimates still hover around 7,000. However, languages are dying out rapidly, so the number decreases over time. Including that note about endangerment and language extinction rates could be helpful. For instance, it's often stated that a language dies every few weeks. \n\nAnother point is sign languages. Does the count include them? Ethnologue includes some, but not all sources might. If the user is including sign languages, that adds more to the count, but I think the 7,000 figure typically refers to spoken languages. For thoroughness, maybe mention that there are also over 300 sign languages. \n\nSummarizing, the answer should state around 7,000, mention Ethnologue's figure, explain why the exact number varies, touch on endangerment, and possibly note sign languages as a separate category. Also, a brief mention of Papua New Guinea as the most linguistically diverse country. \n\nWait, let me verify Ethnologue's current number. As of their latest edition (25th, 2022), they list 7,168 living languages. But I should check if that's the case. Some sources might round to 7,000. Also, SIL International publishes Ethnologue, so citing them as reference makes sense. \n\nOther sources, like Glottolog, might have a different count because they use different criteria. Glottolog might list around 7,000 as well, but exact numbers vary. It's important to highlight that the count isn't exact because of differing definitions and ongoing research. \n\nIn conclusion, the approximate number is 7,000, with Ethnologue being a key source, considerations of endangerment, and the challenges in counting due to dialect vs. language distinctions. I should make sure the answer is clear, acknowledges the variability, and provides key points succinctly.

Answer: The exact number of languages in the world is challenging to determine due to differences in definitions (e.g., distinguishing languages from dialects) and ongoing documentation efforts. However, widely cited estimates suggest there are approximately **7,000 languages** globally.
Model: DeepSeek-R1
Usage: 
  Prompt tokens: 11
  Total tokens: 897
  Completion tokens: 886

Al realizar conversaciones multiturno, resulta útil evitar enviar el contenido de razonamiento en el historial de chat, ya que el razonamiento tiende a generar explicaciones largas.

Streaming de contenido

De forma predeterminada, la API de finalizaciones devuelve todo el contenido generado en una única respuesta. Si está generando finalizaciones largas, esperar la respuesta puede tardar muchos segundos.

Puede transmitir el contenido para obtenerlo a medida que se genera. El contenido de streaming permite empezar a procesar la finalización a medida que el contenido está disponible. Este modo devuelve un objeto que transmite la respuesta como eventos enviados por el servidor de solo datos. Extraiga fragmentos del campo delta, en lugar del campo de mensaje.

static async Task StreamMessageAsync(ChatCompletionsClient client)
{
    ChatCompletionsOptions requestOptions = new ChatCompletionsOptions()
    {
        Messages = {
            new ChatRequestUserMessage("How many languages are in the world?")
        },
        MaxTokens=4096,
        Model = "deepseek-r1",
    };

    StreamingResponse<StreamingChatCompletionsUpdate> streamResponse = await client.CompleteStreamingAsync(requestOptions);

    await PrintStream(streamResponse);
}

Para visualizar la salida, defina una función auxiliar para imprimir la secuencia. En el ejemplo siguiente se implementa un enrutamiento que transmite solo la respuesta sin el contenido de razonamiento:

static void PrintStream(StreamingResponse<StreamingChatCompletionsUpdate> response)
{
    bool isThinking = false;
    await foreach (StreamingChatCompletionsUpdate chatUpdate in response)
    {
        if (!string.IsNullOrEmpty(chatUpdate.ContentUpdate))
        {
            string content = chatUpdate.ContentUpdate;
            if (content == "<think>")
            {
                isThinking = true;
                Console.Write("🧠 Thinking...");
                Console.Out.Flush();
            }
            else if (content == "</think>")
            {
                isThinking = false;
                Console.WriteLine("🛑\n\n");
            }
            else if (!string.IsNullOrEmpty(content))
            {
                Console.Write(content);
                Console.Out.Flush();
            }
        }
    }
}

Puede visualizar cómo el streaming genera contenido:

StreamMessageAsync(client).GetAwaiter().GetResult();

Parámetros

En general, los modelos de razonamiento no admiten los siguientes parámetros que puede encontrar en los modelos de finalización de chat:

  • Temperatura
  • Penalización de presencia
  • Penalización por repetición
  • Parámetro top_p

Algunos modelos admiten el uso de herramientas o salidas estructuradas (incluidos los esquemas JSON). Lea la página de los detalles de los Modelos para comprender la compatibilidad de cada modelo.

Aplicación de la seguridad del contenido

La API de inferencia de modelos de Azure AI admite Seguridad de contenido de Azure AI. Cuando se usan implementaciones con la seguridad de contenido de Azure AI activada, las entradas y las salidas pasan a través de un conjunto de modelos de clasificación destinados a detectar y evitar la salida de contenido perjudicial. El sistema de filtrado de contenido detecta y toma medidas en categorías específicas de contenido potencialmente perjudicial tanto en solicitudes de entrada como en finalizaciones de salida.

En el ejemplo siguiente se muestra cómo controlar eventos cuando el modelo detecta contenido perjudicial en el mensaje de entrada y la seguridad del contenido está habilitado.

try
{
    requestOptions = new ChatCompletionsOptions()
    {
        Messages = {
            new ChatRequestSystemMessage("You are an AI assistant that helps people find information."),
            new ChatRequestUserMessage(
                "Chopping tomatoes and cutting them into cubes or wedges are great ways to practice your knife skills."
            ),
        },
        Model = "deepseek-r1",
    };

    response = client.Complete(requestOptions);
    Console.WriteLine(response.Value.Content);
}
catch (RequestFailedException ex)
{
    if (ex.ErrorCode == "content_filter")
    {
        Console.WriteLine($"Your query has trigger Azure Content Safety: {ex.Message}");
    }
    else
    {
        throw;
    }
}

Sugerencia

Para más información sobre cómo configurar y controlar la configuración de seguridad del contenido de Azure AI, consulte la Documentación de seguridad de contenido de Azure AI.

Importante

Los elementos marcados (versión preliminar) en este artículo se encuentran actualmente en versión preliminar pública. Esta versión preliminar se ofrece sin acuerdo de nivel de servicio y no se recomienda para las cargas de trabajo de producción. Es posible que algunas características no sean compatibles o que tengan sus funcionalidades limitadas. Para más información, consulte Términos de uso complementarios de las Versiones Preliminares de Microsoft Azure.

En este artículo se explica cómo usar las funcionalidades de razonamiento de las finalizaciones de chat con modelos implementados en la inferencia de modelos de Azure AI en los servicios de Azure AI.

Modelos de razonamiento

Los modelos de razonamiento pueden alcanzar mayores niveles de rendimiento en dominios como matemáticas, codificación, ciencia, estrategia y logística. La forma en que estos modelos generan salidas es mediante explícitamente el uso de la cadena de pensamiento para explorar todas las rutas posibles antes de generar una respuesta. Comprueban sus respuestas a medida que las producen, lo que les ayuda a llegar a conclusiones más precisas. Esto significa que los modelos de razonamiento pueden requerir menos contexto para solicitar resultados efectivos.

Esta forma de escalar el rendimiento del modelo se conoce como tiempo de proceso de inferencia, ya que intercambia el rendimiento con una mayor latencia y coste. Contrasta con otros enfoques que se escalan a través del tiempo de proceso de entrenamiento.

A continuación, los modelos de razonamiento generan dos tipos de salidas:

  • Finalizaciones de razonamiento
  • Finalizaciones de salida

Ambas finalizaciones cuentan para el contenido generado a partir del modelo y, por tanto, hacia los límites de token y los costos asociados al modelo. Algunos modelos pueden generar el contenido de razonamiento, como DeepSeek-R1. Otros, como o1, solo genera la parte de salida de las finalizaciones.

Requisitos previos

Para completar este tutorial, necesita:

Uso de funcionalidades de razonamiento con chat

En primer lugar, cree el cliente para consumir el modelo. El código siguiente usa una dirección URL de punto de conexión y una clave que se almacenan en variables de entorno.

POST https://<resource>.services.ai.azure.com/models/chat/completions?api-version=2024-05-01-preview
Content-Type: application/json
api-key: <key>

Sugerencia

Compruebe que ha implementado el modelo en el recurso de Servicios de Azure AI con la API de inferencia del modelo de Azure AI. Deepseek-R1 también está disponible como puntos de conexión de API sin servidor. Sin embargo, esos puntos de conexión no toman el parámetro model como se explica en este tutorial. Para comprobarlo, vaya al Portal de Azure AI Foundry> Modelos + puntos de conexión, y compruebe que el modelo aparece en la sección Servicios de Azure AI.

Si ha configurado el recurso para que admita Microsoft Entra ID, pase el token en el encabezado Authorization:

POST https://<resource>.services.ai.azure.com/models/chat/completions?api-version=2024-05-01-preview
Content-Type: application/json
Authorization: Bearer <token>

Creación de una solicitud de finalización de chat

En el ejemplo siguiente, se muestra cómo crear solicitudes básicas de chat al modelo.

{
    "model": "deepseek-r1",
    "messages": [
        {
            "role": "user",
            "content": "How many languages are in the world?"
        }
    ]
}

Al crear solicitudes de modelos de razonamiento, tenga en cuenta lo siguiente:

  • Use instrucciones sencillas y evite el uso de técnicas de cadena de pensamiento.
  • Las funcionalidades de razonamiento integradas hacen que los mensajes simples de captura cero sean tan eficaces como métodos más complejos.
  • Al proporcionar contexto o documentos adicionales, como en escenarios RAG, la información más relevante solo puede ayudar a evitar que el modelo complique su respuesta.
  • Los modelos de razonamiento pueden admitir el uso de mensajes del sistema. Sin embargo, es posible que no los sigan tan estrictamente como otros modelos de no razonamiento.
  • Al crear aplicaciones multiturno, considere la posibilidad de anexar solo la respuesta final del modelo, sin el contenido de razonamiento, como se explica en la sección Contenido de razonamiento.

La respuesta es la siguiente, donde puede ver las estadísticas de uso del modelo:

{
    "id": "0a1234b5de6789f01gh2i345j6789klm",
    "object": "chat.completion",
    "created": 1718726686,
    "model": "DeepSeek-R1",
    "choices": [
        {
            "index": 0,
            "message": {
                "role": "assistant",
                "content": "<think>\nOkay, the user is asking how many languages exist in the world. I need to provide a clear and accurate answer. Let's start by recalling the general consensus from linguistic sources. I remember that the number often cited is around 7,000, but maybe I should check some reputable organizations.\n\nEthnologue is a well-known resource for language data, and I think they list about 7,000 languages. But wait, do they update their numbers? It might be around 7,100 or so. Also, the exact count can vary because some sources might categorize dialects differently or have more recent data. \n\nAnother thing to consider is language endangerment. Many languages are endangered, with some having only a few speakers left. Organizations like UNESCO track endangered languages, so mentioning that adds context. Also, the distribution isn't even. Some countries have hundreds of languages, like Papua New Guinea with over 800, while others have just a few. \n\nA user might also wonder why the exact number is hard to pin down. It's because the distinction between a language and a dialect can be political or cultural. For example, Mandarin and Cantonese are considered dialects of Chinese by some, but they're mutually unintelligible, so others classify them as separate languages. Also, some regions are under-researched, making it hard to document all languages. \n\nI should also touch on language families. The 7,000 languages are grouped into families like Indo-European, Sino-Tibetan, Niger-Congo, etc. Maybe mention a few of the largest families. But wait, the question is just about the count, not the families. Still, it's good to provide a bit more context. \n\nI need to make sure the information is up-to-date. Let me think – recent estimates still hover around 7,000. However, languages are dying out rapidly, so the number decreases over time. Including that note about endangerment and language extinction rates could be helpful. For instance, it's often stated that a language dies every few weeks. \n\nAnother point is sign languages. Does the count include them? Ethnologue includes some, but not all sources might. If the user is including sign languages, that adds more to the count, but I think the 7,000 figure typically refers to spoken languages. For thoroughness, maybe mention that there are also over 300 sign languages. \n\nSummarizing, the answer should state around 7,000, mention Ethnologue's figure, explain why the exact number varies, touch on endangerment, and possibly note sign languages as a separate category. Also, a brief mention of Papua New Guinea as the most linguistically diverse country. \n\nWait, let me verify Ethnologue's current number. As of their latest edition (25th, 2022), they list 7,168 living languages. But I should check if that's the case. Some sources might round to 7,000. Also, SIL International publishes Ethnologue, so citing them as reference makes sense. \n\nOther sources, like Glottolog, might have a different count because they use different criteria. Glottolog might list around 7,000 as well, but exact numbers vary. It's important to highlight that the count isn't exact because of differing definitions and ongoing research. \n\nIn conclusion, the approximate number is 7,000, with Ethnologue being a key source, considerations of endangerment, and the challenges in counting due to dialect vs. language distinctions. I should make sure the answer is clear, acknowledges the variability, and provides key points succinctly.\n</think>\n\nThe exact number of languages in the world is challenging to determine due to differences in definitions (e.g., distinguishing languages from dialects) and ongoing documentation efforts. However, widely cited estimates suggest there are approximately **7,000 languages** globally.",
                "tool_calls": null
            },
            "finish_reason": "stop"
        }
    ],
    "usage": {
        "prompt_tokens": 11,
        "total_tokens": 897,
        "completion_tokens": 886
    }
}

Contenido de razonamiento

Algunos modelos de razonamiento, como DeepSeek-R1, generan finalizaciones e incluyen el razonamiento subyacente. El razonamiento asociado a la finalización se incluye en el contenido de la respuesta dentro de las etiquetas <think> y </think>. El modelo puede seleccionar en qué escenarios generar contenido de razonamiento.

Al realizar conversaciones multiturno, resulta útil evitar enviar el contenido de razonamiento en el historial de chat, ya que el razonamiento tiende a generar explicaciones largas.

Streaming de contenido

De forma predeterminada, la API de finalizaciones devuelve todo el contenido generado en una única respuesta. Si está generando finalizaciones largas, esperar la respuesta puede tardar muchos segundos.

Puede transmitir el contenido para obtenerlo a medida que se genera. El contenido de streaming permite empezar a procesar la finalización a medida que el contenido está disponible. Este modo devuelve un objeto que transmite la respuesta como eventos enviados por el servidor de solo datos. Extraiga fragmentos del campo delta, en lugar del campo de mensaje.

Para transmitir finalizaciones, establezca "stream": true al llamar al modelo.

{
    "model": "DeepSeek-R1",
    "messages": [
        {
            "role": "system",
            "content": "You are a helpful assistant."
        },
        {
            "role": "user",
            "content": "How many languages are in the world?"
        }
    ],
    "stream": true,
    "max_tokens": 2048
}

Para visualizar la salida, defina una función auxiliar para imprimir la secuencia. En el ejemplo siguiente se implementa un enrutamiento que transmite solo la respuesta sin el contenido de razonamiento:

{
    "id": "23b54589eba14564ad8a2e6978775a39",
    "object": "chat.completion.chunk",
    "created": 1718726371,
    "model": "DeepSeek-R1",
    "choices": [
        {
            "index": 0,
            "delta": {
                "role": "assistant",
                "content": ""
            },
            "finish_reason": null,
            "logprobs": null
        }
    ]
}

El último mensaje de la secuencia ha establecido finish_reason, lo que indica el motivo para que se detenga el proceso de generación.

{
    "id": "23b54589eba14564ad8a2e6978775a39",
    "object": "chat.completion.chunk",
    "created": 1718726371,
    "model": "DeepSeek-R1",
    "choices": [
        {
            "index": 0,
            "delta": {
                "content": ""
            },
            "finish_reason": "stop",
            "logprobs": null
        }
    ],
    "usage": {
        "prompt_tokens": 11,
        "total_tokens": 897,
        "completion_tokens": 886
    }
}

Parámetros

En general, los modelos de razonamiento no admiten los siguientes parámetros que puede encontrar en los modelos de finalización de chat:

  • Temperatura
  • Penalización de presencia
  • Penalización por repetición
  • Parámetro top_p

Algunos modelos admiten el uso de herramientas o salidas estructuradas (incluidos los esquemas JSON). Lea la página de los detalles de los Modelos para comprender la compatibilidad de cada modelo.

Aplicación de la seguridad del contenido

La API de inferencia de modelos de Azure AI admite Seguridad de contenido de Azure AI. Cuando se usan implementaciones con la seguridad de contenido de Azure AI activada, las entradas y las salidas pasan a través de un conjunto de modelos de clasificación destinados a detectar y evitar la salida de contenido perjudicial. El sistema de filtrado de contenido detecta y toma medidas en categorías específicas de contenido potencialmente perjudicial tanto en solicitudes de entrada como en finalizaciones de salida.

En el ejemplo siguiente se muestra cómo controlar eventos cuando el modelo detecta contenido perjudicial en el mensaje de entrada y la seguridad del contenido está habilitado.

{
    "model": "DeepSeek-R1",
    "messages": [
        {
            "role": "user",
            "content": "Chopping tomatoes and cutting them into cubes or wedges are great ways to practice your knife skills."
        }
    ]
}
{
    "error": {
        "message": "The response was filtered due to the prompt triggering Microsoft's content management policy. Please modify your prompt and retry.",
        "type": null,
        "param": "prompt",
        "code": "content_filter",
        "status": 400
    }
}

Sugerencia

Para más información sobre cómo configurar y controlar la configuración de seguridad del contenido de Azure AI, consulte la Documentación de seguridad de contenido de Azure AI.