Partilhar via


Como usar modelos de raciocínio com o Azure AI Foundry Models

Importante

Os itens marcados como (pré-visualização) neste artigo estão neste momento em pré-visualização pública. Esta pré-visualização é fornecida sem um acordo de nível de serviço, e não a recomendamos para trabalhos em produção. Algumas funcionalidades poderão não ser suportadas ou poderão ter capacidades limitadas. Para obter mais informações, veja Termos Suplementares de Utilização para Pré-visualizações do Microsoft Azure.

Este artigo explica como usar os recursos de raciocínio dos modelos de conclusão de chat implantados nos Modelos de Fundição de IA do Azure.

Modelos de raciocínio

Os modelos de raciocínio podem atingir níveis mais elevados de desempenho em domínios como matemática, codificação, ciências, estratégia e logística. A maneira como esses modelos produzem resultados é usando explicitamente a cadeia de pensamento para explorar todos os caminhos possíveis antes de gerar uma resposta. Verificam as suas respostas à medida que as produzem, o que ajuda a chegar a conclusões mais precisas. Como resultado, os modelos de raciocínio podem exigir menos contexto na solicitação para produzir resultados eficazes.

Essa maneira de dimensionar o desempenho de um modelo é chamada de tempo de computação de inferência , pois negocia o desempenho com latência e custo mais altos. Em contraste, outras abordagens podem ser dimensionadas através do tempo de computação durante o treinamento.

Os modelos de raciocínio produzem dois tipos de conteúdo como saídas:

  • Conclusões do raciocínio
  • Resultados de conclusão

Ambas as finalizações contam para o conteúdo gerado a partir do modelo. Portanto, eles contribuem para os limites de tokens e os custos associados ao modelo. Alguns modelos, como DeepSeek-R1, podem responder com conteúdo de raciocínio. Outros, como o1, produzem apenas as finalizações.

Pré-requisitos

Para concluir este tutorial, você precisa:

  • Um modelo com capacidades de raciocínio para implantação de modelo. Se você não tiver um, leia Adicionar e configurar Modelos de Fundição para adicionar um modelo de raciocínio.

    • Este exemplo utiliza DeepSeek-R1.

Use recursos de raciocínio com o bate-papo

Primeiro, crie o cliente para consumir o modelo. O código a seguir usa uma URL de ponto de extremidade e uma chave que são armazenadas em variáveis de ambiente.

import os
from openai import AzureOpenAI
    
client = AzureOpenAI(
    azure_endpoint = "https://<resource>.services.ai.azure.com",
    api_key=os.getenv("AZURE_INFERENCE_CREDENTIAL"),  
    api_version="2024-10-21",
)

Se configurou o recurso com suporte a Microsoft Entra ID, pode usar o trecho de código a seguir para criar um cliente.

import os
from openai import AzureOpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default"
)

client = AzureOpenAI(
    azure_endpoint = "https://<resource>.services.ai.azure.com",
    azure_ad_token_provider=token_provider,
    api_version="2024-10-21",
)

Modelos de raciocínio rápidos

Ao criar prompts para modelos de raciocínio, leve em consideração o seguinte:

  • Use instruções simples e evite o uso de técnicas de cadeia de pensamento.
  • Os recursos de raciocínio integrados tornam os prompts simples de tiro zero tão eficazes quanto métodos mais complexos.
  • Ao fornecer contexto ou documentos adicionais, como em cenários RAG, incluir apenas as informações mais relevantes pode ajudar a evitar que o modelo complique demais sua resposta.
  • Os modelos de raciocínio podem suportar o uso de mensagens do sistema. No entanto, podem não segui-los tão estritamente como outros modelos que não são baseados no raciocínio.
  • Ao criar aplicativos de várias voltas, considere anexar apenas a resposta final do modelo, sem seu conteúdo de raciocínio, conforme explicado na seção Conteúdo de raciocínio .

Observe que os modelos de raciocínio podem levar mais tempo para gerar respostas. Utilizam longas cadeias de raciocínio que permitem uma resolução de problemas mais profunda e estruturada. Eles também realizam a autoverificação para cruzar suas respostas e corrigir seus erros, mostrando assim comportamentos autorreflexivos emergentes.

Criar uma solicitação de conclusão de bate-papo

O exemplo a seguir mostra como você pode criar uma solicitação de chat básica para o modelo.

response = client.chat.completions.create(
    model="deepseek-r1",
    messages=[
        {"role": "user", "content": "How many languages are in the world?"}
    ]
)

A resposta é a seguinte, onde você pode ver as estatísticas de uso do 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: 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

Conteúdo de raciocínio

Alguns modelos de raciocínio, como o DeepSeek-R1, geram conclusões e incluem o raciocínio por trás disso.

