Поделиться через


Использование моделей причин с помощью моделей Microsoft Foundry (классическая модель)

Применяется только к:Портал Foundry (классический). Эта статья недоступна для нового портала Foundry. Дополнительные сведения о новом портале.

Это важно

Azure бета-версия SDK для инференса ИИ устарела и будет выведена из эксплуатации 30 мая 2026 г. Перейдите на общедоступный API OpenAI/v1 с стабильным пакетом SDK OpenAI. Следуйте инструкциям по миграции , чтобы перейти на OpenAI/v1, используя пакет SDK для предпочитаемого языка программирования.

Это важно

Элементы, обозначенные в этой статье как (предварительная версия), сейчас предлагаются в общедоступной предварительной версии. Эта предварительная версия предоставляется без соглашения об уровне обслуживания, и мы не рекомендуем ее для рабочих нагрузок. Некоторые функции могут не поддерживаться или их возможности могут быть ограничены. Дополнительные сведения см. в разделе Supplemental Terms of Use for Microsoft Azure Previews.

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

Модели причин

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

Модели причин создают два типа содержимого в виде выходных данных:

  • Результаты рассуждений
  • Завершение вычислений

Оба эти завершения становятся частью содержимого, сформированного моделью. Таким образом, они вносят вклад в ограничения и затраты токенов, которые связаны с моделью. Некоторые модели, например DeepSeek-R1, могут отвечать, используя содержание с рассуждениями. Другие, например o1, выдают только завершения.

Предпосылки

Чтобы завершить работу с этим руководством, вам потребуется:

  • Подписка Azure. Если вы используете модели GitHub, вы можете обновить интерфейс и создать подписку Azure в процессе. Прочитайте Обновление моделей GitHub на модели Microsoft Foundry, если это ваш случай.

  • Проект компании Foundry. Этот тип проекта управляется ресурсом Foundry. Если у вас нет проекта Foundry, см. статью "Создание проекта для Foundry(Foundry projects)".

  • URL-адрес конечной точки.

  • Ключ конечной точки (если вы решили использовать ключ API для проверки подлинности).

  • Модель с возможностями рассуждения для развертывания. Если у вас его нет, прочитайте Добавление и настройка моделей Foundry чтобы добавить модель рассуждений.

    • В этом примере используется DeepSeek-R1.

Использование возможностей логического мышления в чате

Сначала создайте клиент для использования модели. В следующем коде используется URL-адрес конечной точки и ключ, хранящиеся в переменных среды.

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",
)

Если ресурс настроен для поддержки Microsoft Entra ID, можно использовать следующий фрагмент кода для создания клиента.

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

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

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

Модели логических подсказок

При создании запросов на создание моделей причин следует учитывать следующее:

  • Используйте простые инструкции и избегайте использования методов цепочки мышления.
  • Встроенные возможности рассуждения делают простые запросы нулевого снимка столь же эффективными, как и более сложные методы.
  • При предоставлении дополнительного контекста или документов, например в сценариях RAG, включая только наиболее релевантную информацию, может помочь предотвратить чрезмерное усложнение ответа модели.
  • Модели причин могут поддерживать использование системных сообщений. Однако они могут не следовать им строго, как и другие неразумные модели.
  • При создании многоэтапных приложений рассмотрите добавление только окончательного ответа из модели, без содержания обоснований, как это описано в разделе Содержание рассуждений.

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

Создание запроса на завершение чата

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

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

Ответ выглядит следующим образом, где можно просмотреть статистику использования модели:

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

Содержание рассуждений

Замечание

Эта информация о содержимом рассуждений не относится к моделям Azure OpenAI. Azure модели рассуждений OpenAI используют функцию обобщение рассуждений.

Некоторые модели рассуждения, такие как DeepSeek-R1, формируют завершения и включают в себя обоснование.

Причина, связанная с завершением, включена в поле reasoning_content. Модель может выбрать, в каких сценариях генерировать рациональное содержимое.

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

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

Стриминг контента

По умолчанию API завершения возвращает все созданное содержимое в одном ответе. Если вы создаете длинные формулировки, ожидание ответа может занять много секунд.

Вы можете транслировать содержимое, чтобы получать его в режиме реального времени. Потоковая передача содержимого позволяет начать обработку результата по мере его доступности. Этот режим возвращает объект, который транслирует ответ в виде событий отправляемых сервером, содержащих только данные. Извлекайте фрагменты из дельта-поля, а не из поля сообщения.

