Partilhar via


Como gerar finalizações de chat com inferência de modelo de IA do Azure

Importante

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

Este artigo explica como usar a API de conclusão de chat com modelos implantados na inferência de modelo de IA do Azure nos serviços de IA do Azure.

Pré-requisitos

Para usar modelos de conclusão de chat em seu aplicativo, você precisa:

  • Uma subscrição do Azure. Se você estiver usando Modelos do GitHub, poderá atualizar sua experiência e criar uma assinatura do Azure no processo. Leia Atualização de modelos do GitHub para inferência de modelo de IA do Azure, se esse for o seu caso.

  • Um recurso de serviços de IA do Azure. Para obter mais informações, consulte Criar um recurso dos Serviços de IA do Azure.

  • A URL e a chave do ponto de extremidade.

    Captura de ecrã a mostrar como obter o URL e a chave associados ao recurso.

Usar finalizações de bate-papo

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

import os
from 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"
)

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

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

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

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

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

Nota

Alguns modelos não suportam mensagens do sistema (role="system"). Quando você usa a API de inferência de modelo de IA do Azure, as mensagens do sistema são convertidas em mensagens do usuário, que é o recurso mais próximo disponível. Essa tradução é oferecida por conveniência, mas é importante que você verifique se o modelo está seguindo as instruções na mensagem do sistema com o nível certo de confiança.

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

print("Response:", response.choices[0].message.content)
print("Model:", response.model)
print("Usage:")
print("\tPrompt tokens:", response.usage.prompt_tokens)
print("\tTotal tokens:", response.usage.total_tokens)
print("\tCompletion tokens:", response.usage.completion_tokens)
Response: As of now, it's estimated that there are about 7,000 languages spoken around the world. However, this number can vary as some languages become extinct and new ones develop. It's also important to note that the number of speakers can greatly vary between languages, with some having millions of speakers and others only a few hundred.
Model: mistral-large-2407
Usage: 
  Prompt tokens: 19
  Total tokens: 91
  Completion tokens: 72

Inspecione a usage seção na resposta para ver o número de tokens usados para o prompt, o número total de tokens gerados e o número de tokens usados para a conclusão.

Transmitir conteúdo

Por padrão, a API de conclusão retorna todo o conteúdo gerado em uma única resposta. Se você estiver gerando longas conclusões, esperar pela resposta pode levar muitos segundos.

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

Para transmitir finalizações, defina stream=True quando você chamar o modelo.

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

Para visualizar a saída, defina uma função auxiliar para imprimir o fluxo.

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

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

print_stream(result)

Explore mais parâmetros suportados pelo cliente de inferência

Explore outros parâmetros que você pode especificar no cliente de inferência. Para obter uma lista completa de todos os parâmetros suportados e sua documentação correspondente, consulte Referência da API de Inferência de Modelo de IA do Azure.

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

Alguns modelos não suportam a formatação de saída JSON. Você sempre pode solicitar que o modelo gere saídas JSON. No entanto, não é garantido que tais saídas sejam JSON válidas.

Se quiser passar um parâmetro que não esteja na lista de parâmetros suportados, você pode passá-lo para o modelo subjacente usando parâmetros extras. Consulte Passar parâmetros extras para o modelo.

Criar saídas JSON

Alguns modelos podem criar saídas JSON. Defina response_format como json_object para habilitar o modo JSON e garantir que a mensagem gerada pelo modelo seja JSON válida. Você também deve instruir o modelo a produzir JSON por conta própria por meio de um sistema ou mensagem de usuário. Além disso, o conteúdo da mensagem pode ser parcialmente cortado se finish_reason="length", o que indica que a geração excedeu max_tokens ou que a conversa excedeu o comprimento máximo de contexto.

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

Passar parâmetros extras para o modelo

A API de Inferência de Modelo de IA do Azure permite que você passe parâmetros extras para o modelo. O exemplo de código a seguir mostra como passar o parâmetro logprobs extra para o modelo.

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

Antes de passar parâmetros extras para a API de inferência de modelo de IA do Azure, verifique se seu modelo oferece suporte a esses parâmetros extras. Quando a solicitação é feita para o modelo subjacente, o cabeçalho extra-parameters é passado para o modelo com o valor pass-through. Esse valor diz ao ponto de extremidade para passar os parâmetros extras para o modelo. O uso de parâmetros extras com o modelo não garante que o modelo possa realmente lidar com eles. Leia a documentação do modelo para entender quais parâmetros extras são suportados.

Utilizar ferramentas