O raciocínio associado ao preenchimento está incluído no campo reasoning_content. O modelo pode selecionar em quais cenários gerar conteúdo de raciocínio.

print("Thinking:", response.choices[0].message.reasoning_content)
Thinking: Okay, the user is asking how many languages exist in the world. I need to provide a clear and accurate answer...

Em conversas com múltiplos turnos, é útil evitar enviar o conteúdo de raciocínio no histórico de bate-papo, pois o raciocínio tende a gerar explicações longas.

Transmitir conteúdo

Por padrão, a API de conclusão retorna todo o conteúdo gerado em uma única resposta. Ao gerar completamentos longos, esperar pela resposta pode demorar muitos segundos.

Você pode transmitir o conteúdo para obtê-lo à medida que ele está sendo gerado. O streaming de conteúdo permite que você comece a processar a conclusão à medida que o conteúdo fica disponível. Este modo retorna um objeto que transmite a resposta como eventos enviados pelo servidor exclusivamente de dados. Extraia partes do campo delta, em vez do campo de mensagem.

Para transmitir finalizações, configure stream=True quando for invocar o modelo.

response = client.chat.completions.create(
    model="deepseek-r1",
    messages=[
        {"role": "user", "content": "How many languages are in the world?"}
    ],
    stream=True
)

Para visualizar a saída, defina uma função auxiliar para imprimir o fluxo. O exemplo a seguir implementa um roteamento que transmite apenas a resposta sem o conteúdo do raciocínio:

O conteúdo de raciocínio também está incluído dentro das partes delta da resposta, na chave reasoning_content.

def print_stream(completion):
    """
    Prints the chat completion with streaming.
    """
    is_thinking = False
    for event in completion:
        if event.choices:
            content = event.choices[0].delta.content
            reasoning_content = event.choices[0].delta.reasoning_content if hasattr(event.choices[0].delta, "reasoning_content") else None
            if reasoning_content and not is_thinking:
                is_thinking = True
                print("🧠 Thinking...", end="", flush=True)
            elif content:
                if is_thinking:
                    is_thinking = False
                    print("🛑\n\n")
            print(content or reasoning_content, end="", flush=True)

print_stream(response)

Você pode visualizar como o streaming gera conteúdo:

print_stream(response)

Parâmetros

Em geral, os modelos de raciocínio não suportam os seguintes parâmetros que você pode encontrar nos modelos de conclusão de chat:

  • Temperatura
  • Penalidade de presença
  • Pena de repetição
  • Parâmetro top_p

Alguns modelos suportam o uso de ferramentas ou saídas estruturadas (incluindo esquemas JSON). Leia a página Detalhes dos modelos para entender o suporte de cada modelo.

Aplicar guarda-corpos e controles

A API de Inferência de Modelo de IA do Azure dá suporte à Segurança de Conteúdo de IA do Azure. Quando você usa implantações com a Segurança de Conteúdo de IA do Azure ativada, as entradas e saídas passam por um conjunto de modelos de classificação destinados a detetar e prevenir a saída de conteúdo nocivo. O sistema de filtragem de conteúdo deteta e age em categorias específicas de conteúdo potencialmente nocivo em prompts de entrada e finalizações de saída.

O exemplo a seguir mostra como manipular eventos quando o modelo deteta conteúdo prejudicial no prompt de entrada.

