Udostępnij za pośrednictwem


Jak używać modeli rozumowania z wnioskowaniem modelu AI platformy Azure

Ważne

Elementy oznaczone (wersja zapoznawcza) w tym artykule są obecnie dostępne w publicznej wersji zapoznawczej. Ta wersja zapoznawcza jest udostępniana bez umowy dotyczącej poziomu usług i nie zalecamy korzystania z niej w przypadku obciążeń produkcyjnych. Niektóre funkcje mogą być nieobsługiwane lub ograniczone. Aby uzyskać więcej informacji, zobacz Uzupełniające warunki korzystania z wersji zapoznawczych platformy Microsoft Azure.

W tym artykule wyjaśniono, jak używać możliwości rozumowania modeli uzupełniania czatów wdrożonych w wnioskowaniu modelu sztucznej inteligencji platformy Azure w usługach azure AI.

Modele rozumowania

Modele rozumowania mogą osiągnąć wyższy poziom wydajności w domenach, takich jak matematyka, kodowanie, nauka, strategia i logistyka. Sposób, w jaki te modele generują dane wyjściowe, jest jawnie używany łańcuch myśli do eksplorowania wszystkich możliwych ścieżek przed wygenerowaniem odpowiedzi. Weryfikują swoje odpowiedzi, tworząc je, co pomaga im dotrzeć do lepszych dokładnych wniosków. Oznacza to, że modele rozumowania mogą wymagać mniejszego kontekstu w monitowaniu w celu uzyskania skutecznych wyników.

Taki sposób skalowania wydajności modelu jest określany jako czas obliczeń wnioskowania, ponieważ wymienia wydajność z większym opóźnieniem i kosztami. Kontrastuje z innymi podejściami, które skaluje się w czasie obliczeń trenowania.

Następnie modele rozumowania tworzą dwa typy danych wyjściowych:

  • Uzupełnianie rozumowania
  • Uzupełnianie danych wyjściowych

Oba te uzupełnienia są liczone do zawartości wygenerowanej na podstawie modelu, a tym samym do limitów tokenów i kosztów skojarzonych z modelem. Niektóre modele mogą zwracać zawartość rozumowania, na przykład DeepSeek-R1. Niektóre inne, takie jak o1, wyprowadza tylko część danych wyjściowych ukończenia.

Wymagania wstępne

Do ukończenia tego samouczka niezbędne są następujące elementy:

  • Model z wnioskowaniem wdrożenia modelu możliwości. Jeśli nie masz jednego artykułu Dodawanie i konfigurowanie modeli w usługach azure AI w celu dodania modelu rozumowania.

    • W tych przykładach użyto polecenia DeepSeek-R1.
  • Zainstaluj pakiet wnioskowania usługi Azure AI za pomocą następującego polecenia:

    pip install -U azure-ai-inference
    

Korzystanie z możliwości rozumowania z czatem

Najpierw utwórz klienta, aby korzystać z modelu. Poniższy kod używa adresu URL punktu końcowego i klucza przechowywanego w zmiennych środowiskowych.

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

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

Napiwek

Sprawdź, czy model został wdrożony w zasobie usług Azure AI Services za pomocą interfejsu API wnioskowania modelu azure AI. Deepseek-R1 jest również dostępny jako punkty końcowe interfejsu API bezserwerowego. Jednak te punkty końcowe nie przyjmują parametru model , jak wyjaśniono w tym samouczku. Możesz to sprawdzić, przechodząc do pozycji Modele i punkty końcowe portalu> usługi Azure AI Foundry i sprawdź, czy model znajduje się na liście w sekcji Azure AI Services.

Jeśli zasób został skonfigurowany do obsługi identyfikatora Entra firmy Microsoft, możesz użyć następującego fragmentu kodu, aby utworzyć klienta.

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

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

Tworzenie żądania ukończenia czatu

W poniższym przykładzie pokazano, jak utworzyć podstawowe żądanie czatu do modelu.

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

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

Podczas tworzenia monitów dotyczących modeli rozumowania należy wziąć pod uwagę następujące kwestie:

  • Używaj prostych instrukcji i unikaj używania technik myślenia łańcuchowego.
  • Wbudowane możliwości rozumowania sprawiają, że proste monity zero-shot są skuteczne jako bardziej złożone metody.
  • W przypadku podawania dodatkowego kontekstu lub dokumentów, takich jak w scenariuszach RAG, w tym tylko najbardziej istotne informacje, mogą pomóc w zapobieganiu nadmiernemu komplikowaniu odpowiedzi przez model.
  • Modele rozumowania mogą obsługiwać korzystanie z komunikatów systemowych. Mogą jednak nie przestrzegać ich tak ściśle, jak inne modele niezwiązane z rozumowaniem.
  • Podczas tworzenia aplikacji wieloełowych należy rozważyć dołączenie tylko ostatecznej odpowiedzi z modelu bez konieczności wnioskowania zawartości, jak wyjaśniono w sekcji Uzasadnienie zawartości .

Odpowiedź jest następująca, gdzie można zobaczyć statystyki użycia modelu:

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