Alguns modelos suportam o uso de ferramentas, que podem ser um recurso extraordinário quando você precisa descarregar tarefas específicas do modelo de linguagem e, em vez disso, confiar em um sistema mais determinístico ou até mesmo em um modelo de linguagem diferente. A API de Inferência de Modelo de IA do Azure permite definir ferramentas da seguinte maneira.

O exemplo de código a seguir cria uma definição de ferramenta que é capaz de olhar a partir de informações de voo de duas cidades diferentes.

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]

Neste exemplo, a saída da função é que não há voos disponíveis para a rota selecionada, mas o usuário deve considerar pegar um trem.

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

Nota

Os modelos Cohere exigem que as respostas de uma ferramenta sejam um conteúdo JSON válido formatado como uma cadeia de caracteres. Ao construir mensagens do tipo Tool, verifique se a resposta é uma cadeia de caracteres JSON válida.

Solicite ao modelo que reserve voos com a ajuda desta função:

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

Você pode inspecionar a resposta para descobrir se uma ferramenta precisa ser chamada. Inspecione o motivo do término para determinar se a ferramenta deve ser chamada. Lembre-se de que vários tipos de ferramentas podem ser indicados. Este exemplo demonstra uma ferramenta do tipo 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)

Para continuar, anexe esta mensagem ao histórico de bate-papo:

messages.append(
    response_message
)

Agora, é hora de chamar a função apropriada para lidar com a chamada de ferramenta. O trecho de código a seguir itera todas as chamadas de ferramenta indicadas na resposta e chama a função correspondente com os parâmetros apropriados. A resposta também é anexada ao histórico de bate-papo.

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

Veja a resposta do modelo:

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

Aplicar a segurança do conteúdo

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

O exemplo a seguir mostra como manipular eventos quando o modelo deteta conteúdo prejudicial no prompt de entrada e a segurança do conteúdo está habilitada.

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

Gorjeta

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

Usar finalizações de bate-papo com imagens

Alguns modelos podem raciocinar em texto e imagens e gerar finalizações de texto com base em ambos os tipos de entrada. Nesta seção, você explora os recursos de Alguns modelos para visão de forma de bate-papo:

Importante

Alguns modelos suportam apenas uma imagem para cada turno na conversa de chat e apenas a última imagem é mantida no contexto. Se você adicionar várias imagens, isso resultará em um erro.

Para ver esse recurso, baixe uma imagem e codifique as informações como base64 string. Os dados resultantes devem estar dentro de uma URL de dados:

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

Visualize a imagem:

import requests
import IPython.display as Disp

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

Um gráfico que mostra as capacidades relativas entre modelos de linguagem grandes e modelos de linguagem pequena.

Agora, crie uma solicitação de conclusão de bate-papo com a imagem:

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

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

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

Importante

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

Este artigo explica como usar a API de conclusão de chat com modelos implantados na inferência de modelo de IA do Azure nos serviços de IA do Azure.

Pré-requisitos

Para usar modelos de conclusão de chat em seu aplicativo, você precisa:

  • Uma subscrição do Azure. Se você estiver usando Modelos do GitHub, poderá atualizar sua experiência e criar uma assinatura do Azure no processo. Leia Atualização de modelos do GitHub para inferência de modelo de IA do Azure, se esse for o seu caso.

  • Um recurso de serviços de IA do Azure. Para obter mais informações, consulte Criar um recurso dos Serviços de IA do Azure.

  • A URL e a chave do ponto de extremidade.

    Captura de ecrã a mostrar como obter o URL e a chave associados ao recurso.

Usar finalizações de bate-papo

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

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

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

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

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

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

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

Nota

Alguns modelos não suportam mensagens do sistema (role="system"). Quando você usa a API de inferência de modelo de IA do Azure, as mensagens do sistema são convertidas em mensagens do usuário, que é o recurso mais próximo disponível. Essa tradução é oferecida por conveniência, mas é importante que você verifique se o modelo está seguindo as instruções na mensagem do sistema com o nível certo de confiança.

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

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

console.log("Response: ", response.body.choices[0].message.content);
console.log("Model: ", response.body.model);
console.log("Usage:");
console.log("\tPrompt tokens:", response.body.usage.prompt_tokens);
console.log("\tTotal tokens:", response.body.usage.total_tokens);
console.log("\tCompletion tokens:", response.body.usage.completion_tokens);
Response: 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

Inspecione a usage seção na resposta para ver o número de tokens usados para o prompt, o número total de tokens gerados e o número de tokens usados para a conclusão.

