Dela via


Så här genererar du chattavslut med Azure AI-modellinferens

Viktigt!

Objekt markerade (förhandsversion) i den här artikeln är för närvarande i offentlig förhandsversion. Den här förhandsversionen tillhandahålls utan ett serviceavtal och vi rekommenderar det inte för produktionsarbetsbelastningar. Vissa funktioner kanske inte stöds eller kan vara begränsade. Mer information finns i Kompletterande villkor för användning av Microsoft Azure-förhandsversioner.

Den här artikeln beskriver hur du använder API:et för chattslutsättningar med modeller som distribuerats till Azure AI-modellinferens i Azure AI-tjänster.

Förutsättningar

Om du vill använda modeller för chattkomplettering i ditt program behöver du:

Använda chattens slutföranden

Skapa först klienten för att använda modellen. I följande kod används en slutpunkts-URL och nyckel som lagras i miljövariabler.

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

client = ChatCompletionsClient(
    endpoint=os.environ["AZURE_INFERENCE_ENDPOINT"],
    credential=AzureKeyCredential(os.environ["AZURE_INFERENCE_CREDENTIAL"]),
    model="mistral-large-2407"
)

Om du har konfigurerat resursen till med Stöd för Microsoft Entra-ID kan du använda följande kodfragment för att skapa en klient.

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

client = ChatCompletionsClient(
    endpoint=os.environ["AZURE_INFERENCE_ENDPOINT"],
    credential=DefaultAzureCredential(),
    model="mistral-large-2407"
)

Skapa en begäran om att chatten ska slutföras

I följande exempel visas hur du kan skapa en grundläggande begäran om att slutföra chatten till modellen.

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

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

Kommentar

Vissa modeller stöder inte systemmeddelanden (role="system"). När du använder AZURE AI-modellinferens-API:et översätts systemmeddelanden till användarmeddelanden, vilket är den närmaste tillgängliga funktionen. Den här översättningen erbjuds för enkelhetens skull, men det är viktigt att du kontrollerar att modellen följer anvisningarna i systemmeddelandet med rätt konfidensnivå.

Svaret är följande, där du kan se modellens användningsstatistik:

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: mistral-large-2407
Usage: 
  Prompt tokens: 19
  Total tokens: 91
  Completion tokens: 72

usage Granska avsnittet i svaret för att se antalet token som används för prompten, det totala antalet token som genererats och antalet token som används för slutförandet.

Strömma innehåll

Som standard returnerar API:et för slutförande hela det genererade innehållet i ett enda svar. Om du genererar långa slutföranden kan det ta många sekunder att vänta på svaret.

Du kan strömma innehållet för att hämta det när det genereras. Med strömmande innehåll kan du börja bearbeta slutförandet när innehållet blir tillgängligt. Det här läget returnerar ett objekt som strömmar tillbaka svaret som databaserade serverutskickade händelser. Extrahera segment från deltafältet i stället för meddelandefältet.

Om du vill strömma slutföranden anger stream=True du när du anropar modellen.

result = client.complete(
    messages=[
        SystemMessage(content="You are a helpful assistant."),
        UserMessage(content="How many languages are in the world?"),
    ],
    temperature=0,
    top_p=1,
    max_tokens=2048,
    stream=True,
)

Om du vill visualisera utdata definierar du en hjälpfunktion för att skriva ut strömmen.

def print_stream(result):
    """
    Prints the chat completion with streaming.
    """
    import time
    for update in result:
        if update.choices:
            print(update.choices[0].delta.content, end="")

Du kan visualisera hur strömning genererar innehåll:

print_stream(result)

Utforska fler parametrar som stöds av slutsatsdragningsklienten

Utforska andra parametrar som du kan ange i slutsatsdragningsklienten. En fullständig lista över alla parametrar som stöds och deras motsvarande dokumentation finns i API-referensen för Azure AI-modellinferens.

from azure.ai.inference.models import ChatCompletionsResponseFormatText

response = client.complete(
    messages=[
        SystemMessage(content="You are a helpful assistant."),
        UserMessage(content="How many languages are in the world?"),
    ],
    presence_penalty=0.1,
    frequency_penalty=0.8,
    max_tokens=2048,
    stop=["<|endoftext|>"],
    temperature=0,
    top_p=1,
    response_format={ "type": ChatCompletionsResponseFormatText() },
)

Vissa modeller stöder inte JSON-utdataformatering. Du kan alltid uppmana modellen att generera JSON-utdata. Sådana utdata är dock inte garanterade att vara giltiga JSON.

Om du vill skicka en parameter som inte finns med i listan över parametrar som stöds kan du skicka den till den underliggande modellen med hjälp av extra parametrar. Se Skicka extra parametrar till modellen.

Skapa JSON-utdata

Vissa modeller kan skapa JSON-utdata. Ange response_format till json_object för att aktivera JSON-läge och garantera att meddelandet som modellen genererar är giltigt JSON. Du måste också instruera modellen att skapa JSON själv via ett system- eller användarmeddelande. Dessutom kan meddelandeinnehållet vara delvis avskuret om finish_reason="length", vilket indikerar att genereringen överskred max_tokens eller att konversationen överskred den maximala kontextlängden.

from azure.ai.inference.models import ChatCompletionsResponseFormatJSON

response = client.complete(
    messages=[
        SystemMessage(content="You are a helpful assistant that always generate responses in JSON format, using."
                      " the following format: { ""answer"": ""response"" }."),
        UserMessage(content="How many languages are in the world?"),
    ],
    response_format={ "type": ChatCompletionsResponseFormatJSON() }
)

Skicka extra parametrar till modellen

Med AZURE AI Model Inference API kan du skicka extra parametrar till modellen. Följande kodexempel visar hur du skickar den extra parametern logprobs till modellen.

response = client.complete(
    messages=[
        SystemMessage(content="You are a helpful assistant."),
        UserMessage(content="How many languages are in the world?"),
    ],
    model_extras={
        "logprobs": True
    }
)

Innan du skickar extra parametrar till Azure AI-modellinferens-API:et kontrollerar du att din modell stöder dessa extra parametrar. När begäran görs till den underliggande modellen skickas rubriken extra-parameters till modellen med värdet pass-through. Det här värdet anger att slutpunkten ska skicka de extra parametrarna till modellen. Användning av extra parametrar med modellen garanterar inte att modellen faktiskt kan hantera dem. Läs modellens dokumentation för att förstå vilka extra parametrar som stöds.

Använda verktyg

Vissa modeller stöder användning av verktyg, vilket kan vara en extraordinär resurs när du behöver avlasta specifika uppgifter från språkmodellen och i stället förlitar dig på ett mer deterministiskt system eller till och med en annan språkmodell. Med AZURE AI Model Inference API kan du definiera verktyg på följande sätt.

I följande kodexempel skapas en verktygsdefinition som kan titta från flyginformation från två olika städer.

from azure.ai.inference.models import FunctionDefinition, ChatCompletionsFunctionToolDefinition

flight_info = ChatCompletionsFunctionToolDefinition(
    function=FunctionDefinition(
        name="get_flight_info",
        description="Returns information about the next flight between two cities. This includes the name of the airline, flight number and the date and time of the next flight",
        parameters={
            "type": "object",
            "properties": {
                "origin_city": {
                    "type": "string",
                    "description": "The name of the city where the flight originates",
                },
                "destination_city": {
                    "type": "string",
                    "description": "The flight destination city",
                },
            },
            "required": ["origin_city", "destination_city"],
        },
    )
)

tools = [flight_info]

I det här exemplet är funktionens utdata att det inte finns några tillgängliga flyg för den valda rutten, men användaren bör överväga att ta ett tåg.

def get_flight_info(loc_origin: str, loc_destination: str):
    return { 
        "info": f"There are no flights available from {loc_origin} to {loc_destination}. You should take a train, specially if it helps to reduce CO2 emissions."
    }

Kommentar

Cohere-modeller kräver att ett verktygs svar är ett giltigt JSON-innehåll formaterat som en sträng. När du skapar meddelanden av typen Verktyg kontrollerar du att svaret är en giltig JSON-sträng.

Uppmana modellen att boka flyg med hjälp av den här funktionen:

messages = [
    SystemMessage(
        content="You are a helpful assistant that help users to find information about traveling, how to get"
                " to places and the different transportations options. You care about the environment and you"
                " always have that in mind when answering inqueries.",
    ),
    UserMessage(
        content="When is the next flight from Miami to Seattle?",
    ),
]