Rozumowanie zawartości

Niektóre modele rozumowania, takie jak DeepSeek-R1, generują ukończenia i zawierają uzasadnienie. Przyczyna skojarzona z ukończeniem jest zawarta w zawartości odpowiedzi w tagach <think> i </think>. Model może wybrać scenariusze generowania zawartości rozumowania. Możesz wyodrębnić zawartość rozumowania z odpowiedzi, aby zrozumieć proces myślowy modelu w następujący sposób:

import re

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

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

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

Podczas wykonywania konwersacji wieloeściowych warto unikać wysyłania treści rozumowania w historii czatów, ponieważ rozumowanie zwykle generuje długie wyjaśnienia.

Przesyłanie strumieniowe zawartości

Domyślnie interfejs API uzupełniania zwraca całą wygenerowaną zawartość w pojedynczej odpowiedzi. Jeśli generujesz długie zakończenia, oczekiwanie na odpowiedź może potrwać wiele sekund.

Możesz przesyłać strumieniowo zawartość, aby pobrać ją podczas jego generowania. Zawartość strumieniowa umożliwia rozpoczęcie przetwarzania ukończenia w miarę dostępności zawartości. Ten tryb zwraca obiekt, który przesyła strumieniowo odpowiedź jako zdarzenia wysyłane tylko do serwera. Wyodrębnij fragmenty z pola różnicowego, a nie z pola komunikatu.

Aby przesłać strumieniowo uzupełnienia, ustaw stream=True podczas wywoływania modelu.

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

Aby zwizualizować dane wyjściowe, zdefiniuj funkcję pomocnika, aby wydrukować strumień. Poniższy przykład implementuje routing, który przesyła strumieniowo tylko odpowiedź bez zawartości rozumowania:

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

Możesz zwizualizować sposób generowania zawartości przez przesyłanie strumieniowe:

print_stream(result)

Parametry

Ogólnie rzecz biorąc, modele rozumowania nie obsługują następujących parametrów, które można znaleźć w modelach uzupełniania czatu:

  • Temperatura
  • Kara obecności
  • Kara powtórzenia
  • Parametr top_p

Niektóre modele obsługują korzystanie z narzędzi lub danych wyjściowych ze strukturą (w tym schematów JSON). Przeczytaj stronę Szczegóły modeli, aby zrozumieć obsługę poszczególnych modeli.

Stosowanie bezpieczeństwa zawartości

Interfejs API wnioskowania modelu AI platformy Azure obsługuje bezpieczeństwo zawartości usługi Azure AI. W przypadku korzystania z wdrożeń z włączonym bezpieczeństwem zawartości sztucznej inteligencji platformy Azure dane wejściowe i wyjściowe przechodzą przez zespół modeli klasyfikacji mających na celu wykrywanie i zapobieganie wystąpieniu szkodliwej zawartości. System filtrowania zawartości wykrywa i podejmuje działania na określonych kategoriach potencjalnie szkodliwej zawartości w monitach wejściowych i uzupełnianiu danych wyjściowych.

W poniższym przykładzie pokazano, jak obsługiwać zdarzenia, gdy model wykryje szkodliwą zawartość w monicie wejściowym i włączono bezpieczeństwo zawartości.

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

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

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

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

Napiwek

Aby dowiedzieć się więcej na temat konfigurowania i kontrolowania ustawień bezpieczeństwa zawartości usługi Azure AI, zapoznaj się z dokumentacją dotyczącą bezpieczeństwa zawartości usługi Azure AI.

Ważne

Elementy oznaczone (wersja zapoznawcza) w tym artykule są obecnie dostępne w publicznej wersji zapoznawczej. Ta wersja zapoznawcza jest udostępniana bez umowy dotyczącej poziomu usług i nie zalecamy korzystania z niej w przypadku obciążeń produkcyjnych. Niektóre funkcje mogą być nieobsługiwane lub ograniczone. Aby uzyskać więcej informacji, zobacz Uzupełniające warunki korzystania z wersji zapoznawczych platformy Microsoft Azure.

W tym artykule wyjaśniono, jak używać możliwości rozumowania modeli uzupełniania czatów wdrożonych w wnioskowaniu modelu sztucznej inteligencji platformy Azure w usługach azure AI.

Modele rozumowania

Modele rozumowania mogą osiągnąć wyższy poziom wydajności w domenach, takich jak matematyka, kodowanie, nauka, strategia i logistyka. Sposób, w jaki te modele generują dane wyjściowe, jest jawnie używany łańcuch myśli do eksplorowania wszystkich możliwych ścieżek przed wygenerowaniem odpowiedzi. Weryfikują swoje odpowiedzi, tworząc je, co pomaga im dotrzeć do lepszych dokładnych wniosków. Oznacza to, że modele rozumowania mogą wymagać mniejszego kontekstu w monitowaniu w celu uzyskania skutecznych wyników.

Taki sposób skalowania wydajności modelu jest określany jako czas obliczeń wnioskowania, ponieważ wymienia wydajność z większym opóźnieniem i kosztami. Kontrastuje z innymi podejściami, które skaluje się w czasie obliczeń trenowania.