try:
    response = client.chat.completions.create(
        model="deepseek-r1",
        messages=[
            {"role": "user", "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

Sugestão

Para saber mais sobre como você pode configurar e controlar as configurações de Segurança de Conteúdo do Azure AI, consulte a documentação de Segurança de Conteúdo do Azure AI.

Importante

Os itens marcados como (pré-visualização) neste artigo estão neste momento em pré-visualização pública. Esta pré-visualização é fornecida sem um acordo de nível de serviço, e não a recomendamos para trabalhos em produção. Algumas funcionalidades poderão não ser suportadas ou poderão ter capacidades limitadas. Para obter mais informações, veja Termos Suplementares de Utilização para Pré-visualizações do Microsoft Azure.

Este artigo explica como usar os recursos de raciocínio dos modelos de conclusão de chat implantados nos Modelos de Fundição de IA do Azure.

Modelos de raciocínio

Os modelos de raciocínio podem atingir níveis mais elevados de desempenho em domínios como matemática, codificação, ciências, estratégia e logística. A maneira como esses modelos produzem resultados é usando explicitamente a cadeia de pensamento para explorar todos os caminhos possíveis antes de gerar uma resposta. Verificam as suas respostas à medida que as produzem, o que ajuda a chegar a conclusões mais precisas. Como resultado, os modelos de raciocínio podem exigir menos contexto na solicitação para produzir resultados eficazes.

Essa maneira de dimensionar o desempenho de um modelo é chamada de tempo de computação de inferência , pois negocia o desempenho com latência e custo mais altos. Em contraste, outras abordagens podem ser dimensionadas através do tempo de computação durante o treinamento.

Os modelos de raciocínio produzem dois tipos de conteúdo como saídas:

  • Conclusões do raciocínio
  • Resultados de conclusão

Ambas as finalizações contam para o conteúdo gerado a partir do modelo. Portanto, eles contribuem para os limites de tokens e os custos associados ao modelo. Alguns modelos, como DeepSeek-R1, podem responder com conteúdo de raciocínio. Outros, como o1, produzem apenas as finalizações.

Pré-requisitos

Para concluir este tutorial, você precisa:

  • Instale a biblioteca de inferência do Azure para JavaScript com o seguinte comando:

    npm install @azure-rest/ai-inference
    npm install @azure/core-auth
    npm install @azure/identity
    

    Se você estiver usando Node.js, poderá configurar as dependências em package.json:

    package.json

    {
      "name": "main_app",
      "version": "1.0.0",
      "description": "",
      "main": "app.js",
      "type": "module",
      "dependencies": {
        "@azure-rest/ai-inference": "1.0.0-beta.6",
        "@azure/core-auth": "1.9.0",
        "@azure/core-sse": "2.2.0",
        "@azure/identity": "4.8.0"
      }
    }
    
  • Importe o seguinte:

    import ModelClient from "@azure-rest/ai-inference";
    import { isUnexpected } from "@azure-rest/ai-inference";
    import { createSseStream } from "@azure/core-sse";
    import { AzureKeyCredential } from "@azure/core-auth";
    import { DefaultAzureCredential } from "@azure/identity";
    
  • Um modelo com capacidades de raciocínio para implantação de modelo. Se você não tiver um, leia Adicionar e configurar Modelos de Fundição para adicionar um modelo de raciocínio.

    • Este exemplo utiliza DeepSeek-R1.

Use recursos de raciocínio com o bate-papo

Primeiro, crie o cliente para consumir o modelo. O código a seguir usa uma URL de ponto de extremidade e uma chave que são armazenadas em variáveis de ambiente.

const client = ModelClient(
    "https://<resource>.services.ai.azure.com/models", 
    new AzureKeyCredential(process.env.AZURE_INFERENCE_CREDENTIAL)
);

Se você configurou o recurso com suporte ao Microsoft Entra ID , poderá usar o trecho de código a seguir para criar um cliente.

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

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

Modelos de raciocínio rápidos

Ao criar prompts para modelos de raciocínio, leve em consideração o seguinte:

  • Use instruções simples e evite o uso de técnicas de cadeia de pensamento.
  • Os recursos de raciocínio integrados tornam os prompts simples de tiro zero tão eficazes quanto métodos mais complexos.
  • Ao fornecer contexto ou documentos adicionais, como em cenários RAG, incluir apenas as informações mais relevantes pode ajudar a evitar que o modelo complique demais sua resposta.
  • Os modelos de raciocínio podem suportar o uso de mensagens do sistema. No entanto, podem não segui-los tão estritamente como outros modelos que não são baseados no raciocínio.
  • Ao criar aplicativos de várias voltas, considere anexar apenas a resposta final do modelo, sem seu conteúdo de raciocínio, conforme explicado na seção Conteúdo de raciocínio .

Observe que os modelos de raciocínio podem levar mais tempo para gerar respostas. Utilizam longas cadeias de raciocínio que permitem uma resolução de problemas mais profunda e estruturada. Eles também realizam a autoverificação para cruzar suas respostas e corrigir seus erros, mostrando assim comportamentos autorreflexivos emergentes.

Criar uma solicitação de conclusão de bate-papo

O exemplo a seguir mostra como você pode criar uma solicitação de chat básica para o 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,
    }
});

A resposta é a seguinte, onde você pode ver as estatísticas de uso do 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

Conteúdo de raciocínio

Alguns modelos de raciocínio, como o DeepSeek-R1, geram conclusões e incluem o raciocínio por trás disso. O raciocínio associado à conclusão está incluído no conteúdo da resposta dentro das tags <think> e </think>. O modelo pode selecionar em quais cenários gerar conteúdo de raciocínio. Você pode extrair o conteúdo de raciocínio da resposta para entender o processo de pensamento do modelo da seguinte maneira:

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

Em conversas com múltiplos turnos, é útil evitar enviar o conteúdo de raciocínio no histórico de bate-papo, pois o raciocínio tende a gerar explicações longas.

Transmitir conteúdo

Por padrão, a API de conclusão retorna todo o conteúdo gerado em uma única resposta. Ao gerar completamentos longos, esperar pela resposta pode demorar muitos segundos.