response = client.complete(
    messages=messages, tools=tools, tool_choice="auto"
)

Du kan kontrollera svaret för att ta reda på om ett verktyg behöver anropas. Kontrollera avslutsorsaken för att avgöra om verktyget ska anropas. Kom ihåg att flera verktygstyper kan anges. Det här exemplet visar ett verktyg av typen function.

response_message = response.choices[0].message
tool_calls = response_message.tool_calls

print("Finish reason:", response.choices[0].finish_reason)
print("Tool call:", tool_calls)

Om du vill fortsätta lägger du till det här meddelandet i chatthistoriken:

messages.append(
    response_message
)

Nu är det dags att anropa rätt funktion för att hantera verktygsanropet. Följande kodfragment itererar över alla verktygsanrop som anges i svaret och anropar motsvarande funktion med lämpliga parametrar. Svaret läggs också till i chatthistoriken.

import json
from azure.ai.inference.models import ToolMessage

for tool_call in tool_calls:

    # Get the tool details:

    function_name = tool_call.function.name
    function_args = json.loads(tool_call.function.arguments.replace("\'", "\""))
    tool_call_id = tool_call.id

    print(f"Calling function `{function_name}` with arguments {function_args}")

    # Call the function defined above using `locals()`, which returns the list of all functions 
    # available in the scope as a dictionary. Notice that this is just done as a simple way to get
    # the function callable from its string name. Then we can call it with the corresponding
    # arguments.

    callable_func = locals()[function_name]
    function_response = callable_func(**function_args)

    print("->", function_response)

    # Once we have a response from the function and its arguments, we can append a new message to the chat 
    # history. Notice how we are telling to the model that this chat message came from a tool:

    messages.append(
        ToolMessage(
            tool_call_id=tool_call_id,
            content=json.dumps(function_response)
        )
    )

Visa svaret från modellen:

response = client.complete(
    messages=messages,
    tools=tools,
)

Tillämpa innehållssäkerhet

Azure AI-modellinferens-API:et stöder Azure AI-innehållssäkerhet. När du använder distributioner med Azure AI-innehållssäkerhet aktiverad passerar indata och utdata genom en uppsättning klassificeringsmodeller som syftar till att identifiera och förhindra utdata från skadligt innehåll. Systemet för innehållsfiltrering identifierar och vidtar åtgärder för specifika kategorier av potentiellt skadligt innehåll i både inkommande prompter och slutföranden av utdata.

I följande exempel visas hur du hanterar händelser när modellen identifierar skadligt innehåll i indataprompten och innehållssäkerhet är aktiverat.

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