Następnie modele rozumowania tworzą dwa typy danych wyjściowych:

  • Uzupełnianie rozumowania
  • Uzupełnianie danych wyjściowych

Oba te uzupełnienia są liczone do zawartości wygenerowanej na podstawie modelu, a tym samym do limitów tokenów i kosztów skojarzonych z modelem. Niektóre modele mogą zwracać zawartość rozumowania, na przykład DeepSeek-R1. Niektóre inne, takie jak o1, wyprowadza tylko część danych wyjściowych ukończenia.

Wymagania wstępne

Do ukończenia tego samouczka niezbędne są następujące elementy:

Korzystanie z możliwości rozumowania z czatem

Najpierw utwórz klienta, aby korzystać z modelu. Poniższy kod używa adresu URL punktu końcowego i klucza przechowywanego w zmiennych środowiskowych.

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

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

Napiwek

Sprawdź, czy model został wdrożony w zasobie usług Azure AI Services za pomocą interfejsu API wnioskowania modelu azure AI. Deepseek-R1 jest również dostępny jako punkty końcowe interfejsu API bezserwerowego. Jednak te punkty końcowe nie przyjmują parametru model , jak wyjaśniono w tym samouczku. Możesz to sprawdzić, przechodząc do pozycji Modele i punkty końcowe portalu> usługi Azure AI Foundry i sprawdź, czy model znajduje się na liście w sekcji Azure AI Services.

Jeśli zasób został skonfigurowany do obsługi identyfikatora Entra firmy Microsoft, możesz użyć następującego fragmentu kodu, aby utworzyć klienta.

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

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

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

Tworzenie żądania ukończenia czatu

W poniższym przykładzie pokazano, jak utworzyć podstawowe żądanie czatu do modelu.

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

Podczas tworzenia monitów dotyczących modeli rozumowania należy wziąć pod uwagę następujące kwestie:

  • Używaj prostych instrukcji i unikaj używania technik myślenia łańcuchowego.
  • Wbudowane możliwości rozumowania sprawiają, że proste monity zero-shot są skuteczne jako bardziej złożone metody.
  • W przypadku podawania dodatkowego kontekstu lub dokumentów, takich jak w scenariuszach RAG, w tym tylko najbardziej istotne informacje, mogą pomóc w zapobieganiu nadmiernemu komplikowaniu odpowiedzi przez model.
  • Modele rozumowania mogą obsługiwać korzystanie z komunikatów systemowych. Mogą jednak nie przestrzegać ich tak ściśle, jak inne modele niezwiązane z rozumowaniem.
  • Podczas tworzenia aplikacji wieloełowych należy rozważyć dołączenie tylko ostatecznej odpowiedzi z modelu bez konieczności wnioskowania zawartości, jak wyjaśniono w sekcji Uzasadnienie zawartości .

Odpowiedź jest następująca, gdzie można zobaczyć statystyki użycia modelu:

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

Rozumowanie zawartości

Niektóre modele rozumowania, takie jak DeepSeek-R1, generują ukończenia i zawierają uzasadnienie. Przyczyna skojarzona z ukończeniem jest zawarta w zawartości odpowiedzi w tagach <think> i </think>. Model może wybrać scenariusze generowania zawartości rozumowania. Możesz wyodrębnić zawartość rozumowania z odpowiedzi, aby zrozumieć proces myślowy modelu w następujący sposób:

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

Podczas wykonywania konwersacji wieloeściowych warto unikać wysyłania treści rozumowania w historii czatów, ponieważ rozumowanie zwykle generuje długie wyjaśnienia.

Przesyłanie strumieniowe zawartości

Domyślnie interfejs API uzupełniania zwraca całą wygenerowaną zawartość w pojedynczej odpowiedzi. Jeśli generujesz długie zakończenia, oczekiwanie na odpowiedź może potrwać wiele sekund.

Możesz przesyłać strumieniowo zawartość, aby pobrać ją podczas jego generowania. Zawartość strumieniowa umożliwia rozpoczęcie przetwarzania ukończenia w miarę dostępności zawartości. Ten tryb zwraca obiekt, który przesyła strumieniowo odpowiedź jako zdarzenia wysyłane tylko do serwera. Wyodrębnij fragmenty z pola różnicowego, a nie z pola komunikatu.

Aby przesłać strumieniowo uzupełnienia, ustaw stream=True podczas wywoływania modelu.

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

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

Aby zwizualizować dane wyjściowe, zdefiniuj funkcję pomocnika, aby wydrukować strumień. Poniższy przykład implementuje routing, który przesyła strumieniowo tylko odpowiedź bez zawartości rozumowania:

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

Możesz zwizualizować sposób generowania zawartości przez przesyłanie strumieniowe:

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

Parametry

Ogólnie rzecz biorąc, modele rozumowania nie obsługują następujących parametrów, które można znaleźć w modelach uzupełniania czatu:

  • Temperatura
  • Kara obecności
  • Kara powtórzenia
  • Parametr top_p