Você pode transmitir o conteúdo para obtê-lo à medida que ele está sendo gerado. O streaming de conteúdo permite que você comece a processar a conclusão à medida que o conteúdo fica disponível. Este modo retorna um objeto que transmite a resposta como eventos enviados pelo servidor exclusivamente de dados. Extraia partes do campo delta, em vez do campo de mensagem.

Para transmitir finalizações, configure stream=True quando for invocar o 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,
        stream: true
    }
}).asNodeStream();

Para visualizar a saída, defina uma função auxiliar para imprimir o fluxo. O exemplo a seguir implementa um roteamento que transmite apenas a resposta sem o conteúdo do raciocínio:

async 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);
            }
        }
    }
}

Você pode visualizar como o streaming gera conteúdo:

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

Parâmetros

Em geral, os modelos de raciocínio não suportam os seguintes parâmetros que você pode encontrar nos modelos de conclusão de chat:

  • Temperatura
  • Penalidade de presença
  • Pena de repetição
  • Parâmetro top_p

Alguns modelos suportam o uso de ferramentas ou saídas estruturadas (incluindo esquemas JSON). Leia a página Detalhes dos modelos para entender o suporte de cada modelo.

Aplicar guarda-corpos e controles

A API de Inferência de Modelo de IA do Azure dá suporte à Segurança de Conteúdo de IA do Azure. Quando você usa implantações com a Segurança de Conteúdo de IA do Azure ativada, as entradas e saídas passam por um conjunto de modelos de classificação destinados a detetar e prevenir a saída de conteúdo nocivo. O sistema de filtragem de conteúdo deteta e age em categorias específicas de conteúdo potencialmente nocivo em prompts de entrada e finalizações de saída.

O exemplo a seguir mostra como manipular eventos quando o modelo deteta conteúdo prejudicial no prompt de entrada.

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

Sugestão

Para saber mais sobre como você pode configurar e controlar as configurações de Segurança de Conteúdo do Azure AI, consulte a documentação de Segurança de Conteúdo do Azure AI.

Importante

Os itens marcados como (pré-visualização) neste artigo estão neste momento em pré-visualização pública. Esta pré-visualização é fornecida sem um acordo de nível de serviço, e não a recomendamos para trabalhos em produção. Algumas funcionalidades poderão não ser suportadas ou poderão ter capacidades limitadas. Para obter mais informações, veja Termos Suplementares de Utilização para Pré-visualizações do Microsoft Azure.

Este artigo explica como usar os recursos de raciocínio dos modelos de conclusão de chat implantados nos Modelos de Fundição de IA do Azure.

Modelos de raciocínio

Os modelos de raciocínio podem atingir níveis mais elevados de desempenho em domínios como matemática, codificação, ciências, estratégia e logística. A maneira como esses modelos produzem resultados é usando explicitamente a cadeia de pensamento para explorar todos os caminhos possíveis antes de gerar uma resposta. Verificam as suas respostas à medida que as produzem, o que ajuda a chegar a conclusões mais precisas. Como resultado, os modelos de raciocínio podem exigir menos contexto na solicitação para produzir resultados eficazes.

Essa maneira de dimensionar o desempenho de um modelo é chamada de tempo de computação de inferência , pois negocia o desempenho com latência e custo mais altos. Em contraste, outras abordagens podem ser dimensionadas através do tempo de computação durante o treinamento.

Os modelos de raciocínio produzem dois tipos de conteúdo como saídas:

  • Conclusões do raciocínio
  • Resultados de conclusão

Ambas as finalizações contam para o conteúdo gerado a partir do modelo. Portanto, eles contribuem para os limites de tokens e os custos associados ao modelo. Alguns modelos, como DeepSeek-R1, podem responder com conteúdo de raciocínio. Outros, como o1, produzem apenas as finalizações.

Pré-requisitos

Para concluir este tutorial, você precisa:

  • Adicione o pacote de inferência do Azure AI ao seu projeto:

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-ai-inference</artifactId>
        <version>1.0.0-beta.4</version>
    </dependency>
    
  • Se você estiver usando o Entra ID, você também precisa do seguinte pacote:

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity</artifactId>
        <version>1.15.3</version>
    </dependency>
    
  • Importe o seguinte namespace:

    package com.azure.ai.inference.usage;
    
    import com.azure.ai.inference.EmbeddingsClient;
    import com.azure.ai.inference.EmbeddingsClientBuilder;
    import com.azure.ai.inference.ChatCompletionsClient;
    import com.azure.ai.inference.ChatCompletionsClientBuilder;
    import com.azure.ai.inference.models.EmbeddingsResult;
    import com.azure.ai.inference.models.EmbeddingItem;
    import com.azure.ai.inference.models.ChatCompletions;
    import com.azure.core.credential.AzureKeyCredential;
    import com.azure.core.util.Configuration;
    
    import java.util.ArrayList;
    import java.util.List;
    
  • Um modelo com capacidades de raciocínio para implantação de modelo. Se você não tiver um, leia Adicionar e configurar Modelos de Fundição para adicionar um modelo de raciocínio.

    • Este exemplo utiliza DeepSeek-R1.