Transmitir conteúdo

Por padrão, a API de conclusão retorna todo o conteúdo gerado em uma única resposta. Se você estiver gerando longas conclusões, esperar pela resposta pode levar muitos segundos.

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

Para transmitir finalizações, use .asNodeStream() quando chamar o modelo.

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

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

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

Explore mais parâmetros suportados pelo cliente de inferência

Explore outros parâmetros que você pode especificar no cliente de inferência. Para obter uma lista completa de todos os parâmetros suportados e sua documentação correspondente, consulte Referência da API de Inferência de Modelo de IA do Azure.

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

Alguns modelos não suportam a formatação de saída JSON. Você sempre pode solicitar que o modelo gere saídas JSON. No entanto, não é garantido que tais saídas sejam JSON válidas.

Se quiser passar um parâmetro que não esteja na lista de parâmetros suportados, você pode passá-lo para o modelo subjacente usando parâmetros extras. Consulte Passar parâmetros extras para o modelo.

Criar saídas JSON

Alguns modelos podem criar saídas JSON. Defina response_format como json_object para habilitar o modo JSON e garantir que a mensagem gerada pelo modelo seja JSON válida. Você também deve instruir o modelo a produzir JSON por conta própria por meio de um sistema ou mensagem de usuário. Além disso, o conteúdo da mensagem pode ser parcialmente cortado se finish_reason="length", o que indica que a geração excedeu max_tokens ou que a conversa excedeu o comprimento máximo de contexto.

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

Passar parâmetros extras para o modelo

A API de Inferência de Modelo de IA do Azure permite que você passe parâmetros extras para o modelo. O exemplo de código a seguir mostra como passar o parâmetro logprobs extra para o modelo.

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

Antes de passar parâmetros extras para a API de inferência de modelo de IA do Azure, verifique se seu modelo oferece suporte a esses parâmetros extras. Quando a solicitação é feita para o modelo subjacente, o cabeçalho extra-parameters é passado para o modelo com o valor pass-through. Esse valor diz ao ponto de extremidade para passar os parâmetros extras para o modelo. O uso de parâmetros extras com o modelo não garante que o modelo possa realmente lidar com eles. Leia a documentação do modelo para entender quais parâmetros extras são suportados.

Utilizar ferramentas

Alguns modelos suportam o uso de ferramentas, que podem ser um recurso extraordinário quando você precisa descarregar tarefas específicas do modelo de linguagem e, em vez disso, confiar em um sistema mais determinístico ou até mesmo em um modelo de linguagem diferente. A API de Inferência de Modelo de IA do Azure permite definir ferramentas da seguinte maneira.

O exemplo de código a seguir cria uma definição de ferramenta que é capaz de olhar a partir de informações de voo de duas cidades diferentes.

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

Neste exemplo, a saída da função é que não há voos disponíveis para a rota selecionada, mas o usuário deve considerar pegar um trem.

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

Nota

Os modelos Cohere exigem que as respostas de uma ferramenta sejam um conteúdo JSON válido formatado como uma cadeia de caracteres. Ao construir mensagens do tipo Tool, verifique se a resposta é uma cadeia de caracteres JSON válida.

Solicite ao modelo que reserve voos com a ajuda desta função:

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

Você pode inspecionar a resposta para descobrir se uma ferramenta precisa ser chamada. Inspecione o motivo do término para determinar se a ferramenta deve ser chamada. Lembre-se de que vários tipos de ferramentas podem ser indicados. Este exemplo demonstra uma ferramenta do tipo 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);

Para continuar, anexe esta mensagem ao histórico de bate-papo:

messages.push(response_message);

Agora, é hora de chamar a função apropriada para lidar com a chamada de ferramenta. O trecho de código a seguir itera todas as chamadas de ferramenta indicadas na resposta e chama a função correspondente com os parâmetros apropriados. A resposta também é anexada ao histórico de bate-papo.

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

Veja a resposta do modelo:

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

Aplicar a segurança do conteúdo

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

O exemplo a seguir mostra como manipular eventos quando o modelo deteta conteúdo prejudicial no prompt de entrada e a segurança do conteúdo está habilitada.

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

Gorjeta

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

Usar finalizações de bate-papo com imagens

Alguns modelos podem raciocinar em texto e imagens e gerar finalizações de texto com base em ambos os tipos de entrada. Nesta seção, você explora os recursos de Alguns modelos para visão de forma de bate-papo:

Importante