Niektóre modele obsługują korzystanie z narzędzi lub danych wyjściowych ze strukturą (w tym schematów JSON). Przeczytaj stronę Szczegóły modeli, aby zrozumieć obsługę poszczególnych modeli.

Stosowanie bezpieczeństwa zawartości

Interfejs API wnioskowania modelu AI platformy Azure obsługuje bezpieczeństwo zawartości usługi Azure AI. W przypadku korzystania z wdrożeń z włączonym bezpieczeństwem zawartości sztucznej inteligencji platformy Azure dane wejściowe i wyjściowe przechodzą przez zespół modeli klasyfikacji mających na celu wykrywanie i zapobieganie wystąpieniu szkodliwej zawartości. System filtrowania zawartości wykrywa i podejmuje działania na określonych kategoriach potencjalnie szkodliwej zawartości w monitach wejściowych i uzupełnianiu danych wyjściowych.

W poniższym przykładzie pokazano, jak obsługiwać zdarzenia, gdy model wykryje szkodliwą zawartość w monicie wejściowym i włączono bezpieczeństwo zawartości.

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

Napiwek

Aby dowiedzieć się więcej na temat konfigurowania i kontrolowania ustawień bezpieczeństwa zawartości usługi Azure AI, zapoznaj się z dokumentacją dotyczącą bezpieczeństwa zawartości usługi Azure AI.

Ważne

Elementy oznaczone (wersja zapoznawcza) w tym artykule są obecnie dostępne w publicznej wersji zapoznawczej. Ta wersja zapoznawcza jest udostępniana bez umowy dotyczącej poziomu usług i nie zalecamy korzystania z niej w przypadku obciążeń produkcyjnych. Niektóre funkcje mogą być nieobsługiwane lub ograniczone. Aby uzyskać więcej informacji, zobacz Uzupełniające warunki korzystania z wersji zapoznawczych platformy Microsoft Azure.

W tym artykule wyjaśniono, jak używać możliwości rozumowania modeli uzupełniania czatów wdrożonych w wnioskowaniu modelu sztucznej inteligencji platformy Azure w usługach azure AI.

Modele rozumowania

Modele rozumowania mogą osiągnąć wyższy poziom wydajności w domenach, takich jak matematyka, kodowanie, nauka, strategia i logistyka. Sposób, w jaki te modele generują dane wyjściowe, jest jawnie używany łańcuch myśli do eksplorowania wszystkich możliwych ścieżek przed wygenerowaniem odpowiedzi. Weryfikują swoje odpowiedzi, tworząc je, co pomaga im dotrzeć do lepszych dokładnych wniosków. Oznacza to, że modele rozumowania mogą wymagać mniejszego kontekstu w monitowaniu w celu uzyskania skutecznych wyników.

Taki sposób skalowania wydajności modelu jest określany jako czas obliczeń wnioskowania, ponieważ wymienia wydajność z większym opóźnieniem i kosztami. Kontrastuje z innymi podejściami, które skaluje się w czasie obliczeń trenowania.

Następnie modele rozumowania tworzą dwa typy danych wyjściowych:

  • Uzupełnianie rozumowania
  • Uzupełnianie danych wyjściowych

Oba te uzupełnienia są liczone do zawartości wygenerowanej na podstawie modelu, a tym samym do limitów tokenów i kosztów skojarzonych z modelem. Niektóre modele mogą zwracać zawartość rozumowania, na przykład DeepSeek-R1. Niektóre inne, takie jak o1, wyprowadza tylko część danych wyjściowych ukończenia.

Wymagania wstępne

Do ukończenia tego samouczka niezbędne są następujące elementy:

  • Model z wnioskowaniem wdrożenia modelu możliwości. Jeśli nie masz jednego artykułu Dodawanie i konfigurowanie modeli w usługach azure AI w celu dodania modelu rozumowania.

    • W tych przykładach użyto polecenia DeepSeek-R1.
  • Dodaj pakiet wnioskowania usługi Azure AI do projektu:

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-ai-inference</artifactId>
        <version>1.0.0-beta.2</version>
    </dependency>
    
  • Jeśli używasz identyfikatora Entra, potrzebujesz również następującego pakietu:

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity</artifactId>
        <version>1.13.3</version>
    </dependency>
    
  • Zaimportuj następującą przestrzeń nazw:

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

Korzystanie z możliwości rozumowania z czatem

Najpierw utwórz klienta, aby korzystać z modelu. Poniższy kod używa adresu URL punktu końcowego i klucza przechowywanego w zmiennych środowiskowych.

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

Napiwek

Sprawdź, czy model został wdrożony w zasobie usług Azure AI Services za pomocą interfejsu API wnioskowania modelu azure AI. Deepseek-R1 jest również dostępny jako punkty końcowe interfejsu API bezserwerowego. Jednak te punkty końcowe nie przyjmują parametru model , jak wyjaśniono w tym samouczku. Możesz to sprawdzić, przechodząc do pozycji Modele i punkty końcowe portalu> usługi Azure AI Foundry i sprawdź, czy model znajduje się na liście w sekcji Azure AI Services.