try:
    response = client.complete(
        messages=[
            SystemMessage(content="You are an AI assistant that helps people find information."),
            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

Dricks

Mer information om hur du kan konfigurera och kontrollera säkerhetsinställningar för Azure AI-innehåll finns i säkerhetsdokumentationen för Azure AI-innehåll.

Använda chattavslutningar med bilder

Vissa modeller kan resonera mellan text och bilder och generera textavslut baserat på båda typerna av indata. I det här avsnittet utforskar du funktionerna i Vissa modeller för vision på ett chattsätt:

Viktigt!

Vissa modeller stöder bara en bild för varje tur i chattkonversationen och endast den sista bilden behålls i kontext. Om du lägger till flera bilder resulterar det i ett fel.

Om du vill se den här funktionen laddar du ned en bild och kodar informationen som base64 sträng. Resulterande data bör finnas i en data-URL:

from urllib.request import urlopen, Request
import base64

image_url = "https://news.microsoft.com/source/wp-content/uploads/2024/04/The-Phi-3-small-language-models-with-big-potential-1-1900x1069.jpg"
image_format = "jpeg"

request = Request(image_url, headers={"User-Agent": "Mozilla/5.0"})
image_data = base64.b64encode(urlopen(request).read()).decode("utf-8")
data_url = f"data:image/{image_format};base64,{image_data}"

Visualisera bilden:

import requests
import IPython.display as Disp

Disp.Image(requests.get(image_url).content)

Ett diagram som visar de relativa funktionerna mellan stora språkmodeller och små språkmodeller.

Skapa nu en begäran om att slutföra chatten med avbildningen:

from azure.ai.inference.models import TextContentItem, ImageContentItem, ImageUrl
response = client.complete(
    messages=[
        SystemMessage("You are a helpful assistant that can generate responses based on images."),
        UserMessage(content=[
            TextContentItem(text="Which conclusion can be extracted from the following chart?"),
            ImageContentItem(image=ImageUrl(url=data_url))
        ]),
    ],
    temperature=0,
    top_p=1,
    max_tokens=2048,
)

Svaret är följande, där du kan se modellens användningsstatistik:

print(f"{response.choices[0].message.role}:\n\t{response.choices[0].message.content}\n")
print("Model:", response.model)
print("Usage:")
print("\tPrompt tokens:", response.usage.prompt_tokens)
print("\tCompletion tokens:", response.usage.completion_tokens)
print("\tTotal tokens:", response.usage.total_tokens)
ASSISTANT: The chart illustrates that larger models tend to perform better in quality, as indicated by their size in billions of parameters. However, there are exceptions to this trend, such as Phi-3-medium and Phi-3-small, which outperform smaller models in quality. This suggests that while larger models generally have an advantage, there might be other factors at play that influence a model's performance.
Model: mistral-large-2407
Usage: 
  Prompt tokens: 2380
  Completion tokens: 126
  Total tokens: 2506

Viktigt!

Objekt markerade (förhandsversion) i den här artikeln är för närvarande i offentlig förhandsversion. Den här förhandsversionen tillhandahålls utan ett serviceavtal och vi rekommenderar det inte för produktionsarbetsbelastningar. Vissa funktioner kanske inte stöds eller kan vara begränsade. Mer information finns i Kompletterande villkor för användning av Microsoft Azure-förhandsversioner.

Den här artikeln beskriver hur du använder API:et för chattslutsättningar med modeller som distribuerats till Azure AI-modellinferens i Azure AI-tjänster.

Förutsättningar

Om du vill använda modeller för chattkomplettering i ditt program behöver du:

  • En modelldistribution för chattavslut. Om du inte har någon läser du Lägg till och konfigurera modeller i Azure AI-tjänster för att lägga till en modell för chattavslut i resursen.

  • Installera Azure Inference-biblioteket för JavaScript med följande kommando:

    npm install @azure-rest/ai-inference
    

    Dricks

    Läs mer om Azure AI-slutsatsdragningspaketet och referensen.

Använda chattens slutföranden

Skapa först klienten för att använda modellen. I följande kod används en slutpunkts-URL och nyckel som lagras i miljövariabler.

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

Om du har konfigurerat resursen till med Stöd för Microsoft Entra-ID kan du använda följande kodfragment för att skapa en klient.

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

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

Skapa en begäran om att chatten ska slutföras

I följande exempel visas hur du kan skapa en grundläggande begäran om att slutföra chatten till modellen.

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

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

Kommentar

Vissa modeller stöder inte systemmeddelanden (role="system"). När du använder AZURE AI-modellinferens-API:et översätts systemmeddelanden till användarmeddelanden, vilket är den närmaste tillgängliga funktionen. Den här översättningen erbjuds för enkelhetens skull, men det är viktigt att du kontrollerar att modellen följer anvisningarna i systemmeddelandet med rätt konfidensnivå.

Svaret är följande, där du kan se modellens användningsstatistik:

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: 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: mistral-large-2407
Usage: 
  Prompt tokens: 19
  Total tokens: 91
  Completion tokens: 72

usage Granska avsnittet i svaret för att se antalet token som används för prompten, det totala antalet token som genererats och antalet token som används för slutförandet.

Strömma innehåll

Som standard returnerar API:et för slutförande hela det genererade innehållet i ett enda svar. Om du genererar långa slutföranden kan det ta många sekunder att vänta på svaret.

Du kan strömma innehållet för att hämta det när det genereras. Med strömmande innehåll kan du börja bearbeta slutförandet när innehållet blir tillgängligt. Det här läget returnerar ett objekt som strömmar tillbaka svaret som databaserade serverutskickade händelser. Extrahera segment från deltafältet i stället för meddelandefältet.

Om du vill strömma slutföranden använder .asNodeStream() du när du anropar modellen.

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

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

Du kan visualisera hur strömning genererar innehåll:

var stream = response.body;
if (!stream) {
    stream.destroy();
    throw new Error(`Failed to get chat completions with status: ${response.status}`);
}

if (response.status !== "200") {
    throw new Error(`Failed to get chat completions: ${response.body.error}`);
}

var sses = createSseStream(stream);

for await (const event of sses) {
    if (event.data === "[DONE]") {
        return;
    }
    for (const choice of (JSON.parse(event.data)).choices) {
        console.log(choice.delta?.content ?? "");
    }
}

Utforska fler parametrar som stöds av slutsatsdragningsklienten

Utforska andra parametrar som du kan ange i slutsatsdragningsklienten. En fullständig lista över alla parametrar som stöds och deras motsvarande dokumentation finns i API-referensen för Azure AI-modellinferens.

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

var response = await client.path("/chat/completions").post({
    body: {
        messages: messages,
        presence_penalty: "0.1",
        frequency_penalty: "0.8",
        max_tokens: 2048,
        stop: ["<|endoftext|>"],
        temperature: 0,
        top_p: 1,
        response_format: { type: "text" },
    }
});

Vissa modeller stöder inte JSON-utdataformatering. Du kan alltid uppmana modellen att generera JSON-utdata. Sådana utdata är dock inte garanterade att vara giltiga JSON.

Om du vill skicka en parameter som inte finns med i listan över parametrar som stöds kan du skicka den till den underliggande modellen med hjälp av extra parametrar. Se Skicka extra parametrar till modellen.

Skapa JSON-utdata

Vissa modeller kan skapa JSON-utdata. Ange response_format till json_object för att aktivera JSON-läge och garantera att meddelandet som modellen genererar är giltigt JSON. Du måste också instruera modellen att skapa JSON själv via ett system- eller användarmeddelande. Dessutom kan meddelandeinnehållet vara delvis avskuret om finish_reason="length", vilket indikerar att genereringen överskred max_tokens eller att konversationen överskred den maximala kontextlängden.

var messages = [
    { role: "system", content: "You are a helpful assistant that always generate responses in JSON format, using."
        + " the following format: { \"answer\": \"response\" }." },
    { role: "user", content: "How many languages are in the world?" },
];

var response = await client.path("/chat/completions").post({
    body: {
        messages: messages,
        response_format: { type: "json_object" }
    }
});

Skicka extra parametrar till modellen

Med AZURE AI Model Inference API kan du skicka extra parametrar till modellen. Följande kodexempel visar hur du skickar den extra parametern logprobs till modellen.

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

var response = await client.path("/chat/completions").post({
    headers: {
        "extra-params": "pass-through"
    },
    body: {
        messages: messages,
        logprobs: true
    }
});

Innan du skickar extra parametrar till Azure AI-modellinferens-API:et kontrollerar du att din modell stöder dessa extra parametrar. När begäran görs till den underliggande modellen skickas rubriken extra-parameters till modellen med värdet pass-through. Det här värdet anger att slutpunkten ska skicka de extra parametrarna till modellen. Användning av extra parametrar med modellen garanterar inte att modellen faktiskt kan hantera dem. Läs modellens dokumentation för att förstå vilka extra parametrar som stöds.

Använda verktyg

Vissa modeller stöder användning av verktyg, vilket kan vara en extraordinär resurs när du behöver avlasta specifika uppgifter från språkmodellen och i stället förlitar dig på ett mer deterministiskt system eller till och med en annan språkmodell. Med AZURE AI Model Inference API kan du definiera verktyg på följande sätt.

I följande kodexempel skapas en verktygsdefinition som kan titta från flyginformation från två olika städer.

const flight_info = {
    name: "get_flight_info",
    description: "Returns information about the next flight between two cities. This includes the name of the airline, flight number and the date and time of the next flight",
    parameters: {
        type: "object",
        properties: {
            origin_city: {
                type: "string",
                description: "The name of the city where the flight originates",
            },
            destination_city: {
                type: "string",
                description: "The flight destination city",
            },
        },
        required: ["origin_city", "destination_city"],
    },
}

const tools = [
    {
        type: "function",
        function: flight_info,
    },
];

I det här exemplet är funktionens utdata att det inte finns några tillgängliga flyg för den valda rutten, men användaren bör överväga att ta ett tåg.

function get_flight_info(loc_origin, loc_destination) {
    return {
        info: "There are no flights available from " + loc_origin + " to " + loc_destination + ". You should take a train, specially if it helps to reduce CO2 emissions."
    }
}

Kommentar

Cohere-modeller kräver att ett verktygs svar är ett giltigt JSON-innehåll formaterat som en sträng. När du skapar meddelanden av typen Verktyg kontrollerar du att svaret är en giltig JSON-sträng.

Uppmana modellen att boka flyg med hjälp av den här funktionen:

var result = await client.path("/chat/completions").post({
    body: {
        messages: messages,
        tools: tools,
        tool_choice: "auto"
    }
});

Du kan kontrollera svaret för att ta reda på om ett verktyg behöver anropas. Kontrollera avslutsorsaken för att avgöra om verktyget ska anropas. Kom ihåg att flera verktygstyper kan anges. Det här exemplet visar ett verktyg av typen function.

const response_message = response.body.choices[0].message;
const tool_calls = response_message.tool_calls;

console.log("Finish reason: " + response.body.choices[0].finish_reason);
console.log("Tool call: " + tool_calls);

Om du vill fortsätta lägger du till det här meddelandet i chatthistoriken:

messages.push(response_message);

Nu är det dags att anropa rätt funktion för att hantera verktygsanropet. Följande kodfragment itererar över alla verktygsanrop som anges i svaret och anropar motsvarande funktion med lämpliga parametrar. Svaret läggs också till i chatthistoriken.

function applyToolCall({ function: call, id }) {
    // Get the tool details:
    const tool_params = JSON.parse(call.arguments);
    console.log("Calling function " + call.name + " with arguments " + tool_params);

    // Call the function defined above using `window`, which returns the list of all functions 
    // available in the scope as a dictionary. Notice that this is just done as a simple way to get
    // the function callable from its string name. Then we can call it with the corresponding
    // arguments.
    const function_response = tool_params.map(window[call.name]);
    console.log("-> " + function_response);

    return function_response
}

for (const tool_call of tool_calls) {
    var tool_response = tool_call.apply(applyToolCall);

    messages.push(
        {
            role: "tool",
            tool_call_id: tool_call.id,
            content: tool_response
        }
    );
}

Visa svaret från modellen:

var result = await client.path("/chat/completions").post({
    body: {
        messages: messages,
        tools: tools,
    }
});

Tillämpa innehållssäkerhet

Azure AI-modellinferens-API:et stöder Azure AI-innehållssäkerhet. När du använder distributioner med Azure AI-innehållssäkerhet aktiverad passerar indata och utdata genom en uppsättning klassificeringsmodeller som syftar till att identifiera och förhindra utdata från skadligt innehåll. Systemet för innehållsfiltrering identifierar och vidtar åtgärder för specifika kategorier av potentiellt skadligt innehåll i både inkommande prompter och slutföranden av utdata.

I följande exempel visas hur du hanterar händelser när modellen identifierar skadligt innehåll i indataprompten och innehållssäkerhet är aktiverat.

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

Dricks

Mer information om hur du kan konfigurera och kontrollera säkerhetsinställningar för Azure AI-innehåll finns i säkerhetsdokumentationen för Azure AI-innehåll.

Använda chattavslutningar med bilder

Vissa modeller kan resonera mellan text och bilder och generera textavslut baserat på båda typerna av indata. I det här avsnittet utforskar du funktionerna i Vissa modeller för vision på ett chattsätt:

Viktigt!

Vissa modeller stöder bara en bild för varje tur i chattkonversationen och endast den sista bilden behålls i kontext. Om du lägger till flera bilder resulterar det i ett fel.

Om du vill se den här funktionen laddar du ned en bild och kodar informationen som base64 sträng. Resulterande data bör finnas i en data-URL:

const image_url = "https://news.microsoft.com/source/wp-content/uploads/2024/04/The-Phi-3-small-language-models-with-big-potential-1-1900x1069.jpg";
const image_format = "jpeg";

const response = await fetch(image_url, { headers: { "User-Agent": "Mozilla/5.0" } });
const image_data = await response.arrayBuffer();
const image_data_base64 = Buffer.from(image_data).toString("base64");
const data_url = `data:image/${image_format};base64,${image_data_base64}`;

Visualisera bilden:

const img = document.createElement("img");
img.src = data_url;
document.body.appendChild(img);

Ett diagram som visar de relativa funktionerna mellan stora språkmodeller och små språkmodeller.

Skapa nu en begäran om att slutföra chatten med avbildningen:

var messages = [
    { role: "system", content: "You are a helpful assistant that can generate responses based on images." },
    { role: "user", content: 
        [
            { type: "text", text: "Which conclusion can be extracted from the following chart?" },
            { type: "image_url", image:
                {
                    url: data_url
                }
            } 
        ] 
    }
];

var response = await client.path("/chat/completions").post({
    body: {
        messages: messages,
        temperature: 0,
        top_p: 1,
        max_tokens: 2048,
    }
});

Svaret är följande, där du kan se modellens användningsstatistik:

console.log(response.body.choices[0].message.role + ": " + 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("\tCompletion tokens:", response.body.usage.completion_tokens);
console.log("\tTotal tokens:", response.body.usage.total_tokens);
ASSISTANT: The chart illustrates that larger models tend to perform better in quality, as indicated by their size in billions of parameters. However, there are exceptions to this trend, such as Phi-3-medium and Phi-3-small, which outperform smaller models in quality. This suggests that while larger models generally have an advantage, there might be other factors at play that influence a model's performance.
Model: mistral-large-2407
Usage: 
  Prompt tokens: 2380
  Completion tokens: 126
  Total tokens: 2506

Viktigt!

Objekt markerade (förhandsversion) i den här artikeln är för närvarande i offentlig förhandsversion. Den här förhandsversionen tillhandahålls utan ett serviceavtal och vi rekommenderar det inte för produktionsarbetsbelastningar. Vissa funktioner kanske inte stöds eller kan vara begränsade. Mer information finns i Kompletterande villkor för användning av Microsoft Azure-förhandsversioner.

Den här artikeln beskriver hur du använder API:et för chattslutsättningar med modeller som distribuerats till Azure AI-modellinferens i Azure AI-tjänster.

Förutsättningar

Om du vill använda modeller för chattkomplettering i ditt program behöver du:

  • En modelldistribution för chattavslut. Om du inte har någon läser du Lägg till och konfigurera modeller i Azure AI-tjänster för att lägga till en modell för chattavslut i resursen.

  • Lägg till Azure AI-slutsatsdragningspaketet i projektet:

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-ai-inference</artifactId>
        <version>1.0.0-beta.1</version>
    </dependency>
    

    Dricks

    Läs mer om Azure AI-slutsatsdragningspaketet och referensen.

  • Om du använder Entra-ID behöver du också följande paket:

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity</artifactId>
        <version>1.13.3</version>
    </dependency>
    
  • Importera följande namnområde:

    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;
    

Använda chattens slutföranden

Skapa först klienten för att använda modellen. I följande kod används en slutpunkts-URL och nyckel som lagras i miljövariabler.

Om du har konfigurerat resursen till med Stöd för Microsoft Entra-ID kan du använda följande kodfragment för att skapa en klient.

Skapa en begäran om att chatten ska slutföras

I följande exempel visas hur du kan skapa en grundläggande begäran om att slutföra chatten till modellen.

Kommentar

Vissa modeller stöder inte systemmeddelanden (role="system"). När du använder AZURE AI-modellinferens-API:et översätts systemmeddelanden till användarmeddelanden, vilket är den närmaste tillgängliga funktionen. Den här översättningen erbjuds för enkelhetens skull, men det är viktigt att du kontrollerar att modellen följer anvisningarna i systemmeddelandet med rätt konfidensnivå.

Svaret är följande, där du kan se modellens användningsstatistik:

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: mistral-large-2407
Usage: 
  Prompt tokens: 19
  Total tokens: 91
  Completion tokens: 72

usage Granska avsnittet i svaret för att se antalet token som används för prompten, det totala antalet token som genererats och antalet token som används för slutförandet.

Strömma innehåll

Som standard returnerar API:et för slutförande hela det genererade innehållet i ett enda svar. Om du genererar långa slutföranden kan det ta många sekunder att vänta på svaret.

Du kan strömma innehållet för att hämta det när det genereras. Med strömmande innehåll kan du börja bearbeta slutförandet när innehållet blir tillgängligt. Det här läget returnerar ett objekt som strömmar tillbaka svaret som databaserade serverutskickade händelser. Extrahera segment från deltafältet i stället för meddelandefältet.

Du kan visualisera hur strömning genererar innehåll:

Utforska fler parametrar som stöds av slutsatsdragningsklienten

Utforska andra parametrar som du kan ange i slutsatsdragningsklienten. En fullständig lista över alla parametrar som stöds och deras motsvarande dokumentation finns i API-referensen för Azure AI-modellinferens. Vissa modeller stöder inte JSON-utdataformatering. Du kan alltid uppmana modellen att generera JSON-utdata. Sådana utdata är dock inte garanterade att vara giltiga JSON.

Om du vill skicka en parameter som inte finns med i listan över parametrar som stöds kan du skicka den till den underliggande modellen med hjälp av extra parametrar. Se Skicka extra parametrar till modellen.

Skapa JSON-utdata

Vissa modeller kan skapa JSON-utdata. Ange response_format till json_object för att aktivera JSON-läge och garantera att meddelandet som modellen genererar är giltigt JSON. Du måste också instruera modellen att skapa JSON själv via ett system- eller användarmeddelande. Dessutom kan meddelandeinnehållet vara delvis avskuret om finish_reason="length", vilket indikerar att genereringen överskred max_tokens eller att konversationen överskred den maximala kontextlängden.

Skicka extra parametrar till modellen

Med AZURE AI Model Inference API kan du skicka extra parametrar till modellen. Följande kodexempel visar hur du skickar den extra parametern logprobs till modellen.

Innan du skickar extra parametrar till Azure AI-modellinferens-API:et kontrollerar du att din modell stöder dessa extra parametrar. När begäran görs till den underliggande modellen skickas rubriken extra-parameters till modellen med värdet pass-through. Det här värdet anger att slutpunkten ska skicka de extra parametrarna till modellen. Användning av extra parametrar med modellen garanterar inte att modellen faktiskt kan hantera dem. Läs modellens dokumentation för att förstå vilka extra parametrar som stöds.

Använda verktyg

Vissa modeller stöder användning av verktyg, vilket kan vara en extraordinär resurs när du behöver avlasta specifika uppgifter från språkmodellen och i stället förlitar dig på ett mer deterministiskt system eller till och med en annan språkmodell. Med AZURE AI Model Inference API kan du definiera verktyg på följande sätt.

I följande kodexempel skapas en verktygsdefinition som kan titta från flyginformation från två olika städer.

I det här exemplet är funktionens utdata att det inte finns några tillgängliga flyg för den valda rutten, men användaren bör överväga att ta ett tåg.

Kommentar

Cohere-modeller kräver att ett verktygs svar är ett giltigt JSON-innehåll formaterat som en sträng. När du skapar meddelanden av typen Verktyg kontrollerar du att svaret är en giltig JSON-sträng.

Uppmana modellen att boka flyg med hjälp av den här funktionen:

Du kan kontrollera svaret för att ta reda på om ett verktyg behöver anropas. Kontrollera avslutsorsaken för att avgöra om verktyget ska anropas. Kom ihåg att flera verktygstyper kan anges. Det här exemplet visar ett verktyg av typen function.

Om du vill fortsätta lägger du till det här meddelandet i chatthistoriken:

Nu är det dags att anropa rätt funktion för att hantera verktygsanropet. Följande kodfragment itererar över alla verktygsanrop som anges i svaret och anropar motsvarande funktion med lämpliga parametrar. Svaret läggs också till i chatthistoriken.

Visa svaret från modellen:

Tillämpa innehållssäkerhet

Azure AI-modellinferens-API:et stöder Azure AI-innehållssäkerhet. När du använder distributioner med Azure AI-innehållssäkerhet aktiverad passerar indata och utdata genom en uppsättning klassificeringsmodeller som syftar till att identifiera och förhindra utdata från skadligt innehåll. Systemet för innehållsfiltrering identifierar och vidtar åtgärder för specifika kategorier av potentiellt skadligt innehåll i både inkommande prompter och slutföranden av utdata.

I följande exempel visas hur du hanterar händelser när modellen identifierar skadligt innehåll i indataprompten och innehållssäkerhet är aktiverat.

Dricks

Mer information om hur du kan konfigurera och kontrollera säkerhetsinställningar för Azure AI-innehåll finns i säkerhetsdokumentationen för Azure AI-innehåll.

Använda chattavslutningar med bilder

Vissa modeller kan resonera mellan text och bilder och generera textavslut baserat på båda typerna av indata. I det här avsnittet utforskar du funktionerna i Vissa modeller för vision på ett chattsätt:

Viktigt!

Vissa modeller stöder bara en bild för varje tur i chattkonversationen och endast den sista bilden behålls i kontext. Om du lägger till flera bilder resulterar det i ett fel.

Om du vill se den här funktionen laddar du ned en bild och kodar informationen som base64 sträng. Resulterande data bör finnas i en data-URL:

Visualisera bilden:

Ett diagram som visar de relativa funktionerna mellan stora språkmodeller och små språkmodeller.

Skapa nu en begäran om att slutföra chatten med avbildningen:

Svaret är följande, där du kan se modellens användningsstatistik:

ASSISTANT: The chart illustrates that larger models tend to perform better in quality, as indicated by their size in billions of parameters. However, there are exceptions to this trend, such as Phi-3-medium and Phi-3-small, which outperform smaller models in quality. This suggests that while larger models generally have an advantage, there might be other factors at play that influence a model's performance.
Model: mistral-large-2407
Usage: 
  Prompt tokens: 2380
  Completion tokens: 126
  Total tokens: 2506

Viktigt!

Objekt markerade (förhandsversion) i den här artikeln är för närvarande i offentlig förhandsversion. Den här förhandsversionen tillhandahålls utan ett serviceavtal och vi rekommenderar det inte för produktionsarbetsbelastningar. Vissa funktioner kanske inte stöds eller kan vara begränsade. Mer information finns i Kompletterande villkor för användning av Microsoft Azure-förhandsversioner.

Den här artikeln beskriver hur du använder API:et för chattslutsättningar med modeller som distribuerats till Azure AI-modellinferens i Azure AI-tjänster.

Förutsättningar

Om du vill använda modeller för chattkomplettering i ditt program behöver du:

  • En modelldistribution för chattavslut. Om du inte har någon läser du Lägg till och konfigurera modeller i Azure AI-tjänster för att lägga till en modell för chattavslut i resursen.

  • Installera Azure AI-slutsatsdragningspaketet med följande kommando:

    dotnet add package Azure.AI.Inference --prerelease
    

    Dricks

    Läs mer om Azure AI-slutsatsdragningspaketet och referensen.

  • Om du använder Entra-ID behöver du också följande paket:

    dotnet add package Azure.Identity
    

Använda chattens slutföranden

Skapa först klienten för att använda modellen. I följande kod används en slutpunkts-URL och nyckel som lagras i miljövariabler.

ChatCompletionsClient client = new ChatCompletionsClient(
    new Uri(Environment.GetEnvironmentVariable("AZURE_INFERENCE_ENDPOINT")),
    new AzureKeyCredential(Environment.GetEnvironmentVariable("AZURE_INFERENCE_CREDENTIAL")),
    "mistral-large-2407"
);

Om du har konfigurerat resursen till med Stöd för Microsoft Entra-ID kan du använda följande kodfragment för att skapa en klient.

client = new ChatCompletionsClient(
    new Uri(Environment.GetEnvironmentVariable("AZURE_INFERENCE_ENDPOINT")),
    new DefaultAzureCredential(includeInteractiveCredentials: true),
    "mistral-large-2407"
);

Skapa en begäran om att chatten ska slutföras

I följande exempel visas hur du kan skapa en grundläggande begäran om att slutföra chatten till modellen.

ChatCompletionsOptions requestOptions = new ChatCompletionsOptions()
{
    Messages = {
        new ChatRequestSystemMessage("You are a helpful assistant."),
        new ChatRequestUserMessage("How many languages are in the world?")
    },
};

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

Kommentar

Vissa modeller stöder inte systemmeddelanden (role="system"). När du använder AZURE AI-modellinferens-API:et översätts systemmeddelanden till användarmeddelanden, vilket är den närmaste tillgängliga funktionen. Den här översättningen erbjuds för enkelhetens skull, men det är viktigt att du kontrollerar att modellen följer anvisningarna i systemmeddelandet med rätt konfidensnivå.

Svaret är följande, där du kan se modellens användningsstatistik:

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: 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: mistral-large-2407
Usage: 
  Prompt tokens: 19
  Total tokens: 91
  Completion tokens: 72

usage Granska avsnittet i svaret för att se antalet token som används för prompten, det totala antalet token som genererats och antalet token som används för slutförandet.

Strömma innehåll

Som standard returnerar API:et för slutförande hela det genererade innehållet i ett enda svar. Om du genererar långa slutföranden kan det ta många sekunder att vänta på svaret.

Du kan strömma innehållet för att hämta det när det genereras. Med strömmande innehåll kan du börja bearbeta slutförandet när innehållet blir tillgängligt. Det här läget returnerar ett objekt som strömmar tillbaka svaret som databaserade serverutskickade händelser. Extrahera segment från deltafältet i stället för meddelandefältet.

Om du vill strömma slutföranden använder CompleteStreamingAsync du metoden när du anropar modellen. Observera att i det här exemplet omsluts anropet i en asynkron metod.

static async Task StreamMessageAsync(ChatCompletionsClient client)
{
    ChatCompletionsOptions requestOptions = new ChatCompletionsOptions()
    {
        Messages = {
            new ChatRequestSystemMessage("You are a helpful assistant."),
            new ChatRequestUserMessage("How many languages are in the world? Write an essay about it.")
        },
        MaxTokens=4096
    };

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

    await PrintStream(streamResponse);
}

Om du vill visualisera utdata definierar du en asynkron metod för att skriva ut strömmen i konsolen.

static async Task PrintStream(StreamingResponse<StreamingChatCompletionsUpdate> response)
{
    await foreach (StreamingChatCompletionsUpdate chatUpdate in response)
    {
        if (chatUpdate.Role.HasValue)
        {
            Console.Write($"{chatUpdate.Role.Value.ToString().ToUpperInvariant()}: ");
        }
        if (!string.IsNullOrEmpty(chatUpdate.ContentUpdate))
        {
            Console.Write(chatUpdate.ContentUpdate);
        }
    }
}

Du kan visualisera hur strömning genererar innehåll:

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

Utforska fler parametrar som stöds av slutsatsdragningsklienten

Utforska andra parametrar som du kan ange i slutsatsdragningsklienten. En fullständig lista över alla parametrar som stöds och deras motsvarande dokumentation finns i API-referensen för Azure AI-modellinferens.

requestOptions = new ChatCompletionsOptions()
{
    Messages = {
        new ChatRequestSystemMessage("You are a helpful assistant."),
        new ChatRequestUserMessage("How many languages are in the world?")
    },
    PresencePenalty = 0.1f,
    FrequencyPenalty = 0.8f,
    MaxTokens = 2048,
    StopSequences = { "<|endoftext|>" },
    Temperature = 0,
    NucleusSamplingFactor = 1,
    ResponseFormat = new ChatCompletionsResponseFormatText()
};

response = client.Complete(requestOptions);
Console.WriteLine($"Response: {response.Value.Content}");

Vissa modeller stöder inte JSON-utdataformatering. Du kan alltid uppmana modellen att generera JSON-utdata. Sådana utdata är dock inte garanterade att vara giltiga JSON.

Om du vill skicka en parameter som inte finns med i listan över parametrar som stöds kan du skicka den till den underliggande modellen med hjälp av extra parametrar. Se Skicka extra parametrar till modellen.

Skapa JSON-utdata

Vissa modeller kan skapa JSON-utdata. Ange response_format till json_object för att aktivera JSON-läge och garantera att meddelandet som modellen genererar är giltigt JSON. Du måste också instruera modellen att skapa JSON själv via ett system- eller användarmeddelande. Dessutom kan meddelandeinnehållet vara delvis avskuret om finish_reason="length", vilket indikerar att genereringen överskred max_tokens eller att konversationen överskred den maximala kontextlängden.

requestOptions = new ChatCompletionsOptions()
{
    Messages = {
        new ChatRequestSystemMessage(
            "You are a helpful assistant that always generate responses in JSON format, " +
            "using. the following format: { \"answer\": \"response\" }."
        ),
        new ChatRequestUserMessage(
            "How many languages are in the world?"
        )
    },
    ResponseFormat = new ChatCompletionsResponseFormatJSON()
};

response = client.Complete(requestOptions);
Console.WriteLine($"Response: {response.Value.Content}");

Skicka extra parametrar till modellen

Med AZURE AI Model Inference API kan du skicka extra parametrar till modellen. Följande kodexempel visar hur du skickar den extra parametern logprobs till modellen.

requestOptions = new ChatCompletionsOptions()
{
    Messages = {
        new ChatRequestSystemMessage("You are a helpful assistant."),
        new ChatRequestUserMessage("How many languages are in the world?")
    },
    AdditionalProperties = { { "logprobs", BinaryData.FromString("true") } },
};

response = client.Complete(requestOptions, extraParams: ExtraParameters.PassThrough);
Console.WriteLine($"Response: {response.Value.Content}");

Innan du skickar extra parametrar till Azure AI-modellinferens-API:et kontrollerar du att din modell stöder dessa extra parametrar. När begäran görs till den underliggande modellen skickas rubriken extra-parameters till modellen med värdet pass-through. Det här värdet anger att slutpunkten ska skicka de extra parametrarna till modellen. Användning av extra parametrar med modellen garanterar inte att modellen faktiskt kan hantera dem. Läs modellens dokumentation för att förstå vilka extra parametrar som stöds.

Använda verktyg

Vissa modeller stöder användning av verktyg, vilket kan vara en extraordinär resurs när du behöver avlasta specifika uppgifter från språkmodellen och i stället förlitar dig på ett mer deterministiskt system eller till och med en annan språkmodell. Med AZURE AI Model Inference API kan du definiera verktyg på följande sätt.

I följande kodexempel skapas en verktygsdefinition som kan titta från flyginformation från två olika städer.

FunctionDefinition flightInfoFunction = new FunctionDefinition("getFlightInfo")
{
    Description = "Returns information about the next flight between two cities. This includes the name of the airline, flight number and the date and time of the next flight",
    Parameters = BinaryData.FromObjectAsJson(new
    {
        Type = "object",
        Properties = new
        {
            origin_city = new
            {
                Type = "string",
                Description = "The name of the city where the flight originates"
            },
            destination_city = new
            {
                Type = "string",
                Description = "The flight destination city"
            }
        }
    },
        new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }
    )
};

ChatCompletionsFunctionToolDefinition getFlightTool = new ChatCompletionsFunctionToolDefinition(flightInfoFunction);

I det här exemplet är funktionens utdata att det inte finns några tillgängliga flyg för den valda rutten, men användaren bör överväga att ta ett tåg.

static string getFlightInfo(string loc_origin, string loc_destination)
{
    return JsonSerializer.Serialize(new
    {
        info = $"There are no flights available from {loc_origin} to {loc_destination}. You " +
        "should take a train, specially if it helps to reduce CO2 emissions."
    });
}

Kommentar

Cohere-modeller kräver att ett verktygs svar är ett giltigt JSON-innehåll formaterat som en sträng. När du skapar meddelanden av typen Verktyg kontrollerar du att svaret är en giltig JSON-sträng.

Uppmana modellen att boka flyg med hjälp av den här funktionen:

var chatHistory = new List<ChatRequestMessage>(){
        new ChatRequestSystemMessage(
            "You are a helpful assistant that help users to find information about traveling, " +
            "how to get to places and the different transportations options. You care about the" +
            "environment and you always have that in mind when answering inqueries."
        ),
        new ChatRequestUserMessage("When is the next flight from Miami to Seattle?")
    };

requestOptions = new ChatCompletionsOptions(chatHistory);
requestOptions.Tools.Add(getFlightTool);
requestOptions.ToolChoice = ChatCompletionsToolChoice.Auto;

response = client.Complete(requestOptions);

Du kan kontrollera svaret för att ta reda på om ett verktyg behöver anropas. Kontrollera avslutsorsaken för att avgöra om verktyget ska anropas. Kom ihåg att flera verktygstyper kan anges. Det här exemplet visar ett verktyg av typen function.

var responseMessage = response.Value;
var toolsCall = responseMessage.ToolCalls;

Console.WriteLine($"Finish reason: {response.Value.Choices[0].FinishReason}");
Console.WriteLine($"Tool call: {toolsCall[0].Id}");

Om du vill fortsätta lägger du till det här meddelandet i chatthistoriken:

requestOptions.Messages.Add(new ChatRequestAssistantMessage(response.Value));

Nu är det dags att anropa rätt funktion för att hantera verktygsanropet. Följande kodfragment itererar över alla verktygsanrop som anges i svaret och anropar motsvarande funktion med lämpliga parametrar. Svaret läggs också till i chatthistoriken.

foreach (ChatCompletionsToolCall tool in toolsCall)
{
    if (tool is ChatCompletionsFunctionToolCall functionTool)
    {
        // Get the tool details:
        string callId = functionTool.Id;
        string toolName = functionTool.Name;
        string toolArgumentsString = functionTool.Arguments;
        Dictionary<string, object> toolArguments = JsonSerializer.Deserialize<Dictionary<string, object>>(toolArgumentsString);

        // Here you have to call the function defined. In this particular example we use 
        // reflection to find the method we definied before in an static class called 
        // `ChatCompletionsExamples`. Using reflection allows us to call a function 
        // by string name. Notice that this is just done for demonstration purposes as a 
        // simple way to get the function callable from its string name. Then we can call 
        // it with the corresponding arguments.

        var flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static;
        string toolResponse = (string)typeof(ChatCompletionsExamples).GetMethod(toolName, flags).Invoke(null, toolArguments.Values.Cast<object>().ToArray());

        Console.WriteLine("->", toolResponse);
        requestOptions.Messages.Add(new ChatRequestToolMessage(toolResponse, callId));
    }
    else
        throw new Exception("Unsupported tool type");
}

Visa svaret från modellen:

response = client.Complete(requestOptions);

Tillämpa innehållssäkerhet

Azure AI-modellinferens-API:et stöder Azure AI-innehållssäkerhet. När du använder distributioner med Azure AI-innehållssäkerhet aktiverad passerar indata och utdata genom en uppsättning klassificeringsmodeller som syftar till att identifiera och förhindra utdata från skadligt innehåll. Systemet för innehållsfiltrering identifierar och vidtar åtgärder för specifika kategorier av potentiellt skadligt innehåll i både inkommande prompter och slutföranden av utdata.

I följande exempel visas hur du hanterar händelser när modellen identifierar skadligt innehåll i indataprompten och innehållssäkerhet är aktiverat.

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

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

Dricks

Mer information om hur du kan konfigurera och kontrollera säkerhetsinställningar för Azure AI-innehåll finns i säkerhetsdokumentationen för Azure AI-innehåll.

Använda chattavslutningar med bilder

Vissa modeller kan resonera mellan text och bilder och generera textavslut baserat på båda typerna av indata. I det här avsnittet utforskar du funktionerna i Vissa modeller för vision på ett chattsätt:

Viktigt!

Vissa modeller stöder bara en bild för varje tur i chattkonversationen och endast den sista bilden behålls i kontext. Om du lägger till flera bilder resulterar det i ett fel.

Om du vill se den här funktionen laddar du ned en bild och kodar informationen som base64 sträng. Resulterande data bör finnas i en data-URL:

string imageUrl = "https://news.microsoft.com/source/wp-content/uploads/2024/04/The-Phi-3-small-language-models-with-big-potential-1-1900x1069.jpg";
string imageFormat = "jpeg";
HttpClient httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0");
byte[] imageBytes = httpClient.GetByteArrayAsync(imageUrl).Result;
string imageBase64 = Convert.ToBase64String(imageBytes);
string dataUrl = $"data:image/{imageFormat};base64,{imageBase64}";

Visualisera bilden:

Ett diagram som visar de relativa funktionerna mellan stora språkmodeller och små språkmodeller.

Skapa nu en begäran om att slutföra chatten med avbildningen:

ChatCompletionsOptions requestOptions = new ChatCompletionsOptions()
{
    Messages = {
        new ChatRequestSystemMessage("You are an AI assistant that helps people find information."),
        new ChatRequestUserMessage([
            new ChatMessageTextContentItem("Which conclusion can be extracted from the following chart?"),
            new ChatMessageImageContentItem(new Uri(dataUrl))
        ]),
    },
    MaxTokens=2048,
};

var response = client.Complete(requestOptions);
Console.WriteLine(response.Value.Content);

Svaret är följande, där du kan se modellens användningsstatistik:

Console.WriteLine($"{response.Value.Role}: {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}");
ASSISTANT: The chart illustrates that larger models tend to perform better in quality, as indicated by their size in billions of parameters. However, there are exceptions to this trend, such as Phi-3-medium and Phi-3-small, which outperform smaller models in quality. This suggests that while larger models generally have an advantage, there might be other factors at play that influence a model's performance.
Model: mistral-large-2407
Usage: 
  Prompt tokens: 2380
  Completion tokens: 126
  Total tokens: 2506

Viktigt!

Objekt markerade (förhandsversion) i den här artikeln är för närvarande i offentlig förhandsversion. Den här förhandsversionen tillhandahålls utan ett serviceavtal och vi rekommenderar det inte för produktionsarbetsbelastningar. Vissa funktioner kanske inte stöds eller kan vara begränsade. Mer information finns i Kompletterande villkor för användning av Microsoft Azure-förhandsversioner.

Den här artikeln beskriver hur du använder API:et för chattslutsättningar med modeller som distribuerats till Azure AI-modellinferens i Azure AI-tjänster.

Förutsättningar

Om du vill använda modeller för chattkomplettering i ditt program behöver du:

Använda chattens slutföranden

Om du vill använda textbäddningarna använder du den väg /chat/completions som läggs till i bas-URL:en tillsammans med dina autentiseringsuppgifter som anges i api-key. Authorization -huvudet stöds också med formatet Bearer <key>.

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

Om du har konfigurerat resursen med Stöd för Microsoft Entra-ID skickar du token i Authorization rubriken:

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

Skapa en begäran om att chatten ska slutföras

I följande exempel visas hur du kan skapa en grundläggande begäran om att slutföra chatten till modellen.

{
    "model": "mistral-large-2407",
    "messages": [
        {
            "role": "system",
            "content": "You are a helpful assistant."
        },
        {
            "role": "user",
            "content": "How many languages are in the world?"
        }
    ]
}

Kommentar

Vissa modeller stöder inte systemmeddelanden (role="system"). När du använder AZURE AI-modellinferens-API:et översätts systemmeddelanden till användarmeddelanden, vilket är den närmaste tillgängliga funktionen. Den här översättningen erbjuds för enkelhetens skull, men det är viktigt att du kontrollerar att modellen följer anvisningarna i systemmeddelandet med rätt konfidensnivå.

Svaret är följande, där du kan se modellens användningsstatistik:

{
    "id": "0a1234b5de6789f01gh2i345j6789klm",
    "object": "chat.completion",
    "created": 1718726686,
    "model": "mistral-large-2407",
    "choices": [
        {
            "index": 0,
            "message": {
                "role": "assistant",
                "content": "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.",
                "tool_calls": null
            },
            "finish_reason": "stop",
            "logprobs": null
        }
    ],
    "usage": {
        "prompt_tokens": 19,
        "total_tokens": 91,
        "completion_tokens": 72
    }
}

usage Granska avsnittet i svaret för att se antalet token som används för prompten, det totala antalet token som genererats och antalet token som används för slutförandet.

Strömma innehåll

Som standard returnerar API:et för slutförande hela det genererade innehållet i ett enda svar. Om du genererar långa slutföranden kan det ta många sekunder att vänta på svaret.

Du kan strömma innehållet för att hämta det när det genereras. Med strömmande innehåll kan du börja bearbeta slutförandet när innehållet blir tillgängligt. Det här läget returnerar ett objekt som strömmar tillbaka svaret som databaserade serverutskickade händelser. Extrahera segment från deltafältet i stället för meddelandefältet.

{
    "model": "mistral-large-2407",
    "messages": [
        {
            "role": "system",
            "content": "You are a helpful assistant."
        },
        {
            "role": "user",
            "content": "How many languages are in the world?"
        }
    ],
    "stream": true,
    "temperature": 0,
    "top_p": 1,
    "max_tokens": 2048
}

Du kan visualisera hur strömning genererar innehåll:

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

Det sista meddelandet i strömmen har finish_reason angetts, vilket anger orsaken till att genereringsprocessen stoppas.

{
    "id": "23b54589eba14564ad8a2e6978775a39",
    "object": "chat.completion.chunk",
    "created": 1718726371,
    "model": "mistral-large-2407",
    "choices": [
        {
            "index": 0,
            "delta": {
                "content": ""
            },
            "finish_reason": "stop",
            "logprobs": null
        }
    ],
    "usage": {
        "prompt_tokens": 19,
        "total_tokens": 91,
        "completion_tokens": 72
    }
}

Utforska fler parametrar som stöds av slutsatsdragningsklienten

Utforska andra parametrar som du kan ange i slutsatsdragningsklienten. En fullständig lista över alla parametrar som stöds och deras motsvarande dokumentation finns i API-referensen för Azure AI-modellinferens.

{
    "model": "mistral-large-2407",
    "messages": [
        {
            "role": "system",
            "content": "You are a helpful assistant."
        },
        {
            "role": "user",
            "content": "How many languages are in the world?"
        }
    ],
    "presence_penalty": 0.1,
    "frequency_penalty": 0.8,
    "max_tokens": 2048,
    "stop": ["<|endoftext|>"],
    "temperature" :0,
    "top_p": 1,
    "response_format": { "type": "text" }
}
{
    "id": "0a1234b5de6789f01gh2i345j6789klm",
    "object": "chat.completion",
    "created": 1718726686,
    "model": "mistral-large-2407",
    "choices": [
        {
            "index": 0,
            "message": {
                "role": "assistant",
                "content": "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.",
                "tool_calls": null
            },
            "finish_reason": "stop",
            "logprobs": null
        }
    ],
    "usage": {
        "prompt_tokens": 19,
        "total_tokens": 91,
        "completion_tokens": 72
    }
}

Vissa modeller stöder inte JSON-utdataformatering. Du kan alltid uppmana modellen att generera JSON-utdata. Sådana utdata är dock inte garanterade att vara giltiga JSON.

Om du vill skicka en parameter som inte finns med i listan över parametrar som stöds kan du skicka den till den underliggande modellen med hjälp av extra parametrar. Se Skicka extra parametrar till modellen.

Skapa JSON-utdata

Vissa modeller kan skapa JSON-utdata. Ange response_format till json_object för att aktivera JSON-läge och garantera att meddelandet som modellen genererar är giltigt JSON. Du måste också instruera modellen att skapa JSON själv via ett system- eller användarmeddelande. Dessutom kan meddelandeinnehållet vara delvis avskuret om finish_reason="length", vilket indikerar att genereringen överskred max_tokens eller att konversationen överskred den maximala kontextlängden.

{
    "model": "mistral-large-2407",
    "messages": [
        {
            "role": "system",
            "content": "You are a helpful assistant that always generate responses in JSON format, using the following format: { \"answer\": \"response\" }"
        },
        {
            "role": "user",
            "content": "How many languages are in the world?"
        }
    ],
    "response_format": { "type": "json_object" }
}
{
    "id": "0a1234b5de6789f01gh2i345j6789klm",
    "object": "chat.completion",
    "created": 1718727522,
    "model": "mistral-large-2407",
    "choices": [
        {
            "index": 0,
            "message": {
                "role": "assistant",
                "content": "{\"answer\": \"There are approximately 7,117 living languages in the world today, according to the latest estimates. However, this number can vary as some languages become extinct and others are newly discovered or classified.\"}",
                "tool_calls": null
            },
            "finish_reason": "stop",
            "logprobs": null
        }
    ],
    "usage": {
        "prompt_tokens": 39,
        "total_tokens": 87,
        "completion_tokens": 48
    }
}

Skicka extra parametrar till modellen

Med AZURE AI Model Inference API kan du skicka extra parametrar till modellen. Följande kodexempel visar hur du skickar den extra parametern logprobs till modellen.

POST https://<resource>.services.ai.azure.com/models/chat/completions?api-version=2024-05-01-preview
Authorization: Bearer <TOKEN>
Content-Type: application/json
extra-parameters: pass-through
{
    "model": "mistral-large-2407",
    "messages": [
        {
            "role": "system",
            "content": "You are a helpful assistant."
        },
        {
            "role": "user",
            "content": "How many languages are in the world?"
        }
    ],
    "logprobs": true
}

Innan du skickar extra parametrar till Azure AI-modellinferens-API:et kontrollerar du att din modell stöder dessa extra parametrar. När begäran görs till den underliggande modellen skickas rubriken extra-parameters till modellen med värdet pass-through. Det här värdet anger att slutpunkten ska skicka de extra parametrarna till modellen. Användning av extra parametrar med modellen garanterar inte att modellen faktiskt kan hantera dem. Läs modellens dokumentation för att förstå vilka extra parametrar som stöds.

Använda verktyg

Vissa modeller stöder användning av verktyg, vilket kan vara en extraordinär resurs när du behöver avlasta specifika uppgifter från språkmodellen och i stället förlitar dig på ett mer deterministiskt system eller till och med en annan språkmodell. Med AZURE AI Model Inference API kan du definiera verktyg på följande sätt.

I följande kodexempel skapas en verktygsdefinition som kan titta från flyginformation från två olika städer.

{
    "type": "function",
    "function": {
        "name": "get_flight_info",
        "description": "Returns information about the next flight between two cities. This includes the name of the airline, flight number and the date and time of the next flight",
        "parameters": {
            "type": "object",
            "properties": {
                "origin_city": {
                    "type": "string",
                    "description": "The name of the city where the flight originates"
                },
                "destination_city": {
                    "type": "string",
                    "description": "The flight destination city"
                }
            },
            "required": [
                "origin_city",
                "destination_city"
            ]
        }
    }
}

I det här exemplet är funktionens utdata att det inte finns några tillgängliga flyg för den valda rutten, men användaren bör överväga att ta ett tåg.

Kommentar

Cohere-modeller kräver att ett verktygs svar är ett giltigt JSON-innehåll formaterat som en sträng. När du skapar meddelanden av typen Verktyg kontrollerar du att svaret är en giltig JSON-sträng.

Uppmana modellen att boka flyg med hjälp av den här funktionen:

{
    "model": "mistral-large-2407",
    "messages": [
        {
            "role": "system",
            "content": "You are a helpful assistant that help users to find information about traveling, how to get to places and the different transportations options. You care about the environment and you always have that in mind when answering inqueries"
        },
        {
            "role": "user",
            "content": "When is the next flight from Miami to Seattle?"
        }
    ],
    "tool_choice": "auto",
    "tools": [
        {
            "type": "function",
            "function": {
                "name": "get_flight_info",
                "description": "Returns information about the next flight between two cities. This includes the name of the airline, flight number and the date and time of the next flight",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "origin_city": {
                            "type": "string",
                            "description": "The name of the city where the flight originates"
                        },
                        "destination_city": {
                            "type": "string",
                            "description": "The flight destination city"
                        }
                    },
                    "required": [
                        "origin_city",
                        "destination_city"
                    ]
                }
            }
        }
    ]
}