Use recursos de raciocínio com o bate-papo

Primeiro, crie o cliente para consumir o modelo. O código a seguir usa uma URL de ponto de extremidade e uma chave que são armazenadas em variáveis de ambiente.

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

Sugestão

Verifique se você implantou o modelo no recurso Serviços de IA do Azure com a API de Inferência de Modelo de IA do Azure. Deepseek-R1 também está disponível como implantações de API sem servidor. No entanto, esses pontos de extremidade não usam o parâmetro model conforme explicado neste tutorial. Você pode verificar isso acessando o portal Azure AI Foundry>, na seção "Modelos + terminais", e certificar-se de que o modelo está listado na seção "Serviços de IA do Azure".

Se configurou o recurso com suporte a Microsoft Entra ID, pode usar o trecho de código a seguir para criar um cliente.

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

Modelos de raciocínio rápidos

Ao criar prompts para modelos de raciocínio, leve em consideração o seguinte:

  • Use instruções simples e evite o uso de técnicas de cadeia de pensamento.
  • Os recursos de raciocínio integrados tornam os prompts simples de tiro zero tão eficazes quanto métodos mais complexos.
  • Ao fornecer contexto ou documentos adicionais, como em cenários RAG, incluir apenas as informações mais relevantes pode ajudar a evitar que o modelo complique demais sua resposta.
  • Os modelos de raciocínio podem suportar o uso de mensagens do sistema. No entanto, podem não segui-los tão estritamente como outros modelos que não são baseados no raciocínio.
  • Ao criar aplicativos de várias voltas, considere anexar apenas a resposta final do modelo, sem seu conteúdo de raciocínio, conforme explicado na seção Conteúdo de raciocínio .

Observe que os modelos de raciocínio podem levar mais tempo para gerar respostas. Utilizam longas cadeias de raciocínio que permitem uma resolução de problemas mais profunda e estruturada. Eles também realizam a autoverificação para cruzar suas respostas e corrigir seus erros, mostrando assim comportamentos autorreflexivos emergentes.

Criar uma solicitação de conclusão de bate-papo

O exemplo a seguir mostra como você pode criar uma solicitação de chat básica para o 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);

A resposta é a seguinte, onde você pode ver as estatísticas de uso do 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

Conteúdo de raciocínio

Alguns modelos de raciocínio, como o DeepSeek-R1, geram conclusões e incluem o raciocínio por trás disso. O raciocínio associado à conclusão está incluído no conteúdo da resposta dentro das tags <think> e </think>. O modelo pode selecionar em quais cenários gerar conteúdo de raciocínio. Você pode extrair o conteúdo de raciocínio da resposta para entender o processo de pensamento do modelo da seguinte maneira:

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

Em conversas com múltiplos turnos, é útil evitar enviar o conteúdo de raciocínio no histórico de bate-papo, pois o raciocínio tende a gerar explicações longas.

Transmitir conteúdo

Por padrão, a API de conclusão retorna todo o conteúdo gerado em uma única resposta. Ao gerar completamentos longos, esperar pela resposta pode demorar muitos segundos.

Você pode transmitir o conteúdo para obtê-lo à medida que ele está sendo gerado. O streaming de conteúdo permite que você comece a processar a conclusão à medida que o conteúdo fica disponível. Este modo retorna um objeto que transmite a resposta como eventos enviados pelo servidor exclusivamente de dados. Extraia partes do campo delta, em vez do campo de mensagem.

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 a saída, defina uma função auxiliar para imprimir o fluxo. O exemplo a seguir implementa um roteamento que transmite apenas a resposta sem o conteúdo do raciocínio:

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();
            }
        }
    }
}

Você pode visualizar como o streaming gera conteúdo:

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

Parâmetros

Em geral, os modelos de raciocínio não suportam os seguintes parâmetros que você pode encontrar nos modelos de conclusão de chat:

  • Temperatura
  • Penalidade de presença
  • Pena de repetição
  • Parâmetro top_p

Alguns modelos suportam o uso de ferramentas ou saídas estruturadas (incluindo esquemas JSON). Leia a página Detalhes dos modelos para entender o suporte de cada modelo.

Importante

Os itens marcados como (pré-visualização) neste artigo estão neste momento em pré-visualização pública. Esta pré-visualização é fornecida sem um acordo de nível de serviço, e não a recomendamos para trabalhos em produção. Algumas funcionalidades poderão não ser suportadas ou poderão ter capacidades limitadas. Para obter mais informações, veja Termos Suplementares de Utilização para Pré-visualizações do Microsoft Azure.