Jeśli zasób został skonfigurowany do obsługi identyfikatora Entra firmy Microsoft, możesz użyć następującego fragmentu kodu, aby utworzyć klienta.

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

Tworzenie żądania ukończenia czatu

W poniższym przykładzie pokazano, jak utworzyć podstawowe żądanie czatu do modelu.

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

Podczas tworzenia monitów dotyczących modeli rozumowania należy wziąć pod uwagę następujące kwestie:

  • Używaj prostych instrukcji i unikaj używania technik myślenia łańcuchowego.
  • Wbudowane możliwości rozumowania sprawiają, że proste monity zero-shot są skuteczne jako bardziej złożone metody.
  • W przypadku podawania dodatkowego kontekstu lub dokumentów, takich jak w scenariuszach RAG, w tym tylko najbardziej istotne informacje, mogą pomóc w zapobieganiu nadmiernemu komplikowaniu odpowiedzi przez model.
  • Modele rozumowania mogą obsługiwać korzystanie z komunikatów systemowych. Mogą jednak nie przestrzegać ich tak ściśle, jak inne modele niezwiązane z rozumowaniem.
  • Podczas tworzenia aplikacji wieloełowych należy rozważyć dołączenie tylko ostatecznej odpowiedzi z modelu bez konieczności wnioskowania zawartości, jak wyjaśniono w sekcji Uzasadnienie zawartości .

Odpowiedź jest następująca, gdzie można zobaczyć statystyki użycia modelu:

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

Rozumowanie zawartości

Niektóre modele rozumowania, takie jak DeepSeek-R1, generują ukończenia i zawierają uzasadnienie. Przyczyna skojarzona z ukończeniem jest zawarta w zawartości odpowiedzi w tagach <think> i </think>. Model może wybrać scenariusze generowania zawartości rozumowania. Możesz wyodrębnić zawartość rozumowania z odpowiedzi, aby zrozumieć proces myślowy modelu w następujący sposób:

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

Podczas wykonywania konwersacji wieloeściowych warto unikać wysyłania treści rozumowania w historii czatów, ponieważ rozumowanie zwykle generuje długie wyjaśnienia.

Przesyłanie strumieniowe zawartości

Domyślnie interfejs API uzupełniania zwraca całą wygenerowaną zawartość w pojedynczej odpowiedzi. Jeśli generujesz długie zakończenia, oczekiwanie na odpowiedź może potrwać wiele sekund.

Możesz przesyłać strumieniowo zawartość, aby pobrać ją podczas jego generowania. Zawartość strumieniowa umożliwia rozpoczęcie przetwarzania ukończenia w miarę dostępności zawartości. Ten tryb zwraca obiekt, który przesyła strumieniowo odpowiedź jako zdarzenia wysyłane tylko do serwera. Wyodrębnij fragmenty z pola różnicowego, a nie z pola komunikatu.

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

Aby zwizualizować dane wyjściowe, zdefiniuj funkcję pomocnika, aby wydrukować strumień. Poniższy przykład implementuje routing, który przesyła strumieniowo tylko odpowiedź bez zawartości rozumowania:

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

Możesz zwizualizować sposób generowania zawartości przez przesyłanie strumieniowe:

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

Parametry

Ogólnie rzecz biorąc, modele rozumowania nie obsługują następujących parametrów, które można znaleźć w modelach uzupełniania czatu:

  • Temperatura
  • Kara obecności
  • Kara powtórzenia
  • Parametr top_p

Niektóre modele obsługują korzystanie z narzędzi lub danych wyjściowych ze strukturą (w tym schematów JSON). Przeczytaj stronę Szczegóły modeli, aby zrozumieć obsługę poszczególnych modeli.

Ważne

Elementy oznaczone (wersja zapoznawcza) w tym artykule są obecnie dostępne w publicznej wersji zapoznawczej. Ta wersja zapoznawcza jest udostępniana bez umowy dotyczącej poziomu usług i nie zalecamy korzystania z niej w przypadku obciążeń produkcyjnych. Niektóre funkcje mogą być nieobsługiwane lub ograniczone. Aby uzyskać więcej informacji, zobacz Uzupełniające warunki korzystania z wersji zapoznawczych platformy Microsoft Azure.

W tym artykule wyjaśniono, jak używać możliwości rozumowania modeli uzupełniania czatów wdrożonych w wnioskowaniu modelu sztucznej inteligencji platformy Azure w usługach azure AI.

Modele rozumowania

Modele rozumowania mogą osiągnąć wyższy poziom wydajności w domenach, takich jak matematyka, kodowanie, nauka, strategia i logistyka. Sposób, w jaki te modele generują dane wyjściowe, jest jawnie używany łańcuch myśli do eksplorowania wszystkich możliwych ścieżek przed wygenerowaniem odpowiedzi. Weryfikują swoje odpowiedzi, tworząc je, co pomaga im dotrzeć do lepszych dokładnych wniosków. Oznacza to, że modele rozumowania mogą wymagać mniejszego kontekstu w monitowaniu w celu uzyskania skutecznych wyników.