Du kan kontrollera svaret för att ta reda på om ett verktyg behöver anropas. Kontrollera avslutsorsaken för att avgöra om verktyget ska anropas. Kom ihåg att flera verktygstyper kan anges. Det här exemplet visar ett verktyg av typen function.

{
    "id": "0a1234b5de6789f01gh2i345j6789klm",
    "object": "chat.completion",
    "created": 1718726007,
    "model": "mistral-large-2407",
    "choices": [
        {
            "index": 0,
            "message": {
                "role": "assistant",
                "content": "",
                "tool_calls": [
                    {
                        "id": "abc0dF1gh",
                        "type": "function",
                        "function": {
                            "name": "get_flight_info",
                            "arguments": "{\"origin_city\": \"Miami\", \"destination_city\": \"Seattle\"}",
                            "call_id": null
                        }
                    }
                ]
            },
            "finish_reason": "tool_calls",
            "logprobs": null
        }
    ],
    "usage": {
        "prompt_tokens": 190,
        "total_tokens": 226,
        "completion_tokens": 36
    }
}

Om du vill fortsätta lägger du till det här meddelandet i chatthistoriken:

Nu är det dags att anropa rätt funktion för att hantera verktygsanropet. Följande kodfragment itererar över alla verktygsanrop som anges i svaret och anropar motsvarande funktion med lämpliga parametrar. Svaret läggs också till i chatthistoriken.