Este artigo explica como usar os recursos de raciocínio dos modelos de conclusão de chat implantados nos Modelos de Fundição de IA do Azure.

Modelos de raciocínio

Os modelos de raciocínio podem atingir níveis mais elevados de desempenho em domínios como matemática, codificação, ciências, estratégia e logística. A maneira como esses modelos produzem resultados é usando explicitamente a cadeia de pensamento para explorar todos os caminhos possíveis antes de gerar uma resposta. Verificam as suas respostas à medida que as produzem, o que ajuda a chegar a conclusões mais precisas. Como resultado, os modelos de raciocínio podem exigir menos contexto na solicitação para produzir resultados eficazes.

Essa maneira de dimensionar o desempenho de um modelo é chamada de tempo de computação de inferência , pois negocia o desempenho com latência e custo mais altos. Em contraste, outras abordagens podem ser dimensionadas através do tempo de computação durante o treinamento.

Os modelos de raciocínio produzem dois tipos de conteúdo como saídas:

  • Conclusões do raciocínio
  • Resultados de conclusão

Ambas as finalizações contam para o conteúdo gerado a partir do modelo. Portanto, eles contribuem para os limites de tokens e os custos associados ao modelo. Alguns modelos, como DeepSeek-R1, podem responder com conteúdo de raciocínio. Outros, como o1, produzem apenas as finalizações.

Pré-requisitos

Para concluir este tutorial, você precisa:

  • Instale o pacote de inferência Azure AI com o seguinte comando:

    dotnet add package Azure.AI.Inference --prerelease
    
  • Se você estiver usando o Entra ID, você também precisa do seguinte pacote:

    dotnet add package Azure.Identity
    
  • Um modelo com capacidades de raciocínio para implantação de modelo. Se você não tiver um, leia Adicionar e configurar Modelos de Fundição para adicionar um modelo de raciocínio.

    • Este exemplo utiliza DeepSeek-R1.

Use recursos de raciocínio com o bate-papo

Primeiro, crie o cliente para consumir o modelo. O código a seguir usa uma URL de ponto de extremidade e uma chave que são armazenadas em variáveis de ambiente.

AzureAIInferenceClientOptions clientOptions = new AzureAIInferenceClientOptions(apiVersion);

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

Se configurou o recurso com suporte a Microsoft Entra ID, pode usar o trecho de código a seguir para criar um cliente.

AzureAIInferenceClientOptions clientOptions = new AzureAIInferenceClientOptions(
    "2024-05-01-preview", 
    new string[] { "https://cognitiveservices.azure.com/.default" }
);

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

Modelos de raciocínio rápidos

Ao criar prompts para modelos de raciocínio, leve em consideração o seguinte:

  • Use instruções simples e evite o uso de técnicas de cadeia de pensamento.
  • Os recursos de raciocínio integrados tornam os prompts simples de tiro zero tão eficazes quanto métodos mais complexos.
  • Ao fornecer contexto ou documentos adicionais, como em cenários RAG, incluir apenas as informações mais relevantes pode ajudar a evitar que o modelo complique demais sua resposta.
  • Os modelos de raciocínio podem suportar o uso de mensagens do sistema. No entanto, podem não segui-los tão estritamente como outros modelos que não são baseados no raciocínio.
  • Ao criar aplicativos de várias voltas, considere anexar apenas a resposta final do modelo, sem seu conteúdo de raciocínio, conforme explicado na seção Conteúdo de raciocínio .

Observe que os modelos de raciocínio podem levar mais tempo para gerar respostas. Utilizam longas cadeias de raciocínio que permitem uma resolução de problemas mais profunda e estruturada. Eles também realizam a autoverificação para cruzar suas respostas e corrigir seus erros, mostrando assim comportamentos autorreflexivos emergentes.

Criar uma solicitação de conclusão de bate-papo

O exemplo a seguir mostra como você pode criar uma solicitação de chat básica para o modelo.

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

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

A resposta é a seguinte, onde você pode ver as estatísticas de uso do 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

Conteúdo de raciocínio

Alguns modelos de raciocínio, como o DeepSeek-R1, geram conclusões e incluem o raciocínio por trás disso. O raciocínio associado à conclusão está incluído no conteúdo da resposta dentro das tags <think> e </think>. O modelo pode selecionar em quais cenários gerar conteúdo de raciocínio. Você pode extrair o conteúdo de raciocínio da resposta para entender o processo de pensamento do modelo da seguinte maneira:

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

Em conversas com múltiplos turnos, é útil evitar enviar o conteúdo de raciocínio no histórico de bate-papo, pois o raciocínio tende a gerar explicações longas.

Transmitir conteúdo

Por padrão, a API de conclusão retorna todo o conteúdo gerado em uma única resposta. Ao gerar completamentos longos, esperar pela resposta pode demorar muitos segundos.