Alguns modelos suportam apenas uma imagem para cada turno na conversa de chat e apenas a última imagem é mantida no contexto. Se você adicionar várias imagens, isso resultará em um erro.

Para ver esse recurso, baixe uma imagem e codifique as informações como base64 string. Os dados resultantes devem estar dentro de uma URL de dados:

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

Visualize a imagem:

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

Um gráfico que mostra as capacidades relativas entre modelos de linguagem grandes e modelos de linguagem pequena.

Agora, crie uma solicitação de conclusão de bate-papo com a imagem:

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

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

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

Importante

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

Este artigo explica como usar a API de conclusão de chat com modelos implantados na inferência de modelo de IA do Azure nos serviços de IA do Azure.

Pré-requisitos

Para usar modelos de conclusão de chat em seu aplicativo, você precisa:

  • Uma subscrição do Azure. Se você estiver usando Modelos do GitHub, poderá atualizar sua experiência e criar uma assinatura do Azure no processo. Leia Atualização de modelos do GitHub para inferência de modelo de IA do Azure, se esse for o seu caso.

  • Um recurso de serviços de IA do Azure. Para obter mais informações, consulte Criar um recurso dos Serviços de IA do Azure.

  • A URL e a chave do ponto de extremidade.

    Captura de ecrã a mostrar como obter o URL e a chave associados ao recurso.

  • Uma implantação de modelo de conclusão de chat. Se você não tiver um, leia Adicionar e configurar modelos aos serviços de IA do Azure para adicionar um modelo de conclusão de chat ao seu recurso.

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

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

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

    package com.azure.ai.inference.usage;
    
    import com.azure.ai.inference.EmbeddingsClient;
    import com.azure.ai.inference.EmbeddingsClientBuilder;
    import com.azure.ai.inference.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;
    

Usar finalizações de bate-papo

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

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

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

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

Nota

Alguns modelos não suportam mensagens do sistema (role="system"). Quando você usa a API de inferência de modelo de IA do Azure, as mensagens do sistema são convertidas em mensagens do usuário, que é o recurso mais próximo disponível. Essa tradução é oferecida por conveniência, mas é importante que você verifique se o modelo está seguindo as instruções na mensagem do sistema com o nível certo de confiança.

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

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

Inspecione a usage seção na resposta para ver o número de tokens usados para o prompt, o número total de tokens gerados e o número de tokens usados para a conclusão.

Transmitir conteúdo

Por padrão, a API de conclusão retorna todo o conteúdo gerado em uma única resposta. Se você estiver gerando longas conclusões, esperar pela resposta pode levar muitos segundos.

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

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

Explore mais parâmetros suportados pelo cliente de inferência

Explore outros parâmetros que você pode especificar no cliente de inferência. Para obter uma lista completa de todos os parâmetros suportados e sua documentação correspondente, consulte Referência da API de Inferência de Modelo de IA do Azure. Alguns modelos não suportam a formatação de saída JSON. Você sempre pode solicitar que o modelo gere saídas JSON. No entanto, não é garantido que tais saídas sejam JSON válidas.

Se quiser passar um parâmetro que não esteja na lista de parâmetros suportados, você pode passá-lo para o modelo subjacente usando parâmetros extras. Consulte Passar parâmetros extras para o modelo.

Criar saídas JSON

Alguns modelos podem criar saídas JSON. Defina response_format como json_object para habilitar o modo JSON e garantir que a mensagem gerada pelo modelo seja JSON válida. Você também deve instruir o modelo a produzir JSON por conta própria por meio de um sistema ou mensagem de usuário. Além disso, o conteúdo da mensagem pode ser parcialmente cortado se finish_reason="length", o que indica que a geração excedeu max_tokens ou que a conversa excedeu o comprimento máximo de contexto.

Passar parâmetros extras para o modelo

A API de Inferência de Modelo de IA do Azure permite que você passe parâmetros extras para o modelo. O exemplo de código a seguir mostra como passar o parâmetro logprobs extra para o modelo.

Antes de passar parâmetros extras para a API de inferência de modelo de IA do Azure, verifique se seu modelo oferece suporte a esses parâmetros extras. Quando a solicitação é feita para o modelo subjacente, o cabeçalho extra-parameters é passado para o modelo com o valor pass-through. Esse valor diz ao ponto de extremidade para passar os parâmetros extras para o modelo. O uso de parâmetros extras com o modelo não garante que o modelo possa realmente lidar com eles. Leia a documentação do modelo para entender quais parâmetros extras são suportados.

Utilizar ferramentas