Visa svaret från modellen:

{
    "model": "mistral-large-2407",
    "messages": [
        {
            "role": "system",
            "content": "You are a helpful assistant that help users to find information about traveling, how to get to places and the different transportations options. You care about the environment and you always have that in mind when answering inqueries"
        },
        {
            "role": "user",
            "content": "When is the next flight from Miami to Seattle?"
        },
        {
            "role": "assistant",
            "content": "",
            "tool_calls": [
                {
                    "id": "abc0DeFgH",
                    "type": "function",
                    "function": {
                        "name": "get_flight_info",
                        "arguments": "{\"origin_city\": \"Miami\", \"destination_city\": \"Seattle\"}",
                        "call_id": null
                    }
                }
            ]
        },
        {
            "role": "tool",
            "content": "{ \"info\": \"There are no flights available from Miami to Seattle. You should take a train, specially if it helps to reduce CO2 emissions.\" }",
            "tool_call_id": "abc0DeFgH" 
        }
    ],
    "tool_choice": "auto",
    "tools": [
        {
            "type": "function",
            "function": {
            "name": "get_flight_info",
            "description": "Returns information about the next flight between two cities. This includes the name of the airline, flight number and the date and time of the next flight",
            "parameters":{
                "type": "object",
                "properties": {
                    "origin_city": {
                        "type": "string",
                        "description": "The name of the city where the flight originates"
                    },
                    "destination_city": {
                        "type": "string",
                        "description": "The flight destination city"
                    }
                },
                "required": ["origin_city", "destination_city"]
            }
            }
        }
    ]
}