Чтобы выполнить потоковую передачу завершений, задайте stream=True при вызове модели.

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

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

Содержимое причин также включается в разностные части ответа в ключе 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)

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

print_stream(response)

Параметры

Как правило, модели причин не поддерживают следующие параметры, которые можно найти в моделях завершения чата:

  • Температура
  • Штраф за присутствие
  • Штраф за повторение
  • Параметр top_p

Некоторые модели поддерживают использование средств или структурированных выходных данных (включая схемы JSON). Ознакомьтесь со страницей сведений о моделях , чтобы понять поддержку каждой модели.

Применение Guardrails и элементов управления

API интерпретации моделей Azure AI поддерживает Azure AI Content Safety. При использовании развертываний с включенным Azure AI Content Safety входные и выходные данные проходят через ансамбль моделей классификации, направленных на обнаружение и предотвращение вывода вредного содержимого. Система фильтрации содержимого обнаруживает и принимает меры по определенным категориям потенциально вредного содержимого как в запросах ввода, так и в завершении выходных данных.

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

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

Подсказка

Дополнительные сведения о настройке и управлении параметрами Azure AI Content Safety см. в документации Azure AI Content Safety.

Это важно

Элементы, обозначенные в этой статье как (предварительная версия), сейчас предлагаются в общедоступной предварительной версии. Эта предварительная версия предоставляется без соглашения об уровне обслуживания, и мы не рекомендуем ее для рабочих нагрузок. Некоторые функции могут не поддерживаться или их возможности могут быть ограничены. Дополнительные сведения см. в разделе Supplemental Terms of Use for Microsoft Azure Previews.

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

Модели причин

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

Модели причин создают два типа содержимого в виде выходных данных:

  • Результаты рассуждений
  • Завершение вычислений

Оба эти завершения становятся частью содержимого, сформированного моделью. Таким образом, они вносят вклад в ограничения и затраты токенов, которые связаны с моделью. Некоторые модели, например DeepSeek-R1, могут отвечать, используя содержание с рассуждениями. Другие, например o1, выдают только завершения.

Предпосылки

Чтобы завершить работу с этим руководством, вам потребуется:

  • Подписка Azure. Если вы используете модели GitHub, вы можете обновить интерфейс и создать подписку Azure в процессе. Прочитайте Обновление моделей GitHub на модели Microsoft Foundry, если это ваш случай.

  • Проект компании Foundry. Этот тип проекта управляется ресурсом Foundry. Если у вас нет проекта Foundry, см. статью "Создание проекта для Foundry(Foundry projects)".

  • URL-адрес конечной точки.

  • Ключ конечной точки (если вы решили использовать ключ API для проверки подлинности).

  • Установите библиотеку вывода Azure для JavaScript с помощью следующей команды:

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

    Если вы используете Node.js, вы можете настроить зависимости в 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"
      }
    }
    
  • Импортируйте следующее:

    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";
    
  • Модель с возможностями рассуждения для развертывания. Если у вас его нет, прочитайте Добавление и настройка моделей Foundry чтобы добавить модель рассуждений.

    • В этом примере используется DeepSeek-R1.

Использование возможностей логического мышления в чате

Сначала создайте клиент для использования модели. В следующем коде используется URL-адрес конечной точки и ключ, хранящиеся в переменных среды.

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

Если вы настроили ресурс с поддержкой Microsoft Entra ID, можно использовать следующий фрагмент кода для создания клиента.

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

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

Модели логических подсказок

При создании запросов на создание моделей причин следует учитывать следующее:

  • Используйте простые инструкции и избегайте использования методов цепочки мышления.
  • Встроенные возможности рассуждения делают простые запросы нулевого снимка столь же эффективными, как и более сложные методы.
  • При предоставлении дополнительного контекста или документов, например в сценариях RAG, включая только наиболее релевантную информацию, может помочь предотвратить чрезмерное усложнение ответа модели.
  • Модели причин могут поддерживать использование системных сообщений. Однако они могут не следовать им строго, как и другие неразумные модели.
  • При создании многоэтапных приложений рассмотрите добавление только окончательного ответа из модели, без содержания обоснований, как это описано в разделе Содержание рассуждений.

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

Создание запроса на завершение чата

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

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

Ответ выглядит следующим образом, где можно просмотреть статистику использования модели:

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

Содержание рассуждений

Замечание

Эта информация о содержимом рассуждений не относится к моделям Azure OpenAI. Azure модели рассуждений OpenAI используют функцию обобщение рассуждений.