Você pode transmitir o conteúdo para obtê-lo à medida que ele está sendo gerado. O streaming de conteúdo permite que você comece a processar a conclusão à medida que o conteúdo fica disponível. Este modo retorna um objeto que transmite a resposta como eventos enviados pelo servidor exclusivamente de dados. Extraia partes do campo delta, em vez do campo de mensagem.

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 a saída, defina uma função auxiliar para imprimir o fluxo. O exemplo a seguir implementa um roteamento que transmite apenas a resposta sem o conteúdo do raciocínio:

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();
            }
        }
    }
}

Você pode visualizar como o streaming gera conteúdo:

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

Parâmetros

Em geral, os modelos de raciocínio não suportam os seguintes parâmetros que você pode encontrar nos modelos de conclusão de chat:

  • Temperatura
  • Penalidade de presença
  • Pena de repetição
  • Parâmetro top_p

Alguns modelos suportam o uso de ferramentas ou saídas estruturadas (incluindo esquemas JSON). Leia a página Detalhes dos modelos para entender o suporte de cada modelo.

Aplicar guarda-corpos e controles

A API de Inferência de Modelo de IA do Azure dá suporte à Segurança de Conteúdo de IA do Azure. Quando você usa implantações com a Segurança de Conteúdo de IA do Azure ativada, as entradas e saídas passam por um conjunto de modelos de classificação destinados a detetar e prevenir a saída de conteúdo nocivo. O sistema de filtragem de conteúdo deteta e age em categorias específicas de conteúdo potencialmente nocivo em prompts de entrada e finalizações de saída.

O exemplo a seguir mostra como manipular eventos quando o modelo deteta conteúdo prejudicial no prompt de entrada.

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

Sugestão

Para saber mais sobre como você pode configurar e controlar as configurações de Segurança de Conteúdo do Azure AI, consulte a documentação de Segurança de Conteúdo do Azure AI.

Importante

Os itens marcados como (pré-visualização) neste artigo estão neste momento em pré-visualização pública. Esta pré-visualização é fornecida sem um acordo de nível de serviço, e não a recomendamos para trabalhos em produção. Algumas funcionalidades poderão não ser suportadas ou poderão ter capacidades limitadas. Para obter mais informações, veja Termos Suplementares de Utilização para Pré-visualizações do Microsoft Azure.

Este artigo explica como usar os recursos de raciocínio dos modelos de conclusão de chat implantados nos Modelos de Fundição de IA do Azure.

Modelos de raciocínio

Os modelos de raciocínio podem atingir níveis mais elevados de desempenho em domínios como matemática, codificação, ciências, estratégia e logística. A maneira como esses modelos produzem resultados é usando explicitamente a cadeia de pensamento para explorar todos os caminhos possíveis antes de gerar uma resposta. Verificam as suas respostas à medida que as produzem, o que ajuda a chegar a conclusões mais precisas. Como resultado, os modelos de raciocínio podem exigir menos contexto na solicitação para produzir resultados eficazes.

Essa maneira de dimensionar o desempenho de um modelo é chamada de tempo de computação de inferência , pois negocia o desempenho com latência e custo mais altos. Em contraste, outras abordagens podem ser dimensionadas através do tempo de computação durante o treinamento.

Os modelos de raciocínio produzem dois tipos de conteúdo como saídas:

  • Conclusões do raciocínio
  • Resultados de conclusão

Ambas as finalizações contam para o conteúdo gerado a partir do modelo. Portanto, eles contribuem para os limites de tokens e os custos associados ao modelo. Alguns modelos, como DeepSeek-R1, podem responder com conteúdo de raciocínio. Outros, como o1, produzem apenas as finalizações.

Pré-requisitos

Para concluir este tutorial, você precisa:

  • Um modelo com capacidades de raciocínio para implantação de modelo. Se você não tiver um, leia Adicionar e configurar Modelos de Fundição para adicionar um modelo de raciocínio.

    • Este exemplo utiliza DeepSeek-R1.

Use recursos de raciocínio com o bate-papo

Primeiro, crie o cliente para consumir o modelo. O código a seguir usa uma URL de ponto de extremidade e uma chave que são armazenadas em variáveis de ambiente.

POST https://<resource>.services.ai.azure.com/openai/deployments/deepseek-r1/chat/completions?api-version=2024-10-21
Content-Type: application/json
api-key: <key>

Se configurou o recurso com suporte ao Microsoft Entra ID, passe o token no cabeçalho com o formato Authorization. Use o âmbito https://cognitiveservices.azure.com/.default.

POST https://<resource>.services.ai.azure.com/openai/deployments/deepseek-r1/chat/completions?api-version=2024-10-21
Content-Type: application/json
Authorization: Bearer <token>