Alguns modelos suportam o uso de ferramentas, que podem ser um recurso extraordinário quando você precisa descarregar tarefas específicas do modelo de linguagem e, em vez disso, confiar em um sistema mais determinístico ou até mesmo em um modelo de linguagem diferente. A API de Inferência de Modelo de IA do Azure permite definir ferramentas da seguinte maneira.

O exemplo de código a seguir cria uma definição de ferramenta que é capaz de olhar a partir de informações de voo de duas cidades diferentes.

Neste exemplo, a saída da função é que não há voos disponíveis para a rota selecionada, mas o usuário deve considerar pegar um trem.

Nota

Os modelos Cohere exigem que as respostas de uma ferramenta sejam um conteúdo JSON válido formatado como uma cadeia de caracteres. Ao construir mensagens do tipo Tool, verifique se a resposta é uma cadeia de caracteres JSON válida.

Solicite ao modelo que reserve voos com a ajuda desta função:

Você pode inspecionar a resposta para descobrir se uma ferramenta precisa ser chamada. Inspecione o motivo do término para determinar se a ferramenta deve ser chamada. Lembre-se de que vários tipos de ferramentas podem ser indicados. Este exemplo demonstra uma ferramenta do tipo function.

Para continuar, anexe esta mensagem ao histórico de bate-papo:

Agora, é hora de chamar a função apropriada para lidar com a chamada de ferramenta. O trecho de código a seguir itera todas as chamadas de ferramenta indicadas na resposta e chama a função correspondente com os parâmetros apropriados. A resposta também é anexada ao histórico de bate-papo.

Veja a resposta do modelo:

Aplicar a segurança do conteúdo

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

O exemplo a seguir mostra como manipular eventos quando o modelo deteta conteúdo prejudicial no prompt de entrada e a segurança do conteúdo está habilitada.

Gorjeta

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

Usar finalizações de bate-papo com imagens

Alguns modelos podem raciocinar em texto e imagens e gerar finalizações de texto com base em ambos os tipos de entrada. Nesta seção, você explora os recursos de Alguns modelos para visão de forma de bate-papo:

Importante

Alguns modelos suportam apenas uma imagem para cada turno na conversa de chat e apenas a última imagem é mantida no contexto. Se você adicionar várias imagens, isso resultará em um erro.

Para ver esse recurso, baixe uma imagem e codifique as informações como base64 string. Os dados resultantes devem estar dentro de uma URL de dados:

Visualize a imagem:

Um gráfico que mostra as capacidades relativas entre modelos de linguagem grandes e modelos de linguagem pequena.

Agora, crie uma solicitação de conclusão de bate-papo com a imagem:

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

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

Importante

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

Este artigo explica como usar a API de conclusão de chat com modelos implantados na inferência de modelo de IA do Azure nos serviços de IA do Azure.

Pré-requisitos

Para usar modelos de conclusão de chat em seu aplicativo, você precisa:

  • Uma subscrição do Azure. Se você estiver usando Modelos do GitHub, poderá atualizar sua experiência e criar uma assinatura do Azure no processo. Leia Atualização de modelos do GitHub para inferência de modelo de IA do Azure, se esse for o seu caso.

  • Um recurso de serviços de IA do Azure. Para obter mais informações, consulte Criar um recurso dos Serviços de IA do Azure.

  • A URL e a chave do ponto de extremidade.

    Captura de ecrã a mostrar como obter o URL e a chave associados ao recurso.

  • Uma implantação de modelo de conclusão de chat. Se você não tiver um, leia Adicionar e configurar modelos aos serviços de IA do Azure para adicionar um modelo de conclusão de chat ao seu recurso.

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

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

    dotnet add package Azure.Identity
    

Usar finalizações de bate-papo

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

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

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

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

clientOptions.AddPolicy(tokenPolicy, HttpPipelinePosition.PerRetry);

client = new ChatCompletionsClient(
    new Uri(Environment.GetEnvironmentVariable("AZURE_INFERENCE_ENDPOINT")),
    credential,
    clientOptions,
);

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

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

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

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

Nota

Alguns modelos não suportam mensagens do sistema (role="system"). Quando você usa a API de inferência de modelo de IA do Azure, as mensagens do sistema são convertidas em mensagens do usuário, que é o recurso mais próximo disponível. Essa tradução é oferecida por conveniência, mas é importante que você verifique se o modelo está seguindo as instruções na mensagem do sistema com o nível certo de confiança.

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

