你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
如何使用 Azure AI 模型推理生成聊天补全
重要
本文中标记了“(预览版)”的项目目前为公共预览版。 此预览版未提供服务级别协议,不建议将其用于生产工作负载。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 Microsoft Azure 预览版补充使用条款。
本文介绍如何在 Azure AI 服务中将聊天补全 API 与部署到 Azure AI 模型推理的模型配合使用。
先决条件
若要在应用程序中使用聊天补全模型,需要:
Azure 订阅。 如果你正在使用 GitHub 模型,则可以升级体验并在此过程中创建 Azure 订阅。 如果是这种情况,请阅读从 GitHub 模型升级到 Azure AI 模型推理。
Azure AI 服务资源。 有关详细信息,请参阅创建 Azure AI 服务资源。
终结点 URL 和密钥。
聊天补全模型部署。 如果没有,请参阅添加并将模型配置为 Azure AI 服务,以便向资源添加聊天补全模型。
请使用以下命令安装适用于 Python 的 Azure AI 推理包:
pip install -U azure-ai-inference
使用聊天补全
首先,创建客户端以使用模型。 以下代码使用存储在环境变量中的终结点 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 ID 支持,则可以使用以下代码片段创建客户端。
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"
)。 使用 Azure AI 模型推理 API 时,系统消息将翻译成用户消息,这是最接近的可用功能。 提供此翻译是为了方便,但请务必验证模型是否遵循系统消息中的说明并具有正确置信度。
响应如下所示,可从中查看模型的使用统计信息:
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)
浏览推理客户端支持的更多参数
浏览可以在推理客户端中指定的其他参数。 有关所有受支持的参数及其相应文档的完整列表,请参阅 Azure AI 模型推理 API 参考。
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
,或者对话超过了最大上下文长度。
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() }
)
将额外参数传递给模型
Azure AI 模型推理 API 允许将额外参数传递给模型。 以下代码示例演示如何将额外参数 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
}
)
将额外参数传递给 Azure AI 模型推理 API 之前,请确保模型支持这些额外参数。 向基础模型发出请求时,标头 extra-parameters
将传递给具有值 pass-through
的模型。 此值告知终结点将额外参数传递给模型。 在模型中使用额外参数并不能保证模型能够实际处理它们。 请阅读模型的文档以了解哪些额外参数受支持。
使用工具
某些模型支持使用工具,当你需要从语言模型中卸载特定任务,转而依赖于更具确定性的系统甚至是不同的语言模型时,这些工具可能是非常出色的资源。 Azure AI 模型推理 API 允许通过以下方式定义工具。
以下代码示例创建了一个工具定义,可查找两个不同城市的航班信息。
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]
在此示例中,函数的输出是所选路线没有可用的航班,但用户应考虑进行训练。
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 内容。 构造工具类型的消息时,请确保响应是有效的 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,
)
应用内容安全
Azure AI 模型推理 API 支持 Azure AI 内容安全。 在启用 Azure AI 内容安全的情况下使用部署时,输入和输出会经过一系列分类模型,旨在检测和防止输出有害内容。 内容筛选系统会在输入提示和输出补全中检测特定类别的潜在有害内容并对其采取措施。
以下示例展示了当模型在输入提示中检测到有害内容且内容安全已启用时如何处理事件。
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 AI 内容安全设置,请查看 Azure AI 内容安全文档。
使用包含图像的聊天补全
某些模型可以跨文本和图像进行推理,并根据这两种输入生成文本补全。 在本部分中,你将以聊天的方式探索一些用于视觉的模型的功能:
重要
模型中的每个回合仅支持一个图像,并且只有最后一个图像保留在上下文中。 如果添加多个图像,则会导致错误。
若要查看此功能,请下载图像并将信息编码为 base64
字符串。 生成的数据应位于数据 URL 内:
from urllib.request import urlopen, Request
import base64
image_url = "https://news.microsoft.com/source/wp-content/uploads/2024/04/The-Phi-3-small-language-models-with-big-potential-1-1900x1069.jpg"
image_format = "jpeg"
request = Request(image_url, headers={"User-Agent": "Mozilla/5.0"})
image_data = base64.b64encode(urlopen(request).read()).decode("utf-8")
data_url = f"data:image/{image_format};base64,{image_data}"
可视化图像:
import requests
import IPython.display as Disp
Disp.Image(requests.get(image_url).content)
现在,创建包含图像的聊天补全请求:
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,
)
响应如下所示,可从中查看模型的使用统计信息:
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
重要
本文中标记了“(预览版)”的项目目前为公共预览版。 此预览版未提供服务级别协议,不建议将其用于生产工作负载。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 Microsoft Azure 预览版补充使用条款。
本文介绍如何在 Azure AI 服务中将聊天补全 API 与部署到 Azure AI 模型推理的模型配合使用。
先决条件
若要在应用程序中使用聊天补全模型,需要:
Azure 订阅。 如果你正在使用 GitHub 模型,则可以升级体验并在此过程中创建 Azure 订阅。 如果是这种情况,请阅读从 GitHub 模型升级到 Azure AI 模型推理。
Azure AI 服务资源。 有关详细信息,请参阅创建 Azure AI 服务资源。
终结点 URL 和密钥。
聊天补全模型部署。 如果没有,请参阅添加并将模型配置为 Azure AI 服务,以便向资源添加聊天补全模型。
使用以下命令安装适用于 JavaScript 的 Azure 推理库:
npm install @azure-rest/ai-inference
使用聊天补全
首先,创建客户端以使用模型。 以下代码使用存储在环境变量中的终结点 URL 和密钥。
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)
);
如果将资源配置为具有 Microsoft Entra ID 支持,则可以使用以下代码片段创建客户端。
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()
);
创建聊天补全请求
以下示例演示如何创建对模型的基本聊天补全请求。
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,
}
});
注意
某些模型不支持系统消息 (role="system"
)。 使用 Azure AI 模型推理 API 时,系统消息将翻译成用户消息,这是最接近的可用功能。 提供此翻译是为了方便,但请务必验证模型是否遵循系统消息中的说明并具有正确置信度。
响应如下所示,可从中查看模型的使用统计信息:
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: {
messages: messages,
}
}).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) {
console.log(choice.delta?.content ?? "");
}
}
浏览推理客户端支持的更多参数
浏览可以在推理客户端中指定的其他参数。 有关所有受支持的参数及其相应文档的完整列表,请参阅 Azure AI 模型推理 API 参考。
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" },
}
});
某些模型不支持 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: {
messages: messages,
response_format: { type: "json_object" }
}
});
将额外参数传递给模型
Azure AI 模型推理 API 允许将额外参数传递给模型。 以下代码示例演示如何将额外参数 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: {
messages: messages,
logprobs: true
}
});
将额外参数传递给 Azure AI 模型推理 API 之前,请确保模型支持这些额外参数。 向基础模型发出请求时,标头 extra-parameters
将传递给具有值 pass-through
的模型。 此值告知终结点将额外参数传递给模型。 在模型中使用额外参数并不能保证模型能够实际处理它们。 请阅读模型的文档以了解哪些额外参数受支持。
使用工具
某些模型支持使用工具,当你需要从语言模型中卸载特定任务,转而依赖于更具确定性的系统甚至是不同的语言模型时,这些工具可能是非常出色的资源。 Azure AI 模型推理 API 允许通过以下方式定义工具。
以下代码示例创建了一个工具定义,可查找两个不同城市的航班信息。
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 内容。 构造工具类型的消息时,请确保响应是有效的 JSON 字符串。
在此函数的帮助下提示模型预订航班:
var result = await client.path("/chat/completions").post({
body: {
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,
}
});
应用内容安全
Azure AI 模型推理 API 支持 Azure AI 内容安全。 在启用 Azure AI 内容安全的情况下使用部署时,输入和输出会经过一系列分类模型,旨在检测和防止输出有害内容。 内容筛选系统会在输入提示和输出补全中检测特定类别的潜在有害内容并对其采取措施。
以下示例展示了当模型在输入提示中检测到有害内容且内容安全已启用时如何处理事件。
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 AI 内容安全设置,请查看 Azure AI 内容安全文档。
使用包含图像的聊天补全
某些模型可以跨文本和图像进行推理,并根据这两种输入生成文本补全。 在本部分中,你将以聊天的方式探索一些用于视觉的模型的功能:
重要
模型中的每个回合仅支持一个图像,并且只有最后一个图像保留在上下文中。 如果添加多个图像,则会导致错误。
若要查看此功能,请下载图像并将信息编码为 base64
字符串。 生成的数据应位于数据 URL 内:
const image_url = "https://news.microsoft.com/source/wp-content/uploads/2024/04/The-Phi-3-small-language-models-with-big-potential-1-1900x1069.jpg";
const image_format = "jpeg";
const response = await fetch(image_url, { headers: { "User-Agent": "Mozilla/5.0" } });
const image_data = await response.arrayBuffer();
const image_data_base64 = Buffer.from(image_data).toString("base64");
const data_url = `data:image/${image_format};base64,${image_data_base64}`;
可视化图像:
const img = document.createElement("img");
img.src = data_url;
document.body.appendChild(img);
现在,创建包含图像的聊天补全请求:
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,
}
});
响应如下所示,可从中查看模型的使用统计信息:
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
重要
本文中标记了“(预览版)”的项目目前为公共预览版。 此预览版未提供服务级别协议,不建议将其用于生产工作负载。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 Microsoft Azure 预览版补充使用条款。
本文介绍如何在 Azure AI 服务中将聊天补全 API 与部署到 Azure AI 模型推理的模型配合使用。
先决条件
若要在应用程序中使用聊天补全模型,需要:
Azure 订阅。 如果你正在使用 GitHub 模型,则可以升级体验并在此过程中创建 Azure 订阅。 如果是这种情况,请阅读从 GitHub 模型升级到 Azure AI 模型推理。
Azure AI 服务资源。 有关详细信息,请参阅创建 Azure AI 服务资源。
终结点 URL 和密钥。
聊天补全模型部署。 如果没有,请参阅添加并将模型配置为 Azure AI 服务,以便向资源添加聊天补全模型。
将 Azure AI 推理包添加到项目:
<dependency> <groupId>com.azure</groupId> <artifactId>azure-ai-inference</artifactId> <version>1.0.0-beta.1</version> </dependency>
如果使用 Entra ID,则还需要以下包:
<dependency> <groupId>com.azure</groupId> <artifactId>azure-identity</artifactId> <version>1.13.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.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;
使用聊天补全
首先,创建客户端以使用模型。 以下代码使用存储在环境变量中的终结点 URL 和密钥。
如果将资源配置为具有 Microsoft Entra ID 支持,则可以使用以下代码片段创建客户端。
创建聊天补全请求
以下示例演示如何创建对模型的基本聊天补全请求。
注意
某些模型不支持系统消息 (role="system"
)。 使用 Azure AI 模型推理 API 时,系统消息将翻译成用户消息,这是最接近的可用功能。 提供此翻译是为了方便,但请务必验证模型是否遵循系统消息中的说明并具有正确置信度。
响应如下所示,可从中查看模型的使用统计信息:
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 会在单个响应中返回整个生成的内容。 如果要生成长补全内容,等待响应可能需要几秒钟时间。
可以流式传输内容,以在生成内容时获取它。 通过流式处理内容,可以在内容可用时开始处理补全。 此模式返回一个对象,该对象将响应作为仅数据服务器发送的事件进行流式传输。 从增量字段(而不是消息字段)中提取区块。
可以直观显示流式处理如何生成内容:
浏览推理客户端支持的更多参数
浏览可以在推理客户端中指定的其他参数。 有关所有受支持的参数及其相应文档的完整列表,请参阅 Azure AI 模型推理 API 参考。 某些模型不支持 JSON 输出格式。 你始终可以提示模型生成 JSON 输出。 但是,这样的输出不能保证是有效的 JSON。
如果要传递未包含在受支持参数列表中的参数,可以使用额外参数将其传递给基础模型。 请参阅将额外参数传递给模型。
创建 JSON 输出
某些模型可以创建 JSON 输出。 将 response_format
设置为 json_object
可启用 JSON 模式,这可以保证模型生成的消息是有效的 JSON。 还必须使用系统或用户消息指示模型自己生成 JSON。 此外,如果使用 finish_reason="length"
,则消息内容可能会部分截断,这表示生成超过了 max_tokens
,或者对话超过了最大上下文长度。
将额外参数传递给模型
Azure AI 模型推理 API 允许将额外参数传递给模型。 以下代码示例演示如何将额外参数 logprobs
传递给模型。
将额外参数传递给 Azure AI 模型推理 API 之前,请确保模型支持这些额外参数。 向基础模型发出请求时,标头 extra-parameters
将传递给具有值 pass-through
的模型。 此值告知终结点将额外参数传递给模型。 在模型中使用额外参数并不能保证模型能够实际处理它们。 请阅读模型的文档以了解哪些额外参数受支持。
使用工具
某些模型支持使用工具,当你需要从语言模型中卸载特定任务,转而依赖于更具确定性的系统甚至是不同的语言模型时,这些工具可能是非常出色的资源。 Azure AI 模型推理 API 允许通过以下方式定义工具。
以下代码示例创建了一个工具定义,可查找两个不同城市的航班信息。
在此示例中,函数的输出是所选路线没有可用的航班,但用户应考虑进行训练。
注意
Cohere 模型要求工具的响应是格式为字符串的有效 JSON 内容。 构造工具类型的消息时,请确保响应是有效的 JSON 字符串。
在此函数的帮助下提示模型预订航班:
可以检查响应,以确定是否需要调用工具。 检查完成原因以确定是否应调用该工具。 请记住,可以指示多个工具类型。 此示例演示 function
类型的工具。
若要继续,请将此消息附加到聊天历史记录中:
现在,需要调用相应的函数来处理工具调用。 以下代码片段迭代响应中指示的所有工具调用,并使用相应的参数来调用相应的函数。 响应也会附加到聊天历史记录中。
查看模型的响应:
应用内容安全
Azure AI 模型推理 API 支持 Azure AI 内容安全。 在启用 Azure AI 内容安全的情况下使用部署时,输入和输出会经过一系列分类模型,旨在检测和防止输出有害内容。 内容筛选系统会在输入提示和输出补全中检测特定类别的潜在有害内容并对其采取措施。
以下示例展示了当模型在输入提示中检测到有害内容且内容安全已启用时如何处理事件。
提示
若要详细了解如何配置和控制 Azure AI 内容安全设置,请查看 Azure AI 内容安全文档。
使用包含图像的聊天补全
某些模型可以跨文本和图像进行推理,并根据这两种输入生成文本补全。 在本部分中,你将以聊天的方式探索一些用于视觉的模型的功能:
重要
模型中的每个回合仅支持一个图像,并且只有最后一个图像保留在上下文中。 如果添加多个图像,则会导致错误。
若要查看此功能,请下载图像并将信息编码为 base64
字符串。 生成的数据应位于数据 URL 内:
可视化图像:
现在,创建包含图像的聊天补全请求:
响应如下所示,可从中查看模型的使用统计信息:
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
重要
本文中标记了“(预览版)”的项目目前为公共预览版。 此预览版未提供服务级别协议,不建议将其用于生产工作负载。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 Microsoft Azure 预览版补充使用条款。
本文介绍如何在 Azure AI 服务中将聊天补全 API 与部署到 Azure AI 模型推理的模型配合使用。
先决条件
若要在应用程序中使用聊天补全模型,需要:
Azure 订阅。 如果你正在使用 GitHub 模型,则可以升级体验并在此过程中创建 Azure 订阅。 如果是这种情况,请阅读从 GitHub 模型升级到 Azure AI 模型推理。
Azure AI 服务资源。 有关详细信息,请参阅创建 Azure AI 服务资源。
终结点 URL 和密钥。
聊天补全模型部署。 如果没有,请参阅添加并将模型配置为 Azure AI 服务,以便向资源添加聊天补全模型。
请使用以下命令安装 Azure AI 推理包:
dotnet add package Azure.AI.Inference --prerelease
如果使用 Entra ID,则还需要以下包:
dotnet add package Azure.Identity
使用聊天补全
首先,创建客户端以使用模型。 以下代码使用存储在环境变量中的终结点 URL 和密钥。
ChatCompletionsClient client = new ChatCompletionsClient(
new Uri(Environment.GetEnvironmentVariable("AZURE_INFERENCE_ENDPOINT")),
new AzureKeyCredential(Environment.GetEnvironmentVariable("AZURE_INFERENCE_CREDENTIAL")),
);
如果将资源配置为具有 Microsoft Entra ID 支持,则可以使用以下代码片段创建客户端。
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"
)。 使用 Azure AI 模型推理 API 时,系统消息将翻译成用户消息,这是最接近的可用功能。 提供此翻译是为了方便,但请务必验证模型是否遵循系统消息中的说明并具有正确置信度。
响应如下所示,可从中查看模型的使用统计信息:
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();
浏览推理客户端支持的更多参数
浏览可以在推理客户端中指定的其他参数。 有关所有受支持的参数及其相应文档的完整列表,请参阅 Azure AI 模型推理 API 参考。
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}");
将额外参数传递给模型
Azure AI 模型推理 API 允许将额外参数传递给模型。 以下代码示例演示如何将额外参数 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}");
将额外参数传递给 Azure AI 模型推理 API 之前,请确保模型支持这些额外参数。 向基础模型发出请求时,标头 extra-parameters
将传递给具有值 pass-through
的模型。 此值告知终结点将额外参数传递给模型。 在模型中使用额外参数并不能保证模型能够实际处理它们。 请阅读模型的文档以了解哪些额外参数受支持。
使用工具
某些模型支持使用工具,当你需要从语言模型中卸载特定任务,转而依赖于更具确定性的系统甚至是不同的语言模型时,这些工具可能是非常出色的资源。 Azure AI 模型推理 API 允许通过以下方式定义工具。
以下代码示例创建了一个工具定义,可查找两个不同城市的航班信息。
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 内容。 构造工具类型的消息时,请确保响应是有效的 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 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");
}
查看模型的响应:
response = client.Complete(requestOptions);
应用内容安全
Azure AI 模型推理 API 支持 Azure AI 内容安全。 在启用 Azure AI 内容安全的情况下使用部署时,输入和输出会经过一系列分类模型,旨在检测和防止输出有害内容。 内容筛选系统会在输入提示和输出补全中检测特定类别的潜在有害内容并对其采取措施。
以下示例展示了当模型在输入提示中检测到有害内容且内容安全已启用时如何处理事件。
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 AI 内容安全设置,请查看 Azure AI 内容安全文档。
使用包含图像的聊天补全
某些模型可以跨文本和图像进行推理,并根据这两种输入生成文本补全。 在本部分中,你将以聊天的方式探索一些用于视觉的模型的功能:
重要
模型中的每个回合仅支持一个图像,并且只有最后一个图像保留在上下文中。 如果添加多个图像,则会导致错误。
若要查看此功能,请下载图像并将信息编码为 base64
字符串。 生成的数据应位于数据 URL 内:
string imageUrl = "https://news.microsoft.com/source/wp-content/uploads/2024/04/The-Phi-3-small-language-models-with-big-potential-1-1900x1069.jpg";
string imageFormat = "jpeg";
HttpClient httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0");
byte[] imageBytes = httpClient.GetByteArrayAsync(imageUrl).Result;
string imageBase64 = Convert.ToBase64String(imageBytes);
string dataUrl = $"data:image/{imageFormat};base64,{imageBase64}";
可视化图像:
现在,创建包含图像的聊天补全请求:
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);
响应如下所示,可从中查看模型的使用统计信息:
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
重要
本文中标记了“(预览版)”的项目目前为公共预览版。 此预览版未提供服务级别协议,不建议将其用于生产工作负载。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 Microsoft Azure 预览版补充使用条款。
本文介绍如何在 Azure AI 服务中将聊天补全 API 与部署到 Azure AI 模型推理的模型配合使用。
先决条件
若要在应用程序中使用聊天补全模型,需要:
Azure 订阅。 如果你正在使用 GitHub 模型,则可以升级体验并在此过程中创建 Azure 订阅。 如果是这种情况,请阅读从 GitHub 模型升级到 Azure AI 模型推理。
Azure AI 服务资源。 有关详细信息,请参阅创建 Azure AI 服务资源。
终结点 URL 和密钥。
- 聊天补全模型部署。 如果没有,请参阅添加并将模型配置为 Azure AI 服务,以便向资源添加聊天补全模型。
使用聊天补全
若要使用文本嵌入,请使用追加到基 URL 的路由 /chat/completions
以及 api-key
中指示的凭据。
Bearer <key>
格式也支持 Authorization
标头。
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
标头中传递令牌:
POST https://<resource>.services.ai.azure.com/models/chat/completions?api-version=2024-05-01-preview
Content-Type: application/json
Authorization: Bearer <token>
创建聊天补全请求
以下示例演示如何创建对模型的基本聊天补全请求。
{
"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"
)。 使用 Azure AI 模型推理 API 时,系统消息将翻译成用户消息,这是最接近的可用功能。 提供此翻译是为了方便,但请务必验证模型是否遵循系统消息中的说明并具有正确置信度。
响应如下所示,可从中查看模型的使用统计信息:
{
"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
}
}
浏览推理客户端支持的更多参数
浏览可以在推理客户端中指定的其他参数。 有关所有受支持的参数及其相应文档的完整列表,请参阅 Azure AI 模型推理 API 参考。
{
"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
}
}
将额外参数传递给模型
Azure AI 模型推理 API 允许将额外参数传递给模型。 以下代码示例演示如何将额外参数 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
}
将额外参数传递给 Azure AI 模型推理 API 之前,请确保模型支持这些额外参数。 向基础模型发出请求时,标头 extra-parameters
将传递给具有值 pass-through
的模型。 此值告知终结点将额外参数传递给模型。 在模型中使用额外参数并不能保证模型能够实际处理它们。 请阅读模型的文档以了解哪些额外参数受支持。
使用工具
某些模型支持使用工具,当你需要从语言模型中卸载特定任务,转而依赖于更具确定性的系统甚至是不同的语言模型时,这些工具可能是非常出色的资源。 Azure AI 模型推理 API 允许通过以下方式定义工具。
以下代码示例创建了一个工具定义,可查找两个不同城市的航班信息。
{
"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 内容。 构造工具类型的消息时,请确保响应是有效的 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"]
}
}
}
]
}
应用内容安全
Azure AI 模型推理 API 支持 Azure AI 内容安全。 在启用 Azure AI 内容安全的情况下使用部署时,输入和输出会经过一系列分类模型,旨在检测和防止输出有害内容。 内容筛选系统会在输入提示和输出补全中检测特定类别的潜在有害内容并对其采取措施。
以下示例展示了当模型在输入提示中检测到有害内容且内容安全已启用时如何处理事件。
{
"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 AI 内容安全设置,请查看 Azure AI 内容安全文档。
使用包含图像的聊天补全
某些模型可以跨文本和图像进行推理,并根据这两种输入生成文本补全。 在本部分中,你将以聊天的方式探索一些用于视觉的模型的功能:
重要
模型中的每个回合仅支持一个图像,并且只有最后一个图像保留在上下文中。 如果添加多个图像,则会导致错误。
若要查看此功能,请下载图像并将信息编码为 base64
字符串。 生成的数据应位于数据 URL 内:
提示
需要使用脚本或编程语言构造数据 URL。 本教程使用 JPEG 格式的示例图像。 数据 URL 的格式如下:data:image/jpg;base64,0xABCDFGHIJKLMNOPQRSTUVWXYZ...
。
可视化图像:
现在,创建包含图像的聊天补全请求:
{
"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
}
响应如下所示,可从中查看模型的使用统计信息:
{
"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
}
}