Taki sposób skalowania wydajności modelu jest określany jako czas obliczeń wnioskowania, ponieważ wymienia wydajność z większym opóźnieniem i kosztami. Kontrastuje z innymi podejściami, które skaluje się w czasie obliczeń trenowania.

Następnie modele rozumowania tworzą dwa typy danych wyjściowych:

  • Uzupełnianie rozumowania
  • Uzupełnianie danych wyjściowych

Oba te uzupełnienia są liczone do zawartości wygenerowanej na podstawie modelu, a tym samym do limitów tokenów i kosztów skojarzonych z modelem. Niektóre modele mogą zwracać zawartość rozumowania, na przykład DeepSeek-R1. Niektóre inne, takie jak o1, wyprowadza tylko część danych wyjściowych ukończenia.

Wymagania wstępne

Do ukończenia tego samouczka niezbędne są następujące elementy:

  • Model z wnioskowaniem wdrożenia modelu możliwości. Jeśli nie masz jednego artykułu Dodawanie i konfigurowanie modeli w usługach azure AI w celu dodania modelu rozumowania.

    • W tym przykładzie użyto wartości DeepSeek-R1.
  • Zainstaluj pakiet wnioskowania usługi Azure AI za pomocą następującego polecenia:

    dotnet add package Azure.AI.Inference --prerelease
    
  • Jeśli używasz identyfikatora Entra, potrzebujesz również następującego pakietu:

    dotnet add package Azure.Identity
    

Korzystanie z możliwości rozumowania z czatem

Najpierw utwórz klienta, aby korzystać z modelu. Poniższy kod używa adresu URL punktu końcowego i klucza przechowywanego w zmiennych środowiskowych.

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

Napiwek

Sprawdź, czy model został wdrożony w zasobie usług Azure AI Services za pomocą interfejsu API wnioskowania modelu azure AI. Deepseek-R1 jest również dostępny jako punkty końcowe interfejsu API bezserwerowego. Jednak te punkty końcowe nie przyjmują parametru model , jak wyjaśniono w tym samouczku. Możesz to sprawdzić, przechodząc do pozycji Modele i punkty końcowe portalu> usługi Azure AI Foundry i sprawdź, czy model znajduje się na liście w sekcji Azure AI Services.

Jeśli zasób został skonfigurowany do obsługi identyfikatora Entra firmy Microsoft, możesz użyć następującego fragmentu kodu, aby utworzyć klienta.

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

clientOptions.AddPolicy(tokenPolicy, HttpPipelinePosition.PerRetry);

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

Tworzenie żądania ukończenia czatu

W poniższym przykładzie pokazano, jak utworzyć podstawowe żądanie czatu do modelu.

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

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

Podczas tworzenia monitów dotyczących modeli rozumowania należy wziąć pod uwagę następujące kwestie:

  • Używaj prostych instrukcji i unikaj używania technik myślenia łańcuchowego.
  • Wbudowane możliwości rozumowania sprawiają, że proste monity zero-shot są skuteczne jako bardziej złożone metody.
  • W przypadku podawania dodatkowego kontekstu lub dokumentów, takich jak w scenariuszach RAG, w tym tylko najbardziej istotne informacje, mogą pomóc w zapobieganiu nadmiernemu komplikowaniu odpowiedzi przez model.
  • Modele rozumowania mogą obsługiwać korzystanie z komunikatów systemowych. Mogą jednak nie przestrzegać ich tak ściśle, jak inne modele niezwiązane z rozumowaniem.
  • Podczas tworzenia aplikacji wieloełowych należy rozważyć dołączenie tylko ostatecznej odpowiedzi z modelu bez konieczności wnioskowania zawartości, jak wyjaśniono w sekcji Uzasadnienie zawartości .

Odpowiedź jest następująca, gdzie można zobaczyć statystyki użycia modelu:

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

Rozumowanie zawartości

Niektóre modele rozumowania, takie jak DeepSeek-R1, generują ukończenia i zawierają uzasadnienie. Przyczyna skojarzona z ukończeniem jest zawarta w zawartości odpowiedzi w tagach <think> i </think>. Model może wybrać scenariusze generowania zawartości rozumowania. Możesz wyodrębnić zawartość rozumowania z odpowiedzi, aby zrozumieć proces myślowy modelu w następujący sposób:

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

Podczas wykonywania konwersacji wieloeściowych warto unikać wysyłania treści rozumowania w historii czatów, ponieważ rozumowanie zwykle generuje długie wyjaśnienia.

Przesyłanie strumieniowe zawartości

Domyślnie interfejs API uzupełniania zwraca całą wygenerowaną zawartość w pojedynczej odpowiedzi. Jeśli generujesz długie zakończenia, oczekiwanie na odpowiedź może potrwać wiele sekund.

Możesz przesyłać strumieniowo zawartość, aby pobrać ją podczas jego generowania. Zawartość strumieniowa umożliwia rozpoczęcie przetwarzania ukończenia w miarę dostępności zawartości. Ten tryb zwraca obiekt, który przesyła strumieniowo odpowiedź jako zdarzenia wysyłane tylko do serwera. Wyodrębnij fragmenty z pola różnicowego, a nie z pola komunikatu.

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