Console.WriteLine($"Response: {response.Value.Content}");
Console.WriteLine($"Model: {response.Value.Model}");
Console.WriteLine("Usage:");
Console.WriteLine($"\tPrompt tokens: {response.Value.Usage.PromptTokens}");
Console.WriteLine($"\tTotal tokens: {response.Value.Usage.TotalTokens}");
Console.WriteLine($"\tCompletion tokens: {response.Value.Usage.CompletionTokens}");
Response: 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

Inspecione a usage seção na resposta para ver o número de tokens usados para o prompt, o número total de tokens gerados e o número de tokens usados para a conclusão.

Transmitir conteúdo

Por padrão, a API de conclusão retorna todo o conteúdo gerado em uma única resposta. Se você estiver gerando longas conclusões, esperar pela resposta pode levar muitos segundos.

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

Para transmitir conclusão, use CompleteStreamingAsync o método quando você chamar o modelo. Observe que, neste exemplo, a chamada é encapsulada em um método assíncrono.

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,
        Model = "mistral-large-2407",
    };

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

    await PrintStream(streamResponse);
}

Para visualizar a saída, defina um método assíncrono para imprimir o fluxo no console.

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

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

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

Explore mais parâmetros suportados pelo cliente de inferência

Explore outros parâmetros que você pode especificar no cliente de inferência. Para obter uma lista completa de todos os parâmetros suportados e sua documentação correspondente, consulte Referência da API de Inferência de Modelo de IA do Azure.

requestOptions = new ChatCompletionsOptions()
{
    Messages = {
        new ChatRequestSystemMessage("You are a helpful assistant."),
        new ChatRequestUserMessage("How many languages are in the world?")
    },
    Model = "mistral-large-2407",
    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}");

Alguns modelos não suportam a formatação de saída JSON. Você sempre pode solicitar que o modelo gere saídas JSON. No entanto, não é garantido que tais saídas sejam JSON válidas.

Se quiser passar um parâmetro que não esteja na lista de parâmetros suportados, você pode passá-lo para o modelo subjacente usando parâmetros extras. Consulte Passar parâmetros extras para o modelo.

Criar saídas JSON

Alguns modelos podem criar saídas JSON. Defina response_format como json_object para habilitar o modo JSON e garantir que a mensagem gerada pelo modelo seja JSON válida. Você também deve instruir o modelo a produzir JSON por conta própria por meio de um sistema ou mensagem de usuário. Além disso, o conteúdo da mensagem pode ser parcialmente cortado se finish_reason="length", o que indica que a geração excedeu max_tokens ou que a conversa excedeu o comprimento máximo de contexto.

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 ChatCompletionsResponseFormatJsonObject(),
    Model = "mistral-large-2407",
};

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

Passar parâmetros extras para o modelo

A API de Inferência de Modelo de IA do Azure permite que você passe parâmetros extras para o modelo. O exemplo de código a seguir mostra como passar o parâmetro logprobs extra para o modelo.

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

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

Antes de passar parâmetros extras para a API de inferência de modelo de IA do Azure, verifique se seu modelo oferece suporte a esses parâmetros extras. Quando a solicitação é feita para o modelo subjacente, o cabeçalho extra-parameters é passado para o modelo com o valor pass-through. Esse valor diz ao ponto de extremidade para passar os parâmetros extras para o modelo. O uso de parâmetros extras com o modelo não garante que o modelo possa realmente lidar com eles. Leia a documentação do modelo para entender quais parâmetros extras são suportados.

Utilizar ferramentas

Alguns modelos suportam o uso de ferramentas, que podem ser um recurso extraordinário quando você precisa descarregar tarefas específicas do modelo de linguagem e, em vez disso, confiar em um sistema mais determinístico ou até mesmo em um modelo de linguagem diferente. A API de Inferência de Modelo de IA do Azure permite definir ferramentas da seguinte maneira.

O exemplo de código a seguir cria uma definição de ferramenta que é capaz de olhar a partir de informações de voo de duas cidades diferentes.

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

Neste exemplo, a saída da função é que não há voos disponíveis para a rota selecionada, mas o usuário deve considerar pegar um trem.

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

Nota

Os modelos Cohere exigem que as respostas de uma ferramenta sejam um conteúdo JSON válido formatado como uma cadeia de caracteres. Ao construir mensagens do tipo Tool, verifique se a resposta é uma cadeia de caracteres JSON válida.

Solicite ao modelo que reserve voos com a ajuda desta função:

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, model: "mistral-large-2407");
requestOptions.Tools.Add(getFlightTool);
requestOptions.ToolChoice = ChatCompletionsToolChoice.Auto;