Tillämpa innehållssäkerhet

Azure AI-modellinferens-API:et stöder Azure AI-innehållssäkerhet. När du använder distributioner med Azure AI-innehållssäkerhet aktiverad passerar indata och utdata genom en uppsättning klassificeringsmodeller som syftar till att identifiera och förhindra utdata från skadligt innehåll. Systemet för innehållsfiltrering identifierar och vidtar åtgärder för specifika kategorier av potentiellt skadligt innehåll i både inkommande prompter och slutföranden av utdata.

I följande exempel visas hur du hanterar händelser när modellen identifierar skadligt innehåll i indataprompten och innehållssäkerhet är aktiverat.

{
    "model": "mistral-large-2407",
    "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."
        }
    ]
}
{
    "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
    }
}

Dricks

Mer information om hur du kan konfigurera och kontrollera säkerhetsinställningar för Azure AI-innehåll finns i säkerhetsdokumentationen för Azure AI-innehåll.

Använda chattavslutningar med bilder

Vissa modeller kan resonera mellan text och bilder och generera textavslut baserat på båda typerna av indata. I det här avsnittet utforskar du funktionerna i Vissa modeller för vision på ett chattsätt:

Viktigt!

Vissa modeller stöder bara en bild för varje tur i chattkonversationen och endast den sista bilden behålls i kontext. Om du lägger till flera bilder resulterar det i ett fel.