Aby zwizualizować dane wyjściowe, zdefiniuj funkcję pomocnika, aby wydrukować strumień. Poniższy przykład implementuje routing, który przesyła strumieniowo tylko odpowiedź bez zawartości rozumowania:

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

Możesz zwizualizować sposób generowania zawartości przez przesyłanie strumieniowe:

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

Parametry

Ogólnie rzecz biorąc, modele rozumowania nie obsługują następujących parametrów, które można znaleźć w modelach uzupełniania czatu:

  • Temperatura
  • Kara obecności
  • Kara powtórzenia
  • Parametr top_p

Niektóre modele obsługują korzystanie z narzędzi lub danych wyjściowych ze strukturą (w tym schematów JSON). Przeczytaj stronę Szczegóły modeli, aby zrozumieć obsługę poszczególnych modeli.

Stosowanie bezpieczeństwa zawartości

Interfejs API wnioskowania modelu AI platformy Azure obsługuje bezpieczeństwo zawartości usługi Azure AI. W przypadku korzystania z wdrożeń z włączonym bezpieczeństwem zawartości sztucznej inteligencji platformy Azure dane wejściowe i wyjściowe przechodzą przez zespół modeli klasyfikacji mających na celu wykrywanie i zapobieganie wystąpieniu szkodliwej zawartości. System filtrowania zawartości wykrywa i podejmuje działania na określonych kategoriach potencjalnie szkodliwej zawartości w monitach wejściowych i uzupełnianiu danych wyjściowych.

W poniższym przykładzie pokazano, jak obsługiwać zdarzenia, gdy model wykryje szkodliwą zawartość w monicie wejściowym i włączono bezpieczeństwo zawartości.

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

Napiwek

Aby dowiedzieć się więcej na temat konfigurowania i kontrolowania ustawień bezpieczeństwa zawartości usługi Azure AI, zapoznaj się z dokumentacją dotyczącą bezpieczeństwa zawartości usługi Azure AI.

Ważne

Elementy oznaczone (wersja zapoznawcza) w tym artykule są obecnie dostępne w publicznej wersji zapoznawczej. Ta wersja zapoznawcza jest udostępniana bez umowy dotyczącej poziomu usług i nie zalecamy korzystania z niej w przypadku obciążeń produkcyjnych. Niektóre funkcje mogą być nieobsługiwane lub ograniczone. Aby uzyskać więcej informacji, zobacz Uzupełniające warunki korzystania z wersji zapoznawczych platformy Microsoft Azure.

W tym artykule wyjaśniono, jak używać możliwości rozumowania modeli uzupełniania czatów wdrożonych w wnioskowaniu modelu sztucznej inteligencji platformy Azure w usługach azure AI.

Modele rozumowania

Modele rozumowania mogą osiągnąć wyższy poziom wydajności w domenach, takich jak matematyka, kodowanie, nauka, strategia i logistyka. Sposób, w jaki te modele generują dane wyjściowe, jest jawnie używany łańcuch myśli do eksplorowania wszystkich możliwych ścieżek przed wygenerowaniem odpowiedzi. Weryfikują swoje odpowiedzi, tworząc je, co pomaga im dotrzeć do lepszych dokładnych wniosków. Oznacza to, że modele rozumowania mogą wymagać mniejszego kontekstu w monitowaniu w celu uzyskania skutecznych wyników.

Taki sposób skalowania wydajności modelu jest określany jako czas obliczeń wnioskowania, ponieważ wymienia wydajność z większym opóźnieniem i kosztami. Kontrastuje z innymi podejściami, które skaluje się w czasie obliczeń trenowania.

Następnie modele rozumowania tworzą dwa typy danych wyjściowych:

  • Uzupełnianie rozumowania
  • Uzupełnianie danych wyjściowych

Oba te uzupełnienia są liczone do zawartości wygenerowanej na podstawie modelu, a tym samym do limitów tokenów i kosztów skojarzonych z modelem. Niektóre modele mogą zwracać zawartość rozumowania, na przykład DeepSeek-R1. Niektóre inne, takie jak o1, wyprowadza tylko część danych wyjściowych ukończenia.

Wymagania wstępne

Do ukończenia tego samouczka niezbędne są następujące elementy:

  • Model z wnioskowaniem wdrożenia modelu możliwości. Jeśli nie masz jednego artykułu Dodawanie i konfigurowanie modeli w usługach azure AI w celu dodania modelu rozumowania.

    • W tych przykładach użyto polecenia DeepSeek-R1.

Korzystanie z możliwości rozumowania z czatem

Najpierw utwórz klienta, aby korzystać z modelu. Poniższy kod używa adresu URL punktu końcowego i klucza przechowywanego w zmiennych środowiskowych.

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

Napiwek