Некоторые модели рассуждения, такие как DeepSeek-R1, формируют завершения и включают в себя обоснование. Причины, связанные с завершением, включаются в содержимое ответа в тегах <think> и </think>. Модель может выбрать, в каких сценариях генерировать рациональное содержимое. Вы можете извлечь содержимое причин из ответа, чтобы понять процесс мысли модели следующим образом:

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/regions 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/region. \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

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

Стриминг контента

По умолчанию API завершения возвращает все созданное содержимое в одном ответе. Если вы создаете длинные формулировки, ожидание ответа может занять много секунд.

Вы можете транслировать содержимое, чтобы получать его в режиме реального времени. Потоковая передача содержимого позволяет начать обработку результата по мере его доступности. Этот режим возвращает объект, который транслирует ответ в виде событий отправляемых сервером, содержащих только данные. Извлекайте фрагменты из дельта-поля, а не из поля сообщения.

Чтобы выполнить потоковую передачу завершений, задайте stream=True при вызове модели.

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

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

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

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

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

Параметры

Как правило, модели причин не поддерживают следующие параметры, которые можно найти в моделях завершения чата:

  • Температура
  • Штраф за присутствие
  • Штраф за повторение
  • Параметр top_p

Некоторые модели поддерживают использование средств или структурированных выходных данных (включая схемы JSON). Ознакомьтесь со страницей сведений о моделях , чтобы понять поддержку каждой модели.

Применение Guardrails и элементов управления

API интерпретации моделей Azure AI поддерживает Azure AI Content Safety. При использовании развертываний с включенным Azure AI Content Safety входные и выходные данные проходят через ансамбль моделей классификации, направленных на обнаружение и предотвращение вывода вредного содержимого. Система фильтрации содержимого обнаруживает и принимает меры по определенным категориям потенциально вредного содержимого как в запросах ввода, так и в завершении выходных данных.

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

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

Подсказка

Дополнительные сведения о настройке и управлении параметрами Azure AI Content Safety см. в документации Azure AI Content Safety.

Это важно

Элементы, обозначенные в этой статье как (предварительная версия), сейчас предлагаются в общедоступной предварительной версии. Эта предварительная версия предоставляется без соглашения об уровне обслуживания, и мы не рекомендуем ее для рабочих нагрузок. Некоторые функции могут не поддерживаться или их возможности могут быть ограничены. Дополнительные сведения см. в разделе Supplemental Terms of Use for Microsoft Azure Previews.

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

Модели причин

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

Модели причин создают два типа содержимого в виде выходных данных:

  • Результаты рассуждений
  • Завершение вычислений

Оба эти завершения становятся частью содержимого, сформированного моделью. Таким образом, они вносят вклад в ограничения и затраты токенов, которые связаны с моделью. Некоторые модели, например DeepSeek-R1, могут отвечать, используя содержание с рассуждениями. Другие, например o1, выдают только завершения.

Предпосылки

Чтобы завершить работу с этим руководством, вам потребуется:

  • Подписка Azure. Если вы используете модели GitHub, вы можете обновить интерфейс и создать подписку Azure в процессе. Прочитайте Обновление моделей GitHub на модели Microsoft Foundry, если это ваш случай.

  • Проект компании Foundry. Этот тип проекта управляется ресурсом Foundry. Если у вас нет проекта Foundry, см. статью "Создание проекта для Foundry(Foundry projects)".

  • URL-адрес конечной точки.

  • Ключ конечной точки (если вы решили использовать ключ API для проверки подлинности).

  • Добавьте пакет вывода Azure ИИ в проект:

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-ai-inference</artifactId>
        <version>1.0.0-beta.4</version>
    </dependency>
    
  • Если вы используете Entra ID, вам также потребуется следующий пакет:

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity</artifactId>
        <version>1.15.3</version>
    </dependency>
    
  • Импортируйте следующее пространство имен:

    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;
    
  • Модель с возможностями рассуждения для развертывания. Если у вас его нет, прочитайте Добавление и настройка моделей Foundry чтобы добавить модель рассуждений.

    • В этом примере используется DeepSeek-R1.

Использование возможностей логического мышления в чате

Сначала создайте клиент для использования модели. В следующем коде используется URL-адрес конечной точки и ключ, хранящиеся в переменных среды.

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

Подсказка