response = client.Complete(requestOptions);

Você pode inspecionar a resposta para descobrir se uma ferramenta precisa ser chamada. Inspecione o motivo do término para determinar se a ferramenta deve ser chamada. Lembre-se de que vários tipos de ferramentas podem ser indicados. Este exemplo demonstra uma ferramenta do tipo 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}");

Para continuar, anexe esta mensagem ao histórico de bate-papo:

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

Agora, é hora de chamar a função apropriada para lidar com a chamada de ferramenta. O trecho de código a seguir itera todas as chamadas de ferramenta indicadas na resposta e chama a função correspondente com os parâmetros apropriados. A resposta também é anexada ao histórico de bate-papo.

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

Veja a resposta do modelo:

response = client.Complete(requestOptions);

Aplicar a segurança do conteúdo

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

O exemplo a seguir mostra como manipular eventos quando o modelo deteta conteúdo prejudicial no prompt de entrada e a segurança do conteúdo está habilitada.

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 = "mistral-large-2407",
    };

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

Gorjeta

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

Usar finalizações de bate-papo com imagens

Alguns modelos podem raciocinar em texto e imagens e gerar finalizações de texto com base em ambos os tipos de entrada. Nesta seção, você explora os recursos de Alguns modelos para visão de forma de bate-papo:

Importante

Alguns modelos suportam apenas uma imagem para cada turno na conversa de chat e apenas a última imagem é mantida no contexto. Se você adicionar várias imagens, isso resultará em um erro.

Para ver esse recurso, baixe uma imagem e codifique as informações como base64 string. Os dados resultantes devem estar dentro de uma URL de dados:

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

Visualize a imagem:

Um gráfico que mostra as capacidades relativas entre modelos de linguagem grandes e modelos de linguagem pequena.

Agora, crie uma solicitação de conclusão de bate-papo com a imagem:

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,
    Model = "phi-3.5-vision-instruct",
};

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

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

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: phi-3.5-vision-instruct
Usage: 
  Prompt tokens: 2380
  Completion tokens: 126
  Total tokens: 2506

Importante

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

Este artigo explica como usar a API de conclusão de chat com modelos implantados na inferência de modelo de IA do Azure nos serviços de IA do Azure.

Pré-requisitos

Para usar modelos de conclusão de chat em seu aplicativo, você precisa:

  • Uma subscrição do Azure. Se você estiver usando Modelos do GitHub, poderá atualizar sua experiência e criar uma assinatura do Azure no processo. Leia Atualização de modelos do GitHub para inferência de modelo de IA do Azure, se esse for o seu caso.

  • Um recurso de serviços de IA do Azure. Para obter mais informações, consulte Criar um recurso dos Serviços de IA do Azure.

  • A URL e a chave do ponto de extremidade.

    Captura de ecrã a mostrar como obter o URL e a chave associados ao recurso.

Usar finalizações de bate-papo

Para usar as incorporações de texto, use a rota /chat/completions anexada à URL base junto com sua credencial indicada em api-key. Authorization cabeçalho também é suportado com o formato 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>

Se você configurou o recurso com suporte ao Microsoft Entra ID , passe o Authorization token no cabeçalho:

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

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

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

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

Nota

Alguns modelos não suportam mensagens do sistema (role="system"). Quando você usa a API de inferência de modelo de IA do Azure, as mensagens do sistema são convertidas em mensagens do usuário, que é o recurso mais próximo disponível. Essa tradução é oferecida por conveniência, mas é importante que você verifique se o modelo está seguindo as instruções na mensagem do sistema com o nível certo de confiança.

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

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

Inspecione a usage seção na resposta para ver o número de tokens usados para o prompt, o número total de tokens gerados e o número de tokens usados para a conclusão.

Transmitir conteúdo

Por padrão, a API de conclusão retorna todo o conteúdo gerado em uma única resposta. Se você estiver gerando longas conclusões, esperar pela resposta pode levar muitos segundos.

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

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

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

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

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

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

Explore mais parâmetros suportados pelo cliente de inferência

Explore outros parâmetros que você pode especificar no cliente de inferência. Para obter uma lista completa de todos os parâmetros suportados e sua documentação correspondente, consulte Referência da API de Inferência de Modelo de IA do Azure.

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

Alguns modelos não suportam a formatação de saída JSON. Você sempre pode solicitar que o modelo gere saídas JSON. No entanto, não é garantido que tais saídas sejam JSON válidas.

