【AI】从头到脚详解如何创建部署Azure Web App的OpenAI项目
在Azure Web应用上,您可以使用Python的OpenAI包方便快捷地调用官方API,上传您的训练数据,并利用他们的算法进行处理。本教程提供了一个逐步指南,帮助您在Azure Web应用上部署您的OpenAI项目,涵盖了从资源设置到解决常见问题的所有内容。
推荐超级课程:
@TOC
OpenAI简介
OpenAI是一家领先的人工智能研究和部署公司,成立于2015年12月。其使命是确保通用人工智能(AGI)——在大多数经济价值工作中超越人类的高度自主系统——造福全人类。OpenAI专注于开发安全且可扩展的人工智能技术,并确保这些创新得到公平的获取。
OpenAI以其在自然语言处理领域的突破性进展而闻名,开发了如GPT(生成预训练转换器)等模型,这些模型为文本生成、总结、翻译等应用提供支持。GPT模型已经彻底改变了对话式AI、创意写作和编程辅助等领域。OpenAI还发布了如Codex等模型,旨在理解和生成计算机代码,以及DALL·E,它可以根据文本描述创建图像。
OpenAI采用独特的混合结构:一家由非营利实体管理的营利性公司,以平衡人工智能技术的发展与伦理考虑。该组织强调安全性、研究透明度和与人类价值观的一致性。通过API提供对其模型的访问,并促进合作伙伴关系,OpenAI使开发人员、企业和研究人员能够利用AI在各个行业中提供创新解决方案。其长期目标是确保人工智能的进步造福全人类。
系统架构
架构
架构图
开发环境
操作系统 | 版本 | Python版本 |
---|---|---|
Ubuntu | Ubuntu 18.04 Bionic Beaver | 3.7.3 |
Azure资源
服务 | SKU |
---|---|
应用服务计划 | Premium Plan 0 V3 |
应用服务 | Linux (Python 3.9, Version 3.9.19) |
存储账户 | General Purpose V2 |
文件共享 | 无备份计划 |
本教程重点
本教程将引导您完成以下阶段:
- 设置Azure资源
- 本地运行项目
- 将项目发布到Azure
- 在Azure上运行应用程序
- 解决常见问题
设置Azure资源
文件和目录结构
请打开bash终端并输入以下命令:
git clone https://github.com/theringe/azure-appservice-ai.git
cd azure-appservice-ai
bash ./openai/tools/add-venv.sh
如果您使用的是Windows平台,请使用以下替代PowerShell命令:
git clone https://github.com/theringe/azure-appservice-ai.git
cd azure-appservice-ai
.\openai\tools\add-venv.cmd
执行完成后,您应该看到以下目录结构:
文件和路径 | 目的 |
---|---|
openai/tools/add-venv.* | 在上一步中执行的脚本(Windows为cmd,Linux/Mac为sh),用于创建本教程所需的所有Python虚拟环境。 |
.venv/openai-webjob/ | 用于训练模型(即计算嵌入向量)的专用虚拟环境。 |
[openai/webjob/requirements.txt] | openai-webjob虚拟环境所需的包(及其确切版本)列表。 |
.venv/openai/ | 用于Flask应用程序的专用虚拟环境,启用API端点访问以查询预测(即建议)。 |
[openai/requirements.txt] | openai虚拟环境所需的包(及其确切版本)列表。 |
openai// | 本教程的主文件夹。 |
[openai/tools/arm-template.json] | 设置与本教程相关的所有Azure资源的ARM模板,包括应用服务计划、Web应用和存储账户。 |
openai/tools/create-folder.* | 在文件共享中创建本教程所需的所有目录(包括train、model和test)的脚本。 |
openai/tools/download-sample-training-set.* | 从[News-Headlines-Dataset-For-Sarcasm-Detection]下载示例训练集的脚本,该集包含来自TheOnion和HuffPost的头条数据,并将其放入文件共享的train目录中。 |
[openai/webjob/cal_embeddings.py] | 用于从头条中计算嵌入向量的脚本。它加载训练集,在OpenAI API上应用转换,并将嵌入向量保存在文件共享的model目录中。 |
[openai/App_Data/jobs/triggered/cal-embeddings/cal_embeddings.sh] | Azure App Service Web作业的shell脚本。它激活openai-webjob虚拟环境并启动cal_embeddings.py脚本。 |
[openai/api/app.py] | Flask应用程序的代码,包括路由、端口配置、输入解析、向量加载、预测和输出生成。 |
[openai/start.sh] | 部署后执行的脚本(在ARM模板启动命令中介绍)。它设置虚拟环境并启动Flask应用程序以处理Web请求。 |
ARM模板
我们需要创建以下资源或服务:
— | — | — |
手动创建所需 | 资源/服务 | |
应用服务计划 | 否 | 资源(计划) |
应用服务 | 是 | 资源(应用) |
存储账户 | 是 | 资源(存储账户) |
文件共享 | 是 | 服务 |
让我们看一下[openai/tools/arm-template.json]文件。请参考配置部分以了解所有资源。
由于大多数配置值不需要更改,我将它们放在ARM模板的变量部分,而不是参数部分。这有助于保持配置的简单性。然而,我仍想简要解释一些更关键的设置。
如您所见,我采用了camelCase命名约定,将\[资源类型\]
与
\[设置名称和层次结构\]相结合。这使得更容易理解每个设置将用于何处。图中的配置按资源名称排序,但以下列表按功能分类,以便更清晰地理解。
配置名称 | 值 | 目的 |
---|---|---|
storageAccountFileShareName | data-and-model | \[目的1:将文件共享链接到Web应用\] 使用此固定名称作为文件共享 |
storageAccountFileShareShareQuota | 5120 | \[目的1:将文件共享链接到Web应用\] 该值以GB为单位 |
storageAccountFileShareEnabledProtocols | SMB | \[目的1:将文件共享链接到Web应用\] |
appSiteConfigAzureStorageAccountsType | AzureFiles | \[目的1:将文件共享链接到Web应用\] |
appSiteConfigAzureStorageAccountsProtocol | Smb | \[目的1:将文件共享链接到Web应用\] |
planKind | linux | \[目的2:指定平台和堆栈运行时\] 选择Linux(如果选择Python堆栈,则为默认值) |
planSkuTier | Premium0V3 | \[目的2:指定平台和堆栈运行时\] 至少选择Premium计划以确保您的AI工作负载有足够的内存 |
planSkuName | P0v3 | \[目的2:指定平台和堆栈运行时\] 与上相同 |
appKind | app,linux | \[目的2:指定平台和堆栈运行时\] 与上相同 |
appSiteConfigLinuxFxVersion | PYTHON | 3.9 |
appSiteConfigAppSettingsWEBSITES_CONTAINER_START_TIME_LIMIT | 600 | \[目的3:部署\] 该值以秒为单位,确保启动命令可以在默认超时时间230秒之后继续执行。本教程的启动命令通常需要大约300秒,因此将其设置为600秒提供了一个安全边际,并适应了未来项目的扩展(例如,添加更多包) |
appSiteConfigAppCommandLine | \[ -f /home/site/wwwroot/start.sh \] && bash /home/site/wwwroot/start.sh | |
appSiteConfigAppSettingsSCM_DO_BUILD_DURING_DEPLOYMENT | false | \[目的3:部署\] 由于我们已经在start.sh中定义了处理不同虚拟环境的方法,因此不需要启动Web应用的默认构建过程 |
appSiteConfigAppSettingsWEBSITES_ENABLE_APP_SERVICE_STORAGE | true | \[目的4:Web作业\] 此设置是必需的,以启用App Service存储功能,这对于使用Web作业(例如,用于模型训练)是必要的 |
storageAccountPropertiesAllowSharedKeyAccess | true | \[目的5:故障排除\] 此设置默认启用。强调它的原因是因为某些企业IT策略可能在一段时间后强制更改此配置,可能导致一系列问题。有关更多详细信息,请参阅下面的故障排除部分。 |
返回bash终端并执行以下命令(它们的目的已在前面描述)。
# 请将<ResourceGroupName>更改为您喜欢的名称,例如:azure-appservice-ai
# 请将<RegionName>更改为您喜欢的区域,例如:eastus2
# 请将<ResourcesPrefixName>更改为您喜欢的命名模式,例如:openai-arm(它将创建openai-arm-asp作为应用服务计划,openai-arm-app用于Web应用,openaiarmsa用于存储账户)
az group create --name <ResourceGroupName> --location <RegionName>
az deployment group create --resource-group <ResourceGroupName> --template-file ./openai/tools/arm-template.json --parameters resourcePrefix=<ResourcesPrefixName>
如果您使用的是Windows平台,请使用以下替代PowerShell命令:
# 请将<ResourceGroupName>更改为您喜欢的名称,例如:azure-appservice-ai
# 请将<RegionName>更改为您喜欢的区域,例如:eastus2
# 请将<ResourcesPrefixName>更改为您喜欢的命名模式,例如:openai-arm(它将创建openai-arm-asp作为应用服务计划,openai-arm-app用于Web应用,openaiarmsa用于存储账户)
az group create --name <ResourceGroupName> --location <RegionName>
az deployment group create --resource-group <ResourceGroupName> --template-file .\openai\tools\arm-template.json --parameters resourcePrefix=<ResourcesPrefixName>
执行后,请从结果中复制包含3个键值对的输出部分,如下所示。
返回bash终端并执行以下命令:
# 请设置您在上一步中获得的3个变量
OUTPUT_STORAGE_NAME="<outputStorageName>"
OUTPUT_STORAGE_KEY="<outputStorageKey>"
OUTPUT_SHARE_NAME="<outputShareName>"
sudo mkdir -p /mnt/$OUTPUT_SHARE_NAME
if [ ! -d "/etc/smbcredentials" ]; then
sudo mkdir /etc/smbcredentials
fi
CREDENTIALS_FILE="/etc/smbcredentials/$OUTPUT_STORAGE_NAME.cred"
if [ ! -f "$CREDENTIALS_FILE" ]; then
sudo bash -c "echo "username=$OUTPUT_STORAGE_NAME" >> $CREDENTIALS_FILE"
sudo bash -c "echo "password=$OUTPUT_STORAGE_KEY" >> $CREDENTIALS_FILE"
fi
sudo chmod 600 $CREDENTIALS_FILE
sudo bash-c "echo '//$OUTPUT_STORAGE_NAME.file.core.windows.net/$OUTPUT_SHARE_NAME /mnt/$OUTPUT_SHARE_NAME cifs nofail,credentials=$CREDENTIALS_FILE,dir_mode=0777,file_mode=0777,serverino,nosharesock,actimeo=30' >> /etc/fstab"
sudo mount -t cifs //$OUTPUT_STORAGE_NAME.file.core.windows.net/$OUTPUT_SHARE_NAME /mnt/$OUTPUT_SHARE_NAME -o credentials=$CREDENTIALS_FILE,dir_mode=0777,file_mode=0777,serverino,nosharesock,actimeo=30
或者,您可以简单地转到Azure门户,导航到您刚刚创建的文件共享,并参考下面的图示来复制所需的命令。如果您在开发环境中使用Windows或Mac操作系统,可以选择Windows或Mac。
执行命令后,网络驱动器将成功挂载。您可以使用df命令进行验证,如图所示。
从Azure门户使用ARM模板
除了使用az cli调用ARM模板之外,如果JSON文件托管在公共网络URL上,您还可以按照文章
\[[Deploy to Azure button - Azure Resource Manager](https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/deploy-to-azure-button)\]中描述的方法,直接将配置加载到Azure门户中。
填写所有必要信息后,点击创建。
创建过程完成后,点击左侧菜单中的“输出”以检索文件共享的连接信息。
本地运行
训练模型和训练数据
在接下来的步骤中,您将需要使用OpenAI服务。请确保您已注册为成员并向您的账户添加了积分(OpenAI API的计费概述
)。对于本示例,添加10美元的积分将足够。此外,您还需要生成一个新的API密钥(OpenAI API的API密钥
),您可以根据需要选择创建一个项目,以便将来组织项目(OpenAI API的项目
)。
获取API密钥后,在openai/tools/文件夹中创建一个名为apikey.txt的文本文件。将您刚刚复制的密钥粘贴到文件中并保存。
返回bash终端并执行以下命令(它们的目的已在前面描述)。
source .venv/openai-webjob/bin/activate
bash ./openai/tools/create-folder.sh
bash ./openai/tools/download-sample-training-set.sh
python ./openai/webjob/cal_embeddings.py --sampling_ratio 0.002
如果您使用的是Windows平台,请使用以下替代PowerShell命令:
.\.venv\openai-webjob\Scripts\Activate.ps1
.\openai\tools\create-folder.cmd
.\openai\tools\download-sample-training-set.cmd
python .\openai\webjob\cal_embeddings.py --sampling_ratio 0.002
执行后,文件共享现在将包含以下目录和文件。
让我们来检查从GitHub下载的训练数据结构。
图的右侧解释了数据的每个字段。这个数据集最初用于检测新闻标题是否包含讽刺。然而,我将其用于另一个应用程序。在这个示例中,我将使用“headline”字段来创建嵌入。
图的左侧显示了原始数据,其中每行都是一个包含必要字段的独立JSON字符串。
在代码中,我首先从每条记录中提取“headline”字段,并将其发送到OpenAI以计算文本的嵌入向量。这个嵌入代表了文本在语义空间中的位置(类似于多维空间中的坐标)。计算完成后,我为每个标题获得了一个嵌入向量。在接下来的教程中,我将简单地称这些为嵌入。
顺便说一句,命令中的sampling_ratio参数是我配置的,以加快训练过程。原始数据集包含近30,000条记录,这将导致大约8小时的训练时间。为了简化教程,您可以指定一个相对较低的sampling_ratio值(范围从0到1,代表从原始记录中采样0%到100%)。例如,值为0.01对应于1%的样本,这将允许您加速实验。
在这个语义空间中,彼此更接近的向量通常具有相似的值,这对应于相似的意义。在这种情况下,向量之间的距离将作为我们评估文本片段之间语义相似性的度量。为此,我们将使用一种称为余弦相似性的方法。
在随后的教程中,我们将构建一些测试文本。这些测试文本也将使用相同的方法转换为嵌入。然后,每个测试嵌入将与之前计算的标题嵌入进行比较。比较将在多维向量空间中识别最近的标题嵌入,并返回其原始文本。
此外,我们将利用OpenAI众所周知的生成式AI能力来提供一个文本解释。这个解释将描述为什么构建的测试文本与推荐的标题相关。
使用模型进行预测
返回终端并执行以下命令。首先,停用用于计算嵌入的虚拟环境,然后激活用于Flask应用程序的虚拟环境,最后启动Flask应用程序。
Linux或Mac的命令:
deactivate
source .venv/openai/bin/activate
python ./openai/api/app.py
Windows的命令:
deactivate
.\.venv\openai\Scripts\Activate.ps1
python .\openai\api\app.py
当您看到类似于以下屏幕的内容时,意味着服务器已成功启动。如果需要,按Ctrl+C停止服务器。
在进行实际测试之前,让我们构建一些示例查询数据:
education
接下来,打开一个终端并使用以下curl命令向应用程序发送请求:
curl -X GET http://127.0.0.1:8000/api/detect?text=education
您应该看到计算结果,确认嵌入和生成式AI按预期工作。
注意:由于您的训练数据集采样与我的不同,您的结果可能与我的不同。此外,OpenAI的生成内容可能会根据时间和上下文产生不同的输出。请记住这一点。
将项目发布到Azure
返回终端并执行以下命令。
Linux或Mac的命令:
# 请将<resourcegroup_name>和<webapp_name>更改为您自己的
# 从项目创建Zip文件
zip -r openai/app.zip openai/*
# 部署应用程序
az webapp deploy --resource-group <resourcegroup_name> --name <webapp_name> --src-path openai/app.zip --type zip
# 删除Zip文件
rm openai/app.zip
Windows的命令:
# 请将<resourcegroup_name>和<webapp_name>更改为您自己的
# 从项目创建Zip文件
Compress-Archive -Path openai\* -DestinationPath openai\app.zip
# 部署应用程序
az webapp deploy --resource-group <resourcegroup_name> --name <webapp_name> --src-path openai\app.zip --type zip
# 删除Zip文件
del openai\app.zip
注意:WebJobs遵循App_Data/jobs/triggered/<webjob_name>/的目录结构。因此,一旦Web应用程序部署,WebJob将自动与之一起部署,无需额外配置。
在Azure Web应用上运行
训练模型
返回终端并执行以下命令以调用WebJobs。
Linux或Mac的命令:
# 请将<subscription_id>、<resourcegroup_name> 和 <webapp_name> 更改为您自己的
token=$(az account get-access-token --resource https://management.azure.com --query accessToken -o tsv) ;
curl -X POST -H "Authorization: Bearer $token" -H "Content-Type: application/json" -d '{}' "https://management.azure.com/subscriptions/<subscription_id>/resourceGroups/<resourcegroup_name>/providers/Microsoft.Web/sites/<webapp_name>/triggeredwebjobs/cal-embeddings/run?api-version=2024-04-01"
Windows的命令:
# 请将<subscription_id>、<resourcegroup_name> 和 <webapp_name> 更改为您自己的
$token=$(az account get-access-token --resource https://management.azure.com --query accessToken -o tsv) ;
Invoke-RestMethod -Uri "https://management.azure.com/subscriptions/<subscription_id>/resourceGroups/<resourcegroup_name>/providers/Microsoft.Web/sites/<webapp_name>/triggeredwebjobs/cal-embeddings/run?api-version=2024-04-01" -Headers @{Authorization = "Bearer $token"; "Content-type" = "application/json"} -Method POST -Body '{}'
您可以通过执行以下命令来查看训练状态。
Linux或Mac的命令:
# 请将<subscription_id>、<resourcegroup_name> 和 <webapp_name> 更改为您自己的
token=$(az account get-access-token --resource https://management.azure.com --query accessToken -o tsv) ;
response=$(curl -s -H "Authorization: Bearer $token" "https://management.azure.com/subscriptions/<subscription_id>/resourceGroups/<resourcegroup_name>/providers/Microsoft.Web/sites/<webapp_name>/webjobs?api-version=2024-04-01") ;
echo "$response" | jq
Windows的命令:
# 请将<subscription_id>、<resourcegroup_name> 和 <webapp_name> 更改为您自己的
$token=$(az account get-access-token --resource https://management.azure.com --query accessToken -o tsv) ;
$response = Invoke-RestMethod -Uri "https://management.azure.com/subscriptions/<subscription_id>/resourceGroups/<resourcegroup_name>/providers/Microsoft.Web/sites/<webapp_name>/webjobs?api-version=2024-04-01" -Headers @{Authorization = "Bearer $token"} -Method GET ;
$response | ConvertTo-Json -Depth 10
— | — |
处理中 | 完成 |
您可以通过执行以下命令来获取最新的详细日志。
Linux或Mac的命令:
# 请将<subscription_id>、<resourcegroup_name> 和 <webapp_name> 更改为您自己的
token=$(az account get-access-token --resource https://management.azure.com --query accessToken -o tsv) ;
history_id=$(az webapp webjob triggered log --resource-group <resourcegroup_name> --name <webapp_name> --webjob-name cal-embeddings --query "[0].id" -o tsv | sed 's|.*/history/||') ;
response=$(curl -X GET -H "Authorization: Bearer $token" -H "Content-Type: application/json" "https://management.azure.com/subscriptions/<subscription_id>/resourceGroups/<resourcegroup_name>/providers/Microsoft.Web/sites/<webapp_name>/triggeredwebjobs/cal-embeddings/history/$history_id/?api-version=2024-04-01") ;
log_url=$(echo "$response" | jq -r '.properties.output_url') ;
curl -X GET -H "Authorization: Bearer $token" "$log_url"
Windows的命令:
# 请将<subscription_id>、<resourcegroup_name> 和 <webapp_name> 更改为您自己的
$token = az account get-access-token --resource https://management.azure.com --query accessToken -o tsv ;
$history_id = az webapp webjob triggered log --resource-group <resourcegroup_name> --name <webapp_name> --webjob-name cal-embeddings --query "[0].id" -o tsv | ForEach-Object { ($_ -split "/history/")[-1] } ;
$response = Invoke-RestMethod -Uri "https://management.azure.com/subscriptions/<subscription_id>/resourceGroups/<resourcegroup_name>/providers/Microsoft.Web/sites/<webapp_name>/triggeredwebjobs/cal-embeddings/history/$history_id/?api-version=2024-04-01" -Headers @{ Authorization = "Bearer $token" } -Method GET ;
$log_url = $response.properties.output_url ;
Invoke-RestMethod -Uri $log_url -Headers @{ Authorization = "Bearer $token" } -Method GET
一旦您在日志中看到报告,这意味着嵌入计算已完成,Flask应用程序已准备好进行预测。
您还可以在本地环境中挂载的文件共享中找到新计算的嵌入。
使用模型进行预测
就像在本地测试中一样,打开一个bash终端并使用以下curl命令向应用程序发送请求:
# 请将<webapp_name>更改为您自己的
curl -X GET https://<webapp_name>.azurewebsites.net/api/detect?text=education
与本地环境一样,您应该看到预期的结果。
故障排除
启动命令问题
症状:没有任何代码更改,并且应用程序之前运行正常,更新启动命令后,应用程序停止工作。
相关的default_docker.log显示在短时间内多次尝试运行容器而没有错误,但容器没有在端口8000上响应,如docker.log所示。原因:由于Linux Web应用程序实际上在容器中运行,启动命令中的最终命令必须类似于Dockerfile中的CMD指令。
CMD ["/usr/sbin/sshd", "-D", "-o", "ListenAddress=0.0.0.0"]
该命令必须确保在前台运行(即不是守护进程模式),并且除非手动中断,否则不能退出进程。
解决方法:检查启动命令中的最终命令,确保它不包括守护进程执行模式。或者,使用Web SSH界面直接执行和验证这些命令。
应用程序在一段时间后无响应
症状:一个正常运行的应用程序在一段时间后变得无响应。前端网页和Kudu页面都显示“应用程序错误”,部署日志显示“请求过多”。此外,本地环境无法连接到关联的文件共享。
原因:点击初始错误屏幕上的“诊断资源”可以提供更详细的错误信息。
在此示例中,问题是由内部企业策略或自动化(例如企业应用程序)定期或随机扫描员工创建的存储账户设置引起的。如果设置被认为不符合安全标准,它们将自动调整。
例如,allowSharedKeyAccess参数可能被强制设置为false,阻止Web应用程序和本地开发环境连接到存储账户下的文件共享。可以通过存储账户的活动日志检查此类设置的修改历史记录(请注意,仅保留最后90天的数据)。解决方法:正确的方法是与企业IT团队协调并请求必要的权限。
作为临时解决方案,在测试期间修改受影响的设置以启用,之后将其恢复为禁用。您可以在以下位置找到allowSharedKeyAccess设置。
注意:Azure存储挂载目前不支持通过托管身份访问。
Linux WebJobs的az cli命令失败
症状:从不同平台(即使在Azure CloudShell中使用最新版本的az)收到“操作返回无效状态’未授权’”的消息。
原因:使用“–debug –verbose”从命令中,我可以看到实际发生的错误在哪个REST API上,例如,我使用这个命令(az webapp webjob triggered ):
az webapp webjob triggered list --resource-group azure-appservice-ai --name openai-arm-app --debug --verbose
这表示该操作是在此API下调用的:
/Microsoft.Web/sites/{app_name}/triggeredwebjobs (Web Apps - List Triggered Web Jobs
)
之后,我直接从官方文档测试该API,仍然收到这样的错误,这意味着这个预览功能仍在建设中,我们目前无法使用它。
解决方法:我通过Azure门户找到了一个相关的API端点:
/Microsoft.Web/sites/{app_name}/webjobs (Web Apps - List Web Jobs )
之后,我直接从官方文档测试该API,现在可以获取触发器列表。
因此,我将原始命令:az webapp webjob triggered list --resource-group azure-appservice-ai --name openai-arm-app
修改为以下命令(请注意Linux/Mac和Windows命令之间的差异)。
确保将<subscription_id>、<resourcegroup_name>和<webapp_name>替换为您自己的值。
Linux或Mac的命令:token=$(az account get-access-token --resource https://management.azure.com --query accessToken -o tsv) ; response=$(curl -s -H "Authorization: Bearer $token" "https://management.azure.com/subscriptions/<subscription_id>/resourceGroups/<resourcegroup_name>/providers/Microsoft.Web/sites/<webapp_name>/webjobs?api-version=2024-04-01") ; echo "$response" | jq
Windows的命令:
$token=$(az account get-access-token --resource https://management.azure.com --query accessToken -o tsv) ; $response = Invoke-RestMethod -Uri "https://management.azure.com/subscriptions/<subscription_id>/resourceGroups/<resourcegroup_name>/providers/Microsoft.Web/sites/<webapp_name>/webjobs?api-version=2024-04-01" -Headers @{Authorization = "Bearer $token"} -Method GET ; $response | ConvertTo-Json -Depth 10
对于“run”命令,由于调用有问题的API时存在相同的问题,因此我也修改了操作。
Linux或Mac的命令:token=$(az account get-access-token --resource https://management.azure.com --query accessToken -o tsv) ; curl -X POST -H "Authorization: Bearer $token" -H "Content-Type: application/json" -d '{}' "https://management.azure.com/subscriptions/<subscription_id>/resourceGroups/<resourcegroup_name>/providers/Microsoft.Web/sites/<webapp_name>/triggeredwebjobs/cal-embeddings/run?api-version=2024-04-01"
Windows的命令:
$token=$(az account get-access-token --resource https://management.azure.com --query accessToken -o tsv) ; Invoke-RestMethod -Uri "https://management.azure.com/subscriptions/029b4739-1f55-4cab-bf84-a9393f8ac8fe/resourceGroups/azure-appservice-ai/providers/Microsoft.Web/sites/openai-arm-app/triggeredwebjobs/cal-embeddings/run?api-version=2024-04-01" -Headers @{Authorization = "Bearer $token"; "Content-type" = "application/json"} -Method POST -Body '{}'
最后
除了简单的嵌入向量计算之外,OpenAI最显著的优势是生成式AI。您可以通过自然语言(作为提示)向GPT模型提供指令,清楚地指定您需要的格式。然后,您可以轻松地解析返回的内容。虽然PaaS产品不适合进行繁重的向量计算,但它们非常适合作为中介将命令转发给生成式AI。这些输出甚至可以用于各种应用程序,如专利侵权检测、研究论文中的抄袭检测或趋势新闻分析。