Убедитесь, что вы развернули модель на ресурсе Foundry Tools с помощью API инференции модели Azure AI. Deepseek-R1 также доступен в качестве бессерверных развертываний API. Однако эти конечные точки не принимают параметр model , как описано в этом руководстве. Вы можете убедиться в этом, перейдя на портал Foundry, раздел Модели и конечные точки, и подтвердите, что модель указана в разделе «Средства Foundry».

Если ресурс настроен для поддержки Microsoft Entra ID, можно использовать следующий фрагмент кода для создания клиента.

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

Модели логических подсказок

При создании запросов на создание моделей причин следует учитывать следующее:

  • Используйте простые инструкции и избегайте использования методов цепочки мышления.
  • Встроенные возможности рассуждения делают простые запросы нулевого снимка столь же эффективными, как и более сложные методы.
  • При предоставлении дополнительного контекста или документов, например в сценариях RAG, включая только наиболее релевантную информацию, может помочь предотвратить чрезмерное усложнение ответа модели.
  • Модели причин могут поддерживать использование системных сообщений. Однако они могут не следовать им строго, как и другие неразумные модели.
  • При создании многоэтапных приложений рассмотрите добавление только окончательного ответа из модели, без содержания обоснований, как это описано в разделе Содержание рассуждений.

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

Создание запроса на завершение чата

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

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

Ответ выглядит следующим образом, где можно просмотреть статистику использования модели:

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

Содержание рассуждений

Замечание

Эта информация о содержимом рассуждений не относится к моделям Azure OpenAI. Azure модели рассуждений OpenAI используют функцию обобщение рассуждений.

Некоторые модели рассуждения, такие как DeepSeek-R1, формируют завершения и включают в себя обоснование. Причины, связанные с завершением, включаются в содержимое ответа в тегах <think> и </think>. Модель может выбрать, в каких сценариях генерировать рациональное содержимое. Вы можете извлечь содержимое причин из ответа, чтобы понять процесс мысли модели следующим образом:

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/regions 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/region. \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

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

Стриминг контента

По умолчанию API завершения возвращает все созданное содержимое в одном ответе. Если вы создаете длинные формулировки, ожидание ответа может занять много секунд.

Вы можете транслировать содержимое, чтобы получать его в режиме реального времени. Потоковая передача содержимого позволяет начать обработку результата по мере его доступности. Этот режим возвращает объект, который транслирует ответ в виде событий отправляемых сервером, содержащих только данные. Извлекайте фрагменты из дельта-поля, а не из поля сообщения.

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

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

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

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

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

Параметры

Как правило, модели причин не поддерживают следующие параметры, которые можно найти в моделях завершения чата:

  • Температура
  • Штраф за присутствие
  • Штраф за повторение
  • Параметр top_p

Некоторые модели поддерживают использование средств или структурированных выходных данных (включая схемы JSON). Ознакомьтесь со страницей сведений о моделях , чтобы понять поддержку каждой модели.

Это важно

Элементы, обозначенные в этой статье как (предварительная версия), сейчас предлагаются в общедоступной предварительной версии. Эта предварительная версия предоставляется без соглашения об уровне обслуживания, и мы не рекомендуем ее для рабочих нагрузок. Некоторые функции могут не поддерживаться или их возможности могут быть ограничены. Дополнительные сведения см. в разделе Supplemental Terms of Use for Microsoft Azure Previews.

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

Модели причин

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

Модели причин создают два типа содержимого в виде выходных данных:

  • Результаты рассуждений
  • Завершение вычислений

Оба эти завершения становятся частью содержимого, сформированного моделью. Таким образом, они вносят вклад в ограничения и затраты токенов, которые связаны с моделью. Некоторые модели, например DeepSeek-R1, могут отвечать, используя содержание с рассуждениями. Другие, например o1, выдают только завершения.

Предпосылки

Чтобы завершить работу с этим руководством, вам потребуется:

  • Подписка Azure. Если вы используете модели GitHub, вы можете обновить интерфейс и создать подписку Azure в процессе. Прочитайте Обновление моделей GitHub на модели Microsoft Foundry, если это ваш случай.

  • Проект компании Foundry. Этот тип проекта управляется ресурсом Foundry. Если у вас нет проекта Foundry, см. статью "Создание проекта для Foundry(Foundry projects)".

  • URL-адрес конечной точки.

  • Ключ конечной точки (если вы решили использовать ключ API для проверки подлинности).

  • Установите пакет вывода Azure ИИ с помощью следующей команды:

    dotnet add package Azure.AI.Inference --prerelease
    
  • Если вы используете Entra ID, вам также потребуется следующий пакет:

    dotnet add package Azure.Identity
    
  • Модель с возможностями рассуждения для развертывания. Если у вас его нет, прочитайте Добавление и настройка моделей Foundry чтобы добавить модель рассуждений.

    • В этом примере используется DeepSeek-R1.