Sprawdź, czy model został wdrożony w zasobie usług Azure AI Services za pomocą interfejsu API wnioskowania modelu azure AI. Deepseek-R1 jest również dostępny jako punkty końcowe interfejsu API bezserwerowego. Jednak te punkty końcowe nie przyjmują parametru model , jak wyjaśniono w tym samouczku. Możesz to sprawdzić, przechodząc do pozycji Modele i punkty końcowe portalu> usługi Azure AI Foundry i sprawdź, czy model znajduje się na liście w sekcji Azure AI Services.

Jeśli skonfigurowano zasób z obsługą identyfikatora Entra firmy Microsoft, przekaż token w nagłówkuAuthorization:

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

Tworzenie żądania ukończenia czatu

W poniższym przykładzie pokazano, jak utworzyć podstawowe żądanie czatu do modelu.

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

Podczas tworzenia monitów dotyczących modeli rozumowania należy wziąć pod uwagę następujące kwestie:

  • Używaj prostych instrukcji i unikaj używania technik myślenia łańcuchowego.
  • Wbudowane możliwości rozumowania sprawiają, że proste monity zero-shot są skuteczne jako bardziej złożone metody.
  • W przypadku podawania dodatkowego kontekstu lub dokumentów, takich jak w scenariuszach RAG, w tym tylko najbardziej istotne informacje, mogą pomóc w zapobieganiu nadmiernemu komplikowaniu odpowiedzi przez model.
  • Modele rozumowania mogą obsługiwać korzystanie z komunikatów systemowych. Mogą jednak nie przestrzegać ich tak ściśle, jak inne modele niezwiązane z rozumowaniem.
  • Podczas tworzenia aplikacji wieloełowych należy rozważyć dołączenie tylko ostatecznej odpowiedzi z modelu bez konieczności wnioskowania zawartości, jak wyjaśniono w sekcji Uzasadnienie zawartości .

Odpowiedź jest następująca, gdzie można zobaczyć statystyki użycia modelu:

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

Rozumowanie zawartości

Niektóre modele rozumowania, takie jak DeepSeek-R1, generują ukończenia i zawierają uzasadnienie. Przyczyna skojarzona z ukończeniem jest zawarta w zawartości odpowiedzi w tagach <think> i </think>. Model może wybrać scenariusze generowania zawartości rozumowania.

Podczas wykonywania konwersacji wieloeściowych warto unikać wysyłania treści rozumowania w historii czatów, ponieważ rozumowanie zwykle generuje długie wyjaśnienia.

Przesyłanie strumieniowe zawartości

Domyślnie interfejs API uzupełniania zwraca całą wygenerowaną zawartość w pojedynczej odpowiedzi. Jeśli generujesz długie zakończenia, oczekiwanie na odpowiedź może potrwać wiele sekund.

Możesz przesyłać strumieniowo zawartość, aby pobrać ją podczas jego generowania. Zawartość strumieniowa umożliwia rozpoczęcie przetwarzania ukończenia w miarę dostępności zawartości. Ten tryb zwraca obiekt, który przesyła strumieniowo odpowiedź jako zdarzenia wysyłane tylko do serwera. Wyodrębnij fragmenty z pola różnicowego, a nie z pola komunikatu.

Aby przesłać strumieniowo uzupełnienia, ustaw "stream": true podczas wywoływania modelu.

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

Aby zwizualizować dane wyjściowe, zdefiniuj funkcję pomocnika, aby wydrukować strumień. Poniższy przykład implementuje routing, który przesyła strumieniowo tylko odpowiedź bez zawartości rozumowania:

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

Ostatni komunikat w strumieniu został finish_reason ustawiony, wskazujący przyczynę zatrzymania procesu generowania.

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

Parametry

Ogólnie rzecz biorąc, modele rozumowania nie obsługują następujących parametrów, które można znaleźć w modelach uzupełniania czatu:

  • Temperatura
  • Kara obecności
  • Kara powtórzenia
  • Parametr top_p

Niektóre modele obsługują korzystanie z narzędzi lub danych wyjściowych ze strukturą (w tym schematów JSON). Przeczytaj stronę Szczegóły modeli, aby zrozumieć obsługę poszczególnych modeli.

Stosowanie bezpieczeństwa zawartości

Interfejs API wnioskowania modelu AI platformy Azure obsługuje bezpieczeństwo zawartości usługi Azure AI. W przypadku korzystania z wdrożeń z włączonym bezpieczeństwem zawartości sztucznej inteligencji platformy Azure dane wejściowe i wyjściowe przechodzą przez zespół modeli klasyfikacji mających na celu wykrywanie i zapobieganie wystąpieniu szkodliwej zawartości. System filtrowania zawartości wykrywa i podejmuje działania na określonych kategoriach potencjalnie szkodliwej zawartości w monitach wejściowych i uzupełnianiu danych wyjściowych.

W poniższym przykładzie pokazano, jak obsługiwać zdarzenia, gdy model wykryje szkodliwą zawartość w monicie wejściowym i włączono bezpieczeństwo zawartości.

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

Napiwek

Aby dowiedzieć się więcej na temat konfigurowania i kontrolowania ustawień bezpieczeństwa zawartości usługi Azure AI, zapoznaj się z dokumentacją dotyczącą bezpieczeństwa zawartości usługi Azure AI.