Om du vill se den här funktionen laddar du ned en bild och kodar informationen som base64 sträng. Resulterande data bör finnas i en data-URL:

Dricks

Du måste skapa data-URL:en med hjälp av ett skript- eller programmeringsspråk. I den här självstudien används den här exempelbilden i JPEG-format. En data-URL har följande format: data:image/jpg;base64,0xABCDFGHIJKLMNOPQRSTUVWXYZ....

Visualisera bilden:

Ett diagram som visar de relativa funktionerna mellan stora språkmodeller och små språkmodeller.

Skapa nu en begäran om att slutföra chatten med avbildningen:

{
    "model": "phi-3.5-vision-instruct",
    "messages": [
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "Which peculiar conclusion about LLMs and SLMs can be extracted from the following chart?"
                },
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "data:image/jpg;base64,0xABCDFGHIJKLMNOPQRSTUVWXYZ..."
                    }
                }
            ]
        }
    ],
    "temperature": 0,
    "top_p": 1,
    "max_tokens": 2048
}

Svaret är följande, där du kan se modellens användningsstatistik:

{
    "id": "0a1234b5de6789f01gh2i345j6789klm",
    "object": "chat.completion",
    "created": 1718726686,
    "model": "phi-3.5-vision-instruct",
    "choices": [
        {
            "index": 0,
            "message": {
                "role": "assistant",
                "content": "The chart illustrates that larger models tend to perform better in quality, as indicated by their size in billions of parameters. However, there are exceptions to this trend, such as Phi-3-medium and Phi-3-small, which outperform smaller models in quality. This suggests that while larger models generally have an advantage, there might be other factors at play that influence a model's performance.",
                "tool_calls": null
            },
            "finish_reason": "stop",
            "logprobs": null
        }
    ],
    "usage": {
        "prompt_tokens": 2380,
        "completion_tokens": 126,
        "total_tokens": 2506
    }
}