Se quiser passar um parâmetro que não esteja na lista de parâmetros suportados, você pode passá-lo para o modelo subjacente usando parâmetros extras. Consulte Passar parâmetros extras para o modelo.

Criar saídas JSON

Alguns modelos podem criar saídas JSON. Defina response_format como json_object para habilitar o modo JSON e garantir que a mensagem gerada pelo modelo seja JSON válida. Você também deve instruir o modelo a produzir JSON por conta própria por meio de um sistema ou mensagem de usuário. Além disso, o conteúdo da mensagem pode ser parcialmente cortado se finish_reason="length", o que indica que a geração excedeu max_tokens ou que a conversa excedeu o comprimento máximo de contexto.

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

Passar parâmetros extras para o modelo

A API de Inferência de Modelo de IA do Azure permite que você passe parâmetros extras para o modelo. O exemplo de código a seguir mostra como passar o parâmetro logprobs extra para o modelo.

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
}

Antes de passar parâmetros extras para a API de inferência de modelo de IA do Azure, verifique se seu modelo oferece suporte a esses parâmetros extras. Quando a solicitação é feita para o modelo subjacente, o cabeçalho extra-parameters é passado para o modelo com o valor pass-through. Esse valor diz ao ponto de extremidade para passar os parâmetros extras para o modelo. O uso de parâmetros extras com o modelo não garante que o modelo possa realmente lidar com eles. Leia a documentação do modelo para entender quais parâmetros extras são suportados.

Utilizar ferramentas

Alguns modelos suportam o uso de ferramentas, que podem ser um recurso extraordinário quando você precisa descarregar tarefas específicas do modelo de linguagem e, em vez disso, confiar em um sistema mais determinístico ou até mesmo em um modelo de linguagem diferente. A API de Inferência de Modelo de IA do Azure permite definir ferramentas da seguinte maneira.

O exemplo de código a seguir cria uma definição de ferramenta que é capaz de olhar a partir de informações de voo de duas cidades diferentes.

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

Neste exemplo, a saída da função é que não há voos disponíveis para a rota selecionada, mas o usuário deve considerar pegar um trem.

Nota

Os modelos Cohere exigem que as respostas de uma ferramenta sejam um conteúdo JSON válido formatado como uma cadeia de caracteres. Ao construir mensagens do tipo Tool, verifique se a resposta é uma cadeia de caracteres JSON válida.

Solicite ao modelo que reserve voos com a ajuda desta função:

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

Você pode inspecionar a resposta para descobrir se uma ferramenta precisa ser chamada. Inspecione o motivo do término para determinar se a ferramenta deve ser chamada. Lembre-se de que vários tipos de ferramentas podem ser indicados. Este exemplo demonstra uma ferramenta do tipo 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
    }
}

Para continuar, anexe esta mensagem ao histórico de bate-papo:

Agora, é hora de chamar a função apropriada para lidar com a chamada de ferramenta. O trecho de código a seguir itera todas as chamadas de ferramenta indicadas na resposta e chama a função correspondente com os parâmetros apropriados. A resposta também é anexada ao histórico de bate-papo.

Veja a resposta do modelo:

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

Aplicar a segurança do conteúdo

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

O exemplo a seguir mostra como manipular eventos quando o modelo deteta conteúdo prejudicial no prompt de entrada e a segurança do conteúdo está habilitada.

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

Gorjeta

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

Usar finalizações de bate-papo com imagens

Alguns modelos podem raciocinar em texto e imagens e gerar finalizações de texto com base em ambos os tipos de entrada. Nesta seção, você explora os recursos de Alguns modelos para visão de forma de bate-papo:

Importante

Alguns modelos suportam apenas uma imagem para cada turno na conversa de chat e apenas a última imagem é mantida no contexto. Se você adicionar várias imagens, isso resultará em um erro.

Para ver esse recurso, baixe uma imagem e codifique as informações como base64 string. Os dados resultantes devem estar dentro de uma URL de dados:

Gorjeta

Você precisará construir a URL de dados usando uma linguagem de script ou programação. Este tutorial usa esta imagem de exemplo em formato JPEG. Um URL de dados tem o seguinte formato: data:image/jpg;base64,0xABCDFGHIJKLMNOPQRSTUVWXYZ....

Visualize a imagem:

Um gráfico que mostra as capacidades relativas entre modelos de linguagem grandes e modelos de linguagem pequena.

Agora, crie uma solicitação de conclusão de bate-papo com a imagem:

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

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

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