Использование возможностей логического мышления в чате

Сначала создайте клиент для использования модели. В следующем коде используется URL-адрес конечной точки и ключ, хранящиеся в переменных среды.

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

Если ресурс настроен для поддержки Microsoft Entra ID, можно использовать следующий фрагмент кода для создания клиента.

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,
);

Модели логических подсказок

При создании запросов на создание моделей причин следует учитывать следующее:

  • Используйте простые инструкции и избегайте использования методов цепочки мышления.
  • Встроенные возможности рассуждения делают простые запросы нулевого снимка столь же эффективными, как и более сложные методы.
  • При предоставлении дополнительного контекста или документов, например в сценариях RAG, включая только наиболее релевантную информацию, может помочь предотвратить чрезмерное усложнение ответа модели.
  • Модели причин могут поддерживать использование системных сообщений. Однако они могут не следовать им строго, как и другие неразумные модели.
  • При создании многоэтапных приложений рассмотрите добавление только окончательного ответа из модели, без содержания обоснований, как это описано в разделе Содержание рассуждений.

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

Создание запроса на завершение чата

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

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

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

Ответ выглядит следующим образом, где можно просмотреть статистику использования модели:

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

Содержание рассуждений

Замечание

Эта информация о содержимом рассуждений не относится к моделям Azure OpenAI. Azure модели рассуждений OpenAI используют функцию обобщение рассуждений.

Некоторые модели рассуждения, такие как DeepSeek-R1, формируют завершения и включают в себя обоснование. Причины, связанные с завершением, включаются в содержимое ответа в тегах <think> и </think>. Модель может выбрать, в каких сценариях генерировать рациональное содержимое. Вы можете извлечь содержимое причин из ответа, чтобы понять процесс мысли модели следующим образом:

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/regions 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/region. \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

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

Стриминг контента

По умолчанию API завершения возвращает все созданное содержимое в одном ответе. Если вы создаете длинные формулировки, ожидание ответа может занять много секунд.

Вы можете транслировать содержимое, чтобы получать его в режиме реального времени. Потоковая передача содержимого позволяет начать обработку результата по мере его доступности. Этот режим возвращает объект, который транслирует ответ в виде событий отправляемых сервером, содержащих только данные. Извлекайте фрагменты из дельта-поля, а не из поля сообщения.

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

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

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

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

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

Параметры

Как правило, модели причин не поддерживают следующие параметры, которые можно найти в моделях завершения чата:

  • Температура
  • Штраф за присутствие
  • Штраф за повторение
  • Параметр top_p

Некоторые модели поддерживают использование средств или структурированных выходных данных (включая схемы JSON). Ознакомьтесь со страницей сведений о моделях , чтобы понять поддержку каждой модели.

Применение Guardrails и элементов управления

API интерпретации моделей Azure AI поддерживает Azure AI Content Safety. При использовании развертываний с включенным Azure AI Content Safety входные и выходные данные проходят через ансамбль моделей классификации, направленных на обнаружение и предотвращение вывода вредного содержимого. Система фильтрации содержимого обнаруживает и принимает меры по определенным категориям потенциально вредного содержимого как в запросах ввода, так и в завершении выходных данных.

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

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

Подсказка

Дополнительные сведения о настройке и управлении параметрами Azure AI Content Safety см. в документации Azure AI Content Safety.

Это важно

Элементы, обозначенные в этой статье как (предварительная версия), сейчас предлагаются в общедоступной предварительной версии. Эта предварительная версия предоставляется без соглашения об уровне обслуживания, и мы не рекомендуем ее для рабочих нагрузок. Некоторые функции могут не поддерживаться или их возможности могут быть ограничены. Дополнительные сведения см. в разделе Supplemental Terms of Use for Microsoft Azure Previews.

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

Модели причин

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

Модели причин создают два типа содержимого в виде выходных данных:

  • Результаты рассуждений
  • Завершение вычислений

Оба эти завершения становятся частью содержимого, сформированного моделью. Таким образом, они вносят вклад в ограничения и затраты токенов, которые связаны с моделью. Некоторые модели, например DeepSeek-R1, могут отвечать, используя содержание с рассуждениями. Другие, например o1, выдают только завершения.

