Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Внимание
Элементы, обозначенные в этой статье как (предварительная версия), сейчас предлагаются в общедоступной предварительной версии. Эта предварительная версия предоставляется без соглашения об уровне обслуживания, и мы не рекомендуем ее для рабочих нагрузок. Некоторые функции могут не поддерживаться или их возможности могут быть ограничены. Дополнительные сведения см. в дополнительных условиях использования для предварительных версий Microsoft Azure.
В этой статье объясняется, как использовать API завершения общения с моделями, развернутыми для инференса на платформе ИИ Azure в службах ИИ Azure.
Предварительные условия
Чтобы использовать модели завершения чата в приложении, вам потребуется:
Подписка Azure. Если вы используете модели GitHub, вы можете обновить интерфейс и создать подписку Azure в процессе. Ознакомьтесь с обновлением моделей GitHub на использование моделей ИИ Azure, если это ваш случай.
Ресурс служб ИИ Azure. Дополнительные сведения см. в статье "Создание ресурса Служб искусственного интеллекта Azure".
URL-адрес конечной точки и ключ.
Установите пакет вывода искусственного интеллекта Azure для Python с помощью следующей команды:
pip install -U azure-ai-inference
Развертывание модели завершения чата. Если у вас нет одного, ознакомьтесь со сведениями о добавлении и настройке моделей в службы ИИ Azure , чтобы добавить модель завершения чата в ресурс.
- В этом примере используется
mistral-large-2407
.
- В этом примере используется
Используйте завершение чата
Сначала создайте клиент для использования модели. В следующем коде используется URL-адрес конечной точки и ключ, хранящиеся в переменных среды.
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"
)
Если вы настроили ресурс с поддержкой идентификатора Microsoft Entra, можно использовать следующий фрагмент кода для создания клиента.
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"
)
Создание запроса на завершение чата
В следующем примере показано, как создать базовый запрос завершения чата в модель.
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?"),
],
)
Примечание.
Некоторые модели не поддерживают системные сообщения (role="system"
). При использовании API вывода модели искусственного интеллекта Azure системные сообщения переводятся в сообщения пользователей, что является наиболее доступной возможностью. Этот перевод предлагается для удобства, но важно убедиться, что модель выполняет инструкции в системном сообщении с правильным уровнем достоверности.
Ответ выглядит следующим образом, где можно просмотреть статистику использования модели:
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
раздел в ответе, чтобы узнать количество токенов, используемых для запроса, общее количество созданных токенов и количество токенов, использованных в завершении.
Потоковое содержимое
По умолчанию API завершения возвращает все созданное содержимое в одном ответе. Если вы создаете длинные формулировки, ожидание ответа может занять много секунд.
Вы можете стримить содержимое, чтобы получить его в процессе создания. Потоковая передача содержимого позволяет начать обработку результата по мере его доступности. Этот режим возвращает объект, который транслирует ответ в виде событий отправляемых сервером, содержащих только данные. Извлеките блоки из дельта-поля, а не поля сообщения.
Чтобы выполнить потоковую передачу завершений, задайте stream=True
при вызове модели.
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,
)
Чтобы визуализировать выходные данные, определите вспомогательную функцию для печати потока.
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="")
Вы можете визуализировать, как потоковая передача создает содержимое:
print_stream(result)
Дополнительные параметры, поддерживаемые клиентом вывода
Изучите другие параметры, которые можно указать в клиенте вывода. Полный список всех поддерживаемых параметров и их соответствующей документации см. в справочнике по API вывода модели ИИ 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() },
)
Некоторые модели не поддерживают форматирование выходных данных JSON. Вы всегда можете запрашивать модель для создания выходных данных JSON. Однако такие выходные данные не гарантируют допустимости JSON.
Если вы хотите передать параметр, который отсутствует в списке поддерживаемых параметров, его можно передать в базовую модель с помощью дополнительных параметров. См. Передача дополнительных параметров в модель.
Создание выходных данных JSON
Некоторые модели могут создавать выходные данные JSON. Установите response_format
в json_object
, чтобы включить режим JSON и гарантировать, что создаваемое моделью сообщение является допустимым JSON. Также необходимо инструктировать модель создать JSON самой, используя системное или пользовательское сообщение. Кроме того, содержимое сообщения может быть частично отрезано, если finish_reason="length"
, это указывает на то, что генерация превысила max_tokens
, или что беседа превысила максимальную длину контекста.
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="json_object"
)
Передача дополнительных параметров модели
API вывода модели ИИ Azure позволяет передавать дополнительные параметры модели в модель. В следующем примере кода показано, как передать дополнительный параметр logprobs
модели.
response = client.complete(
messages=[
SystemMessage(content="You are a helpful assistant."),
UserMessage(content="How many languages are in the world?"),
],
model_extras={
"logprobs": True
}
)
Перед передачей дополнительных параметров в API вывода модели ИИ Azure убедитесь, что ваша модель поддерживает эти дополнительные параметры. Когда запрос выполняется в базовой модели, заголовок extra-parameters
передается модели со значением pass-through
. Это значение указывает конечной точке передавать дополнительные параметры модели. Использование дополнительных параметров с моделью не гарантирует, что модель может эффективно обрабатывать их. Ознакомьтесь с документацией по модели, чтобы понять, какие дополнительные параметры поддерживаются.
Используйте инструменты
Некоторые модели поддерживают использование инструментов, которые могут быть чрезвычайным ресурсом, когда необходимо выгрузить конкретные задачи из языковой модели и вместо этого полагаться на более детерминированную систему или даже другую языковую модель. API вывода модели ИИ Azure позволяет определить средства следующим образом.
В следующем примере кода создается определение средства, которое может искать сведения о полете из двух разных городов.
from azure.ai.inference.models import FunctionDefinition, ChatCompletionsToolDefinition
flight_info = ChatCompletionsToolDefinition(
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]
В этом примере результат работы функции показывает, что для выбранного маршрута нет рейсов. Однако пользователь должен рассмотреть возможность воспользоваться поездом.
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."
}
Примечание.
Для моделей Cohere требуется, чтобы ответы инструмента были допустимым содержимым JSON, отформатированным в виде строки. При создании сообщений типа Tool убедитесь, что ответ является допустимой строкой JSON.
Предложите модели забронировать рейсы с помощью этой функции:
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"
)
Вы можете проверить ответ, чтобы узнать, нужно ли вызывать инструмент. Проверьте причину завершения, чтобы определить, следует ли вызывать инструмент. Помните, что можно указать несколько типов инструментов. В этом примере показан инструмент типа 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)
Чтобы продолжить, добавьте это сообщение в журнал чата:
messages.append(
response_message
)
Теперь пришло время вызвать подходящую функцию, чтобы обработать вызов инструмента. Следующий фрагмент кода выполняет итерацию всех вызовов инструментов, указанных в ответе, и вызывает соответствующую функцию с соответствующими параметрами. Ответ также добавляется в журнал чата.
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)
)
)
Просмотрите ответ модели:
response = client.complete(
messages=messages,
tools=tools,
)
Применение безопасности содержимого
API вывода модели ИИ Azure поддерживает безопасность содержимого ИИ Azure. При использовании развертываний с включенной безопасностью содержимого искусственного интеллекта Azure входные и выходные данные проходят через ансамбль моделей классификации, направленных на обнаружение и предотвращение вывода вредного содержимого. Система фильтрации содержимого обнаруживает и принимает меры по определенным категориям потенциально вредного содержимого как в запросах ввода, так и в завершении выходных данных.
В следующем примере показано, как обрабатывать события, когда модель обнаруживает вредное содержимое во входном запросе и включена безопасность содержимого.
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
Совет
Дополнительные сведения о настройке и управлении параметрами безопасности содержимого ИИ Azure см. в документации по безопасности содержимого ИИ Azure.
Внимание
Элементы, обозначенные в этой статье как (предварительная версия), сейчас предлагаются в общедоступной предварительной версии. Эта предварительная версия предоставляется без соглашения об уровне обслуживания, и мы не рекомендуем ее для рабочих нагрузок. Некоторые функции могут не поддерживаться или их возможности могут быть ограничены. Дополнительные сведения см. в дополнительных условиях использования для предварительных версий Microsoft Azure.
В этой статье объясняется, как использовать API завершения общения с моделями, развернутыми для инференса на платформе ИИ Azure в службах ИИ Azure.
Предварительные условия
Чтобы использовать модели завершения чата в приложении, вам потребуется:
Подписка Azure. Если вы используете модели GitHub, вы можете обновить интерфейс и создать подписку Azure в процессе. Прочитайте о переходе от моделей GitHub к выводам модели ИИ Azure, если это актуально для вас.
Ресурс служб ИИ Azure. Дополнительные сведения см. в статье "Создание ресурса Служб искусственного интеллекта Azure".
URL-адрес конечной точки и ключ.
Установите библиотеку вывода Azure для JavaScript с помощью следующей команды:
npm install @azure-rest/ai-inference npm install @azure/core-auth npm install @azure/identity
Если вы используете Node.js, можно настроить зависимости в package.json:
package.json
{ "name": "main_app", "version": "1.0.0", "description": "", "main": "app.js", "type": "module", "dependencies": { "@azure-rest/ai-inference": "1.0.0-beta.6", "@azure/core-auth": "1.9.0", "@azure/core-sse": "2.2.0", "@azure/identity": "4.8.0" } }
Импортируйте следующее:
import ModelClient from "@azure-rest/ai-inference"; import { isUnexpected } from "@azure-rest/ai-inference"; import { createSseStream } from "@azure/core-sse"; import { AzureKeyCredential } from "@azure/core-auth"; import { DefaultAzureCredential } from "@azure/identity";
- Развертывание модели завершения чата. Если у вас его нет, ознакомьтесь со сведениями о добавлении и настройке моделей в службы ИИ Azure чтобы добавить модель завершения чата в ресурс.
Используйте завершение чата
Сначала создайте клиент для использования модели. В следующем коде используется URL-адрес конечной точки и ключ, хранящиеся в переменных среды.
const client = ModelClient(
"https://<resource>.services.ai.azure.com/models",
new AzureKeyCredential(process.env.AZURE_INFERENCE_CREDENTIAL)
);
Если вы настроили ресурс с поддержкой идентификатора Microsoft Entra, можно использовать следующий фрагмент кода для создания клиента.
const clientOptions = { credentials: { "https://cognitiveservices.azure.com" } };
const client = ModelClient(
"https://<resource>.services.ai.azure.com/models",
new DefaultAzureCredential()
clientOptions,
);
Создание запроса на завершение чата
В следующем примере показано, как создать базовый запрос завершения чата в модель.
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: {
model: "mistral-large-2407",
messages: messages,
}
});
Примечание.
Некоторые модели не поддерживают системные сообщения (role="system"
). При использовании API вывода модели искусственного интеллекта Azure системные сообщения переводятся в сообщения пользователей, что является наиболее доступной возможностью. Этот перевод предлагается для удобства, но важно убедиться, что модель выполняет инструкции в системном сообщении с правильным уровнем достоверности.
Ответ выглядит следующим образом, где можно просмотреть статистику использования модели:
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
раздел в ответе, чтобы узнать количество токенов, используемых для запроса, общее количество созданных токенов и количество токенов, использованных в завершении.
Потоковое содержимое
По умолчанию API завершения возвращает все созданное содержимое в одном ответе. Если вы создаете длинные формулировки, ожидание ответа может занять много секунд.
Вы можете транслировать содержимое, чтобы получать его по мере создания. Потоковая передача содержимого позволяет начать обработку результата по мере его доступности. Этот режим возвращает объект, который передает ответ в виде событий, отправляемых сервером только с данными. Извлеките блоки из дельта-поля, а не поля сообщения.
Для потоковой передачи результатов завершения используйте .asNodeStream()
при вызове модели.
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: {
model: "mistral-large-2407",
messages: messages,
stream: true,
}
}).asNodeStream();
Вы можете визуализировать, как потоковая передача создает содержимое:
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) {
process.stdout.write(choice.delta?.content ?? "");
}
}
Дополнительные параметры, поддерживаемые клиентом вывода
Изучите другие параметры, которые можно указать в клиенте вывода. Полный список всех поддерживаемых параметров и их соответствующей документации см. в справочнике по API вывода модели ИИ 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: {
model: "mistral-large-2407",
messages: messages,
presence_penalty: "0.1",
frequency_penalty: "0.8",
max_tokens: 2048,
stop: ["<|endoftext|>"],
temperature: 0,
top_p: 1,
response_format: { type: "text" },
}
});
Некоторые модели не поддерживают форматирование выходных данных JSON. Вы всегда можете запрашивать модель для создания выходных данных JSON. Однако такие выходные данные не гарантируют допустимости JSON.
Если вы хотите передать параметр, который отсутствует в списке поддерживаемых параметров, его можно передать в базовую модель с помощью дополнительных параметров. См. раздел "Передача дополнительных параметров модели".
Создание выходных данных JSON
Некоторые модели могут создавать выходные данные JSON. Установите response_format
в json_object
, чтобы включить режим JSON и гарантировать, что создаваемое моделью сообщение является допустимым JSON. Также необходимо инструктировать модель создать JSON самой, используя системное или пользовательское сообщение. Кроме того, содержимое сообщения может быть частично отрезано, если finish_reason="length"
, это указывает на то, что генерация превысила max_tokens
, или что беседа превысила максимальную длину контекста.
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: {
model: "mistral-large-2407",
messages: messages,
response_format: { type: "json_object" }
}
});
Передача дополнительных параметров модели
API вывода модели ИИ Azure позволяет передавать дополнительные параметры модели в модель. В следующем примере кода показано, как передать дополнительный параметр logprobs
модели.
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: {
model: "mistral-large-2407",
messages: messages,
logprobs: true
}
});
Перед передачей дополнительных параметров в API вывода модели ИИ Azure убедитесь, что ваша модель поддерживает эти дополнительные параметры. Когда запрос выполняется в базовой модели, заголовок extra-parameters
передается модели со значением pass-through
. Это значение указывает конечной точке передавать дополнительные параметры модели. Использование дополнительных параметров с моделью не гарантирует, что модель может эффективно обрабатывать их. Ознакомьтесь с документацией по модели, чтобы понять, какие дополнительные параметры поддерживаются.
Используйте инструменты
Некоторые модели поддерживают использование инструментов, которые могут быть чрезвычайным ресурсом, когда необходимо выгрузить конкретные задачи из языковой модели и вместо этого полагаться на более детерминированную систему или даже другую языковую модель. API вывода модели ИИ Azure позволяет определить средства следующим образом.
В следующем примере кода создается определение средства, которое может искать сведения о полете из двух разных городов.
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,
},
];
В этом примере результат работы функции показывает, что для выбранного маршрута нет рейсов. Однако пользователь должен рассмотреть возможность воспользоваться поездом.
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."
}
}
Примечание.
Для моделей Cohere требуется, чтобы ответы инструмента были допустимым содержимым JSON, отформатированным в виде строки. При создании сообщений типа Tool убедитесь, что ответ является допустимой строкой JSON.
Предложите модели забронировать рейсы с помощью этой функции:
var result = await client.path("/chat/completions").post({
body: {
model: "mistral-large-2407",
messages: messages,
tools: tools,
tool_choice: "auto"
}
});
Вы можете проверить ответ, чтобы узнать, нужно ли вызывать инструмент. Проверьте причину завершения, чтобы определить, следует ли вызывать инструмент. Помните, что можно указать несколько типов инструментов. В этом примере показан инструмент типа 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);
Чтобы продолжить, добавьте это сообщение в журнал чата:
messages.push(response_message);
Теперь пришло время вызвать подходящую функцию, чтобы обработать вызов инструмента. Следующий фрагмент кода выполняет итерацию всех вызовов инструментов, указанных в ответе, и вызывает соответствующую функцию с соответствующими параметрами. Ответ также добавляется в журнал чата.
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
}
);
}
Просмотрите ответ модели:
var result = await client.path("/chat/completions").post({
body: {
messages: messages,
tools: tools,
}
});
Применение безопасности содержимого
API вывода модели ИИ Azure поддерживает безопасность содержимого ИИ Azure. При использовании развертываний с включенной безопасностью содержимого искусственного интеллекта Azure входные и выходные данные проходят через ансамбль моделей классификации, направленных на обнаружение и предотвращение вывода вредного содержимого. Система фильтрации содержимого обнаруживает и принимает меры по определенным категориям потенциально вредного содержимого как в запросах ввода, так и в завершении выходных данных.
В следующем примере показано, как обрабатывать события, когда модель обнаруживает вредное содержимое во входном запросе и включена безопасность содержимого.
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;
}
}
}
Совет
Дополнительные сведения о настройке и управлении параметрами безопасности содержимого ИИ Azure см. в документации по безопасности содержимого ИИ Azure.
Внимание
Элементы, обозначенные в этой статье как (предварительная версия), сейчас предлагаются в общедоступной предварительной версии. Эта предварительная версия предоставляется без соглашения об уровне обслуживания, и мы не рекомендуем ее для рабочих нагрузок. Некоторые функции могут не поддерживаться или их возможности могут быть ограничены. Дополнительные сведения см. в дополнительных условиях использования для предварительных версий Microsoft Azure.
В этой статье объясняется, как использовать API завершения общения с моделями, развернутыми для инференса на платформе ИИ Azure в службах ИИ Azure.
Предварительные условия
Чтобы использовать модели завершения чата в приложении, вам потребуется:
Подписка Azure. Если вы используете модели GitHub, вы можете обновить интерфейс и создать подписку Azure в процессе. Ознакомьтесь, как обновить модели GitHub до выполнения выводов модели на базе Azure AI, если это ваш случай.
Ресурс служб ИИ Azure. Дополнительные сведения см. в статье "Создание ресурса Служб искусственного интеллекта Azure".
URL-адрес конечной точки и ключ.
Добавьте пакет вывода искусственного интеллекта Azure в проект:
<dependency> <groupId>com.azure</groupId> <artifactId>azure-ai-inference</artifactId> <version>1.0.0-beta.4</version> </dependency>
Если вы используете Entra ID, вам также потребуется следующий пакет:
<dependency> <groupId>com.azure</groupId> <artifactId>azure-identity</artifactId> <version>1.15.3</version> </dependency>
Импортируйте следующее пространство имен:
package com.azure.ai.inference.usage; import com.azure.ai.inference.EmbeddingsClient; import com.azure.ai.inference.EmbeddingsClientBuilder; import com.azure.ai.inference.ChatCompletionsClient; import com.azure.ai.inference.ChatCompletionsClientBuilder; import com.azure.ai.inference.models.EmbeddingsResult; import com.azure.ai.inference.models.EmbeddingItem; import com.azure.ai.inference.models.ChatCompletions; import com.azure.core.credential.AzureKeyCredential; import com.azure.core.util.Configuration; import java.util.ArrayList; import java.util.List;
Развертывание модели завершения чата. Если у вас нет модели, прочтите о добавлении и настройке моделей в службы Azure AI, чтобы добавить модель завершения диалога в ваш ресурс.
- В этом примере используется
mistral-large-2407
.
- В этом примере используется
Используйте завершение чата
Сначала создайте клиент для использования модели. В следующем коде используется URL-адрес конечной точки и ключ, хранящиеся в переменных среды.
ChatCompletionsClient client = new ChatCompletionsClientBuilder()
.credential(new AzureKeyCredential("{key}"))
.endpoint("https://<resource>.services.ai.azure.com/models")
.buildClient();
Если вы настроили ресурс с поддержкой идентификатора Microsoft Entra, можно использовать следующий фрагмент кода для создания клиента.
TokenCredential defaultCredential = new DefaultAzureCredentialBuilder().build();
ChatCompletionsClient client = new ChatCompletionsClientBuilder()
.credential(defaultCredential)
.endpoint("https://<resource>.services.ai.azure.com/models")
.buildClient();
Создание запроса на завершение чата
В следующем примере показано, как создать базовый запрос завершения чата в модель.
List<ChatRequestMessage> chatMessages = new ArrayList<>();
chatMessages.add(new ChatRequestSystemMessage("You are a helpful assistant."));
chatMessages.add(new ChatRequestUserMessage("How many languages are in the world?"));
ChatCompletions response = client.complete(new ChatCompletionsOptions(chatMessages));
Примечание.
Некоторые модели не поддерживают системные сообщения (role="system"
). При использовании API вывода модели искусственного интеллекта Azure системные сообщения переводятся в сообщения пользователей, что является наиболее доступной возможностью. Этот перевод предлагается для удобства, но важно убедиться, что модель выполняет инструкции в системном сообщении с правильным уровнем достоверности.
Ответ выглядит следующим образом, где можно просмотреть статистику использования модели:
System.out.printf("Model ID=%s is created at %s.%n", chatCompletions.getId(), chatCompletions.getCreated());
for (ChatChoice choice : chatCompletions.getChoices()) {
ChatResponseMessage message = choice.getMessage();
System.out.printf("Index: %d, Chat Role: %s.%n", choice.getIndex(), message.getRole());
System.out.println("Message:");
System.out.println(message.getContent());
}
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
раздел в ответе, чтобы узнать количество токенов, используемых для запроса, общее количество созданных токенов и количество токенов, использованных в завершении.
Потоковое содержимое
По умолчанию API завершения возвращает все созданное содержимое в одном ответе. Если вы создаете длинные формулировки, ожидание ответа может занять много секунд.
Вы можете транслировать контент, чтобы получать его по мере создания. Потоковая передача содержимого позволяет начать обработку результата по мере его доступности. Этот режим возвращает объект, который потоком передает ответ в виде событий только с данными, отправляемых сервером. Извлеките блоки из дельта-поля, а не поля сообщения.
List<ChatRequestMessage> chatMessages = new ArrayList<>();
chatMessages.add(new ChatRequestSystemMessage("You are a helpful assistant."));
chatMessages.add(new ChatRequestUserMessage("How many languages are in the world?"));
client.completeStream(new ChatCompletionsOptions(chatMessages))
.forEach(chatCompletions -> {
if (CoreUtils.isNullOrEmpty(chatCompletions.getChoices())) {
return;
}
StreamingChatResponseMessageUpdate delta = chatCompletions.getChoice().getDelta();
if (delta.getRole() != null) {
System.out.println("Role = " + delta.getRole());
}
if (delta.getContent() != null) {
String content = delta.getContent();
System.out.print(content);
}
});
Дополнительные параметры, поддерживаемые клиентом вывода
Изучите другие параметры, которые можно указать в клиенте вывода. Полный список всех поддерживаемых параметров и их соответствующей документации см. в справочнике по API вывода модели ИИ Azure. Некоторые модели не поддерживают форматирование выходных данных JSON. Вы всегда можете запрашивать модель для создания выходных данных JSON. Однако такие выходные данные не гарантируют допустимости JSON.
Если вы хотите передать параметр, который отсутствует в списке поддерживаемых параметров, его можно передать в базовую модель с помощью дополнительных параметров. См. Передача дополнительных параметров в модель.
Создание выходных данных JSON
Некоторые модели могут создавать выходные данные JSON. Установите response_format
в json_object
, чтобы включить режим JSON и гарантировать, что создаваемое моделью сообщение является допустимым JSON. Также необходимо инструктировать модель создать JSON самой, используя системное или пользовательское сообщение. Кроме того, содержимое сообщения может быть частично отрезано, если finish_reason="length"
, это указывает на то, что генерация превысила max_tokens
, или что беседа превысила максимальную длину контекста.
Передача дополнительных параметров модели
API вывода модели ИИ Azure позволяет передавать дополнительные параметры модели в модель. В следующем примере кода показано, как передать дополнительный параметр logprobs
модели.
Перед передачей дополнительных параметров в API вывода модели ИИ Azure убедитесь, что ваша модель поддерживает эти дополнительные параметры. Когда запрос выполняется в базовой модели, заголовок extra-parameters
передается модели со значением pass-through
. Это значение указывает конечной точке передавать дополнительные параметры модели. Использование дополнительных параметров с моделью не гарантирует, что модель может эффективно обрабатывать их. Ознакомьтесь с документацией по модели, чтобы понять, какие дополнительные параметры поддерживаются.
Используйте инструменты
Некоторые модели поддерживают использование инструментов, которые могут быть чрезвычайным ресурсом, когда необходимо выгрузить конкретные задачи из языковой модели и вместо этого полагаться на более детерминированную систему или даже другую языковую модель. API вывода модели ИИ Azure позволяет определить средства следующим образом.
В следующем примере кода создается определение средства, которое может искать сведения о полете из двух разных городов.
В этом примере результат работы функции показывает, что для выбранного маршрута нет рейсов. Однако пользователь должен рассмотреть возможность воспользоваться поездом.
Примечание.
Для моделей Cohere требуется, чтобы ответы инструмента были допустимым содержимым JSON, отформатированным в виде строки. При создании сообщений типа Tool убедитесь, что ответ является допустимой строкой JSON.
Предложите модели забронировать рейсы с помощью этой функции:
Вы можете проверить ответ, чтобы узнать, нужно ли вызывать инструмент. Проверьте причину завершения, чтобы определить, следует ли вызывать инструмент. Помните, что можно указать несколько типов инструментов. В этом примере показан инструмент типа function
.
Чтобы продолжить, добавьте это сообщение в журнал чата:
Теперь пришло время вызвать подходящую функцию, чтобы обработать вызов инструмента. Следующий фрагмент кода выполняет итерацию всех вызовов инструментов, указанных в ответе, и вызывает соответствующую функцию с соответствующими параметрами. Ответ также добавляется в журнал чата.
Просмотрите ответ модели:
Применение безопасности содержимого
API вывода модели ИИ Azure поддерживает безопасность содержимого ИИ Azure. При использовании развертываний с включенной безопасностью содержимого искусственного интеллекта Azure входные и выходные данные проходят через ансамбль моделей классификации, направленных на обнаружение и предотвращение вывода вредного содержимого. Система фильтрации содержимого обнаруживает и принимает меры по определенным категориям потенциально вредного содержимого как в запросах ввода, так и в завершении выходных данных.
В следующем примере показано, как обрабатывать события, когда модель обнаруживает вредное содержимое во входном запросе и включена безопасность содержимого.
Совет
Дополнительные сведения о настройке и управлении параметрами безопасности содержимого ИИ Azure см. в документации по безопасности содержимого ИИ Azure.
Внимание
Элементы, обозначенные в этой статье как (предварительная версия), сейчас предлагаются в общедоступной предварительной версии. Эта предварительная версия предоставляется без соглашения об уровне обслуживания, и мы не рекомендуем ее для рабочих нагрузок. Некоторые функции могут не поддерживаться или их возможности могут быть ограничены. Дополнительные сведения см. в дополнительных условиях использования для предварительных версий Microsoft Azure.
В этой статье объясняется, как использовать API завершения общения с моделями, развернутыми для инференса на платформе ИИ Azure в службах ИИ Azure.
Предварительные условия
Чтобы использовать модели завершения чата в приложении, вам потребуется:
Подписка Azure. Если вы используете модели GitHub, вы можете обновить интерфейс и создать подписку Azure в процессе. Ознакомьтесь как обновить модели GitHub до моделей ИИ Azure, если это ваш случай.
Ресурс служб ИИ Azure. Дополнительные сведения см. в статье "Создание ресурса Служб искусственного интеллекта Azure".
URL-адрес конечной точки и ключ.
Установите пакет вывода искусственного интеллекта Azure с помощью следующей команды:
dotnet add package Azure.AI.Inference --prerelease
Если вы используете Entra ID, вам также потребуется следующий пакет:
dotnet add package Azure.Identity
Развертывание модели завершения чата. Если у вас нет одного, ознакомьтесь со сведениями о добавлении и настройке моделей в службы ИИ Azure , чтобы добавить модель завершения чата в ресурс.
- В этом примере используется
mistral-large-2407
.
- В этом примере используется
Используйте завершение чата
Сначала создайте клиент для использования модели. В следующем коде используется URL-адрес конечной точки и ключ, хранящиеся в переменных среды.
ChatCompletionsClient client = new ChatCompletionsClient(
new Uri(Environment.GetEnvironmentVariable("AZURE_INFERENCE_ENDPOINT")),
new AzureKeyCredential(Environment.GetEnvironmentVariable("AZURE_INFERENCE_CREDENTIAL")),
);
Если вы настроили ресурс с поддержкой идентификатора Microsoft Entra, можно использовать следующий фрагмент кода для создания клиента.
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,
);
Создание запроса на завершение чата
В следующем примере показано, как создать базовый запрос завершения чата в модель.
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);
Примечание.
Некоторые модели не поддерживают системные сообщения (role="system"
). При использовании API вывода модели искусственного интеллекта Azure системные сообщения переводятся в сообщения пользователей, что является наиболее доступной возможностью. Этот перевод предлагается для удобства, но важно убедиться, что модель выполняет инструкции в системном сообщении с правильным уровнем достоверности.
Ответ выглядит следующим образом, где можно просмотреть статистику использования модели:
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
раздел в ответе, чтобы узнать количество токенов, используемых для запроса, общее количество созданных токенов и количество токенов, использованных в завершении.
Потоковое содержимое
По умолчанию API завершения возвращает все созданное содержимое в одном ответе. Если вы создаете длинные формулировки, ожидание ответа может занять много секунд.
Вы можете транслировать контент, чтобы получать его по мере создания. Потоковая передача содержимого позволяет начать обработку результата по мере его доступности. Этот режим возвращает объект, который передает ответ в виде серверных событий, содержащих только данные. Извлеките блоки из дельта-поля, а не поля сообщения.
Для потоковой передачи результатов используйте метод CompleteStreamingAsync
при вызове модели. Обратите внимание, что в этом примере вызов упаковывается в асинхронный метод.
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);
}
Чтобы визуализировать выходные данные, определите асинхронный метод для печати потока в консоли.
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);
}
}
}
Вы можете визуализировать, как потоковая передача создает содержимое:
StreamMessageAsync(client).GetAwaiter().GetResult();
Дополнительные параметры, поддерживаемые клиентом вывода
Изучите другие параметры, которые можно указать в клиенте вывода. Полный список всех поддерживаемых параметров и их соответствующей документации см. в справочнике по API вывода модели ИИ 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}");
Некоторые модели не поддерживают форматирование выходных данных JSON. Вы всегда можете запрашивать модель для создания выходных данных JSON. Однако такие выходные данные не гарантируют допустимости JSON.
Если вы хотите передать параметр, который отсутствует в списке поддерживаемых параметров, его можно передать в базовую модель с помощью дополнительных параметров. См. Передача дополнительных параметров в модель.
Создание выходных данных JSON
Некоторые модели могут создавать выходные данные JSON. Установите response_format
в json_object
, чтобы включить режим JSON и гарантировать, что создаваемое моделью сообщение является допустимым JSON. Также необходимо инструктировать модель создать JSON самой, используя системное или пользовательское сообщение. Кроме того, содержимое сообщения может быть частично отрезано, если finish_reason="length"
, это указывает на то, что генерация превысила max_tokens
, или что беседа превысила максимальную длину контекста.
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}");
Передача дополнительных параметров модели
API вывода модели ИИ Azure позволяет передавать дополнительные параметры модели в модель. В следующем примере кода показано, как передать дополнительный параметр logprobs
модели.
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}");
Перед передачей дополнительных параметров в API вывода модели ИИ Azure убедитесь, что ваша модель поддерживает эти дополнительные параметры. Когда запрос выполняется в базовой модели, заголовок extra-parameters
передается модели со значением pass-through
. Это значение указывает конечной точке передавать дополнительные параметры модели. Использование дополнительных параметров с моделью не гарантирует, что модель может эффективно обрабатывать их. Ознакомьтесь с документацией по модели, чтобы понять, какие дополнительные параметры поддерживаются.
Используйте инструменты
Некоторые модели поддерживают использование инструментов, которые могут быть чрезвычайным ресурсом, когда необходимо выгрузить конкретные задачи из языковой модели и вместо этого полагаться на более детерминированную систему или даже другую языковую модель. API вывода модели ИИ Azure позволяет определить средства следующим образом.
В следующем примере кода создается определение средства, которое может искать сведения о полете из двух разных городов.
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);
В этом примере результат работы функции показывает, что для выбранного маршрута нет рейсов. Однако пользователь должен рассмотреть возможность воспользоваться поездом.
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."
});
}
Примечание.
Для моделей Cohere требуется, чтобы ответы инструмента были допустимым содержимым JSON, отформатированным в виде строки. При создании сообщений типа Tool убедитесь, что ответ является допустимой строкой JSON.
Предложите модели забронировать рейсы с помощью этой функции:
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);
Вы можете проверить ответ, чтобы узнать, нужно ли вызывать инструмент. Проверьте причину завершения, чтобы определить, следует ли вызывать инструмент. Помните, что можно указать несколько типов инструментов. В этом примере показан инструмент типа 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}");
Чтобы продолжить, добавьте это сообщение в журнал чата:
requestOptions.Messages.Add(new ChatRequestAssistantMessage(response.Value));
Теперь пришло время вызвать подходящую функцию, чтобы обработать вызов инструмента. Следующий фрагмент кода выполняет итерацию всех вызовов инструментов, указанных в ответе, и вызывает соответствующую функцию с соответствующими параметрами. Ответ также добавляется в журнал чата.
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 a 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");
}
Просмотрите ответ модели:
response = client.Complete(requestOptions);
Применение безопасности содержимого
API вывода модели ИИ Azure поддерживает безопасность содержимого ИИ Azure. При использовании развертываний с включенной безопасностью содержимого искусственного интеллекта Azure входные и выходные данные проходят через ансамбль моделей классификации, направленных на обнаружение и предотвращение вывода вредного содержимого. Система фильтрации содержимого обнаруживает и принимает меры по определенным категориям потенциально вредного содержимого как в запросах ввода, так и в завершении выходных данных.
В следующем примере показано, как обрабатывать события, когда модель обнаруживает вредное содержимое во входном запросе и включена безопасность содержимого.
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;
}
}
Совет
Дополнительные сведения о настройке и управлении параметрами безопасности содержимого ИИ Azure см. в документации по безопасности содержимого ИИ Azure.
Внимание
Элементы, обозначенные в этой статье как (предварительная версия), сейчас предлагаются в общедоступной предварительной версии. Эта предварительная версия предоставляется без соглашения об уровне обслуживания, и мы не рекомендуем ее для рабочих нагрузок. Некоторые функции могут не поддерживаться или их возможности могут быть ограничены. Дополнительные сведения см. в дополнительных условиях использования для предварительных версий Microsoft Azure.
В этой статье объясняется, как использовать API завершения общения с моделями, развернутыми для инференса на платформе ИИ Azure в службах ИИ Azure.
Предварительные условия
Чтобы использовать модели завершения чата в приложении, вам потребуется:
Подписка Azure. Если вы используете модели GitHub, вы можете обновить интерфейс и создать подписку Azure в процессе. Прочитайте о переходе от моделей GitHub к инференсу моделей Azure AI, если это относится к вашему случаю.
Ресурс служб ИИ Azure. Дополнительные сведения см. в статье "Создание ресурса Служб искусственного интеллекта Azure".
URL-адрес конечной точки и ключ.
Развертывание модели завершения чата. Если у вас его нет, прочитайте статью Добавление и настройка моделей в службы ИИ Azure, чтобы добавить модель завершения чата в свой ресурс.
- В этом примере используется
mistral-large-2407
.
- В этом примере используется
Используйте завершение чата
Чтобы использовать API завершения чата, используйте маршрут /chat/completions
, добавленный к базовому URL-адресу, а также учетные данные, указанные в api-key
.
POST https://<resource>.services.ai.azure.com/models/chat/completions?api-version=2024-05-01-preview
Content-Type: application/json
api-key: <key>
Если вы настроили ресурс с поддержкой Microsoft Entra ID, передайте токен в заголовке Authorization
в формате Bearer <token>
. Используйте область https://cognitiveservices.azure.com/.default
.
POST https://<resource>.services.ai.azure.com/models/chat/completions?api-version=2024-05-01-preview
Content-Type: application/json
Authorization: Bearer <token>
Использование идентификатора Microsoft Entra может потребовать дополнительной конфигурации в ресурсе для предоставления доступа. Узнайте, как настроить проверку подлинности без ключей с помощью идентификатора Microsoft Entra.
Создание запроса на завершение чата
В следующем примере показано, как создать базовый запрос завершения чата в модель.
{
"model": "mistral-large-2407",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "How many languages are in the world?"
}
]
}
Примечание.
Некоторые модели не поддерживают системные сообщения (role="system"
). При использовании API вывода модели искусственного интеллекта Azure системные сообщения переводятся в сообщения пользователей, что является наиболее доступной возможностью. Этот перевод предлагается для удобства, но важно убедиться, что модель выполняет инструкции в системном сообщении с правильным уровнем достоверности.
Ответ выглядит следующим образом, где можно просмотреть статистику использования модели:
{
"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
раздел в ответе, чтобы узнать количество токенов, используемых для запроса, общее количество созданных токенов и количество токенов, использованных в завершении.
Потоковое содержимое
По умолчанию API завершения возвращает все созданное содержимое в одном ответе. Если вы создаете длинные формулировки, ожидание ответа может занять много секунд.
Вы можете транслировать контент, чтобы получать его по мере создания. Потоковая передача содержимого позволяет начать обработку результата по мере его доступности. Этот режим возвращает объект, который передает ответ в виде событий, отправляемых сервером исключительно для передачи данных. Извлеките блоки из дельта-поля, а не поля сообщения.
{
"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
}
Вы можете визуализировать, как потоковая передача создает содержимое:
{
"id": "23b54589eba14564ad8a2e6978775a39",
"object": "chat.completion.chunk",
"created": 1718726371,
"model": "mistral-large-2407",
"choices": [
{
"index": 0,
"delta": {
"role": "assistant",
"content": ""
},
"finish_reason": null,
"logprobs": null
}
]
}
Последнее сообщение в потоке имеет установленный finish_reason
, указывающее причину остановки процесса генерации.
{
"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
}
}
Дополнительные параметры, поддерживаемые клиентом вывода
Изучите другие параметры, которые можно указать в клиенте вывода. Полный список всех поддерживаемых параметров и их соответствующей документации см. в справочнике по API вывода модели ИИ 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
}
}
Некоторые модели не поддерживают форматирование выходных данных JSON. Вы всегда можете запрашивать модель для создания выходных данных JSON. Однако такие выходные данные не гарантируют допустимости JSON.
Если вы хотите передать параметр, который отсутствует в списке поддерживаемых параметров, его можно передать в базовую модель с помощью дополнительных параметров. См. Передача дополнительных параметров в модель.
Создание выходных данных JSON
Некоторые модели могут создавать выходные данные JSON. Установите response_format
в json_object
, чтобы включить режим JSON и гарантировать, что создаваемое моделью сообщение является допустимым JSON. Также необходимо инструктировать модель создать JSON самой, используя системное или пользовательское сообщение. Кроме того, содержимое сообщения может быть частично отрезано, если finish_reason="length"
, это указывает на то, что генерация превысила max_tokens
, или что беседа превысила максимальную длину контекста.
{
"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
}
}
Передача дополнительных параметров модели
API вывода модели ИИ Azure позволяет передавать дополнительные параметры модели в модель. В следующем примере кода показано, как передать дополнительный параметр logprobs
модели.
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
}
Перед передачей дополнительных параметров в API вывода модели ИИ Azure убедитесь, что ваша модель поддерживает эти дополнительные параметры. Когда запрос выполняется в базовой модели, заголовок extra-parameters
передается модели со значением pass-through
. Это значение указывает конечной точке передавать дополнительные параметры модели. Использование дополнительных параметров с моделью не гарантирует, что модель может эффективно обрабатывать их. Ознакомьтесь с документацией по модели, чтобы понять, какие дополнительные параметры поддерживаются.
Используйте инструменты
Некоторые модели поддерживают использование инструментов, которые могут быть чрезвычайным ресурсом, когда необходимо выгрузить конкретные задачи из языковой модели и вместо этого полагаться на более детерминированную систему или даже другую языковую модель. API вывода модели ИИ Azure позволяет определить средства следующим образом.
В следующем примере кода создается определение средства, которое может искать сведения о полете из двух разных городов.
{
"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"
]
}
}
}
В этом примере результат работы функции показывает, что для выбранного маршрута нет рейсов. Однако пользователь должен рассмотреть возможность воспользоваться поездом.
Примечание.
Для моделей Cohere требуется, чтобы ответы инструмента были допустимым содержимым JSON, отформатированным в виде строки. При создании сообщений типа Tool убедитесь, что ответ является допустимой строкой JSON.
Предложите модели забронировать рейсы с помощью этой функции:
{
"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"
]
}
}
}
]
}
Вы можете проверить ответ, чтобы узнать, нужно ли вызывать инструмент. Проверьте причину завершения, чтобы определить, следует ли вызывать инструмент. Помните, что можно указать несколько типов инструментов. В этом примере показан инструмент типа 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
}
}
Чтобы продолжить, добавьте это сообщение в журнал чата:
Теперь пришло время вызвать подходящую функцию, чтобы обработать вызов инструмента. Следующий фрагмент кода выполняет итерацию всех вызовов инструментов, указанных в ответе, и вызывает соответствующую функцию с соответствующими параметрами. Ответ также добавляется в журнал чата.
Просмотрите ответ модели:
{
"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"]
}
}
}
]
}
Применение безопасности содержимого
API вывода модели ИИ Azure поддерживает безопасность содержимого ИИ Azure. При использовании развертываний с включенной безопасностью содержимого искусственного интеллекта Azure входные и выходные данные проходят через ансамбль моделей классификации, направленных на обнаружение и предотвращение вывода вредного содержимого. Система фильтрации содержимого обнаруживает и принимает меры по определенным категориям потенциально вредного содержимого как в запросах ввода, так и в завершении выходных данных.
В следующем примере показано, как обрабатывать события, когда модель обнаруживает вредное содержимое во входном запросе и включена безопасность содержимого.
{
"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
}
}
Совет
Дополнительные сведения о настройке и управлении параметрами безопасности содержимого ИИ Azure см. в документации по безопасности содержимого ИИ Azure.