Usar o Microsoft Entra ID pode exigir configuração adicional em seu recurso para conceder acesso. Saiba como configurar a autenticação sem chave com o Microsoft Entra ID.

Modelos de raciocínio rápidos

Ao criar prompts para modelos de raciocínio, leve em consideração o seguinte:

  • Use instruções simples e evite o uso de técnicas de cadeia de pensamento.
  • Os recursos de raciocínio integrados tornam os prompts simples de tiro zero tão eficazes quanto métodos mais complexos.
  • Ao fornecer contexto ou documentos adicionais, como em cenários RAG, incluir apenas as informações mais relevantes pode ajudar a evitar que o modelo complique demais sua resposta.
  • Os modelos de raciocínio podem suportar o uso de mensagens do sistema. No entanto, podem não segui-los tão estritamente como outros modelos que não são baseados no raciocínio.
  • Ao criar aplicativos de várias voltas, considere anexar apenas a resposta final do modelo, sem seu conteúdo de raciocínio, conforme explicado na seção Conteúdo de raciocínio .

Observe que os modelos de raciocínio podem levar mais tempo para gerar respostas. Utilizam longas cadeias de raciocínio que permitem uma resolução de problemas mais profunda e estruturada. Eles também realizam a autoverificação para cruzar suas respostas e corrigir seus erros, mostrando assim comportamentos autorreflexivos emergentes.

Criar uma solicitação de conclusão de bate-papo

O exemplo a seguir mostra como você pode criar uma solicitação de chat básica para o modelo.

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

A resposta é a seguinte, onde você pode ver as estatísticas de uso do modelo:

{
    "id": "0a1234b5de6789f01gh2i345j6789klm",
    "object": "chat.completion",
    "created": 1718726686,
    "model": "DeepSeek-R1",
    "choices": [
        {
            "index": 0,
            "message": {
                "role": "assistant",
                "reasoning_content": "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.\n",
                "content": "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.",
                "tool_calls": null
            },
            "finish_reason": "stop"
        }
    ],
    "usage": {
        "prompt_tokens": 11,
        "total_tokens": 897,
        "completion_tokens": 886
    }
}

Conteúdo de raciocínio

Alguns modelos de raciocínio, como o DeepSeek-R1, geram conclusões e incluem o raciocínio por trás disso.

O raciocínio associado ao preenchimento está incluído no campo reasoning_content. O modelo pode selecionar em quais cenários gerar conteúdo de raciocínio.

Em conversas com múltiplos turnos, é útil evitar enviar o conteúdo de raciocínio no histórico de bate-papo, pois o raciocínio tende a gerar explicações longas.

Transmitir conteúdo

Por padrão, a API de conclusão retorna todo o conteúdo gerado em uma única resposta. Ao gerar completamentos longos, esperar pela resposta pode demorar muitos segundos.

Você pode transmitir o conteúdo para obtê-lo à medida que ele está sendo gerado. O streaming de conteúdo permite que você comece a processar a conclusão à medida que o conteúdo fica disponível. Este modo retorna um objeto que transmite a resposta como eventos enviados pelo servidor exclusivamente de dados. Extraia partes do campo delta, em vez do campo de mensagem.

Para transmitir finalizações, configure "stream": true quando for invocar o modelo.

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

Para visualizar a saída, defina uma função auxiliar para imprimir o fluxo. O exemplo a seguir implementa um roteamento que transmite apenas a resposta sem o conteúdo do raciocínio:

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

A última mensagem no fluxo tem o finish_reason definido, indicando o motivo para o processo de geração parar.

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

Parâmetros

Em geral, os modelos de raciocínio não suportam os seguintes parâmetros que você pode encontrar nos modelos de conclusão de chat:

  • Temperatura
  • Penalidade de presença
  • Pena de repetição
  • Parâmetro top_p

Alguns modelos suportam o uso de ferramentas ou saídas estruturadas (incluindo esquemas JSON). Leia a página Detalhes dos modelos para entender o suporte de cada modelo.

Aplicar guarda-corpos e controles

A API de Inferência de Modelo de IA do Azure dá suporte à Segurança de Conteúdo de IA do Azure. Quando você usa implantações com a Segurança de Conteúdo de IA do Azure ativada, as entradas e saídas passam por um conjunto de modelos de classificação destinados a detetar e prevenir a saída de conteúdo nocivo. O sistema de filtragem de conteúdo deteta e age em categorias específicas de conteúdo potencialmente nocivo em prompts de entrada e finalizações de saída.

O exemplo a seguir mostra como manipular eventos quando o modelo deteta conteúdo prejudicial no prompt de entrada.

{
    "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
    }
}

Sugestão

Para saber mais sobre como você pode configurar e controlar as configurações de Segurança de Conteúdo do Azure AI, consulte a documentação de Segurança de Conteúdo do Azure AI.