Предпосылки

Чтобы завершить работу с этим руководством, вам потребуется:

  • Подписка Azure. Если вы используете модели GitHub, вы можете обновить интерфейс и создать подписку Azure в процессе. Прочитайте Обновление моделей GitHub на модели Microsoft Foundry, если это ваш случай.

  • Проект компании Foundry. Этот тип проекта управляется ресурсом Foundry. Если у вас нет проекта Foundry, см. статью "Создание проекта для Foundry(Foundry projects)".

  • URL-адрес конечной точки.

  • Ключ конечной точки (если вы решили использовать ключ API для проверки подлинности).

  • Модель с возможностями рассуждения для развертывания. Если у вас его нет, прочитайте Добавление и настройка моделей Foundry чтобы добавить модель рассуждений.

    • В этом примере используется DeepSeek-R1.

Использование возможностей логического мышления в чате

Сначала создайте клиент для использования модели. В следующем коде используется URL-адрес конечной точки и ключ, хранящиеся в переменных среды.

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>

Если ресурс настроен с поддержкой Microsoft Entra ID, передайте токен в заголовок Authorization с форматом Bearer <token>. Используйте область https://ai.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>

Использование Microsoft Entra ID может потребовать дополнительной конфигурации в ресурсе для предоставления доступа. Узнайте, как настроить аутентификацию без ключа с помощью Microsoft Entra ID.

Модели логических подсказок

При создании запросов на создание моделей причин следует учитывать следующее:

  • Используйте простые инструкции и избегайте использования методов цепочки мышления.
  • Встроенные возможности рассуждения делают простые запросы нулевого снимка столь же эффективными, как и более сложные методы.
  • При предоставлении дополнительного контекста или документов, например в сценариях RAG, включая только наиболее релевантную информацию, может помочь предотвратить чрезмерное усложнение ответа модели.
  • Модели причин могут поддерживать использование системных сообщений. Однако они могут не следовать им строго, как и другие неразумные модели.
  • При создании многоэтапных приложений рассмотрите добавление только окончательного ответа из модели, без содержания обоснований, как это описано в разделе Содержание рассуждений.

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

Создание запроса на завершение чата

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

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

Ответ выглядит следующим образом, где можно просмотреть статистику использования модели:

{
    "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/regions 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/region. \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
    }
}

Содержание рассуждений

Замечание

Эта информация о содержимом рассуждений не относится к моделям Azure OpenAI. Azure модели рассуждений OpenAI используют функцию обобщение рассуждений.

Некоторые модели рассуждения, такие как DeepSeek-R1, формируют завершения и включают в себя обоснование.

Причина, связанная с завершением, включена в поле reasoning_content. Модель может выбрать, в каких сценариях генерировать рациональное содержимое.

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

Стриминг контента

По умолчанию API завершения возвращает все созданное содержимое в одном ответе. Если вы создаете длинные формулировки, ожидание ответа может занять много секунд.

Вы можете транслировать содержимое, чтобы получать его в режиме реального времени. Потоковая передача содержимого позволяет начать обработку результата по мере его доступности. Этот режим возвращает объект, который транслирует ответ в виде событий отправляемых сервером, содержащих только данные. Извлекайте фрагменты из дельта-поля, а не из поля сообщения.

Чтобы выполнить потоковую передачу завершений, задайте "stream": true при вызове модели.

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

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

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

Последнее сообщение в потоке имеет установленный finish_reason, указывающее причину остановки процесса генерации.

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

Параметры

Как правило, модели причин не поддерживают следующие параметры, которые можно найти в моделях завершения чата:

  • Температура
  • Штраф за присутствие
  • Штраф за повторение
  • Параметр top_p

Некоторые модели поддерживают использование средств или структурированных выходных данных (включая схемы JSON). Ознакомьтесь со страницей сведений о моделях , чтобы понять поддержку каждой модели.

Применение Guardrails и элементов управления

API интерпретации моделей Azure AI поддерживает Azure AI Content Safety. При использовании развертываний с включенным Azure AI Content Safety входные и выходные данные проходят через ансамбль моделей классификации, направленных на обнаружение и предотвращение вывода вредного содержимого. Система фильтрации содержимого обнаруживает и принимает меры по определенным категориям потенциально вредного содержимого как в запросах ввода, так и в завершении выходных данных.

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

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

Подсказка

Дополнительные сведения о настройке и управлении параметрами Azure AI Content Safety см. в документации Azure AI Content Safety.