本文属于【Azure 架构师学习笔记】系列。
本文属于【Azure AI】系列。
前言
作为云环境的使用者,不了解AI是不可接受的, 但是正如大数据这么多年都没有被正式定义一样,AI更加如此,所以我不打算铺开太多,我计划使用25篇左右的文章覆盖一下最近从0 开始入门AI 的经历。
首先第一篇Azure AI 的概述,关于Azure AI或者microsoft AI, 先要了解其生态系统, 从下图可以看到包含了非常多的服务,绝大部分是基于Azure的。

但是由于太过复杂,不便于入门,所以精简出下面三大部分:

服务全景图(2024年最新版)
| 服务类别 | 服务名称 | 核心定位 | 适用场景 | 定价层 |
|---|---|---|---|---|
| 认知服务 | 计算机视觉 | 图像分析、对象检测 | 电商商品识别、医疗影像分析 | F0 (免费) |
| 语言服务 | 文本分析、情感分析 | 客户反馈分析、内容审核 | F0 (免费) | |
| 语音服务 | 语音转文本、文本转语音 | 会议记录、语音助手 | F0 (免费) | |
| 搜索服务 | 智能搜索、语义检索 | 电商搜索、文档知识库 | S1 (基础) | |
| AI平台 | Azure Machine Learning | 端到端ML开发平台 | 自定义模型训练、部署 | F0 (免费) |
| Azure OpenAI | GPT-4、DALL-E等生成式AI | 智能对话、内容生成 | 按用量付费 | |
| 行业解决方案 | Healthcare | 医疗影像分析、电子病历 | 医院诊断辅助 | 定制化 |
| Retail | 客户行为分析、库存优化 | 零售智能门店 | 定制化 | |
| AI工具 | Azure AI Studio | 低代码AI应用构建 | 业务人员快速开发AI应用 | F0 (免费) |
| Azure AI Foundry | 企业级AI模型开发 | 金融风控、工业预测 | 企业级 |
Azure AI核心差异化优势:
✅ 全栈AI体验:从认知服务到OpenAI到ML平台,提供端到端体验
✅ 企业级集成:无缝集成Microsoft 365、Azure AD、Power BI
✅ 生成式AI领导力:OpenAI战略合作伙伴,直接访问GPT-4
✅ 成本优势:免费层(F0)覆盖基础使用,避免意外费用
环境准备
为了避免过于理论化,这里先搭建好环境以便后续演示。接下来我将使用Terraform 进行部署。
可以使用下面的powershell以管理员身份创建terraform的凭证,我们将借用service principal来进行资源的创建。
powershell
$sp = az ad sp create-for-rbac --name "terraform-ai-ecosystem" --role "Contributor" --scopes "/subscriptions/$(az account show --query id -o tsv)" | ConvertFrom-Json
# 保存凭据 (请安全存储)
Write-Host "Client ID: $($sp.appId)"
Write-Host "Client Secret: $($sp.password)"
Write-Host "Tenant ID: $($sp.tenant)"
Write-Host "Subscription ID: $(az account show --query id -o tsv)"
接下来创建terraform所需的文件及结构,如下:
azure-ai-ecosystem/
├── main.tf # 主配置文件,定义核心资源
├── variables.tf # 变量定义
├── outputs.tf # 输出定义
├── providers.tf # 提供者配置
├── terraform.tfvars # 变量值
└── README.md # 项目说明

下面是各个文件的具体内容:
powershell
# providers.tf
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.0"
}
random = {
source = "hashicorp/random"
version = "~> 3.0" # 明确指定random提供者
}
}
required_version = ">= 1.0"
}
provider "azurerm" {
features {
# 启用所有预览功能
resource_group {
prevent_deletion_if_contains_resources = false
}
}
# 从变量读取认证信息
client_id = var.client_id
client_secret = var.client_secret
tenant_id = var.tenant_id
subscription_id = var.subscription_id
}
powershell
# variables.tf
variable "client_id" {
description = "Azure Service Principal Client ID"
type = string
sensitive = true
}
variable "client_secret" {
description = "Azure Service Principal Client Secret"
type = string
sensitive = true
}
variable "tenant_id" {
description = "Azure Tenant ID"
type = string
}
variable "subscription_id" {
description = "Azure Subscription ID"
type = string
}
variable "resource_group_name" {
description = "Resource group name"
type = string
default = "rg-ai-ecosystem-lab"
}
variable "location" {
description = "Azure region"
type = string
default = "eastus"
}
variable "environment" {
description = "Environment tag"
type = string
default = "lab"
}
powershell
# main.tf
# 随机字符串生成器,用于创建唯一资源名称
resource "random_string" "suffix" {
length = 6
special = false
upper = false
numeric = true # 修复:将已弃用的"number"改为"numeric"
}
# 创建资源组
resource "azurerm_resource_group" "ai_lab" {
name = var.resource_group_name
location = var.location
tags = {
environment = var.environment
purpose = "ai-ecosystem-learning"
}
}
# 1. 计算机视觉服务
resource "azurerm_cognitive_account" "computer_vision" {
name = "cv-ecosystem-demo-${random_string.suffix.result}"
location = azurerm_resource_group.ai_lab.location
resource_group_name = azurerm_resource_group.ai_lab.name
kind = "ComputerVision"
sku_name = "F0" # 免费层,适合学习
}
# 2. 语言服务 (包含文本分析)
resource "azurerm_cognitive_account" "language_service" {
name = "lang-ecosystem-demo-${random_string.suffix.result}"
location = azurerm_resource_group.ai_lab.location
resource_group_name = azurerm_resource_group.ai_lab.name
kind = "TextAnalytics"
sku_name = "F0" # 免费层,适合学习
}
# 支持资源 - Application Insights (用于ML工作区)
resource "azurerm_application_insights" "app_insights" {
name = "ai-ecosystem-insights-${random_string.suffix.result}"
location = azurerm_resource_group.ai_lab.location
resource_group_name = azurerm_resource_group.ai_lab.name
application_type = "web"
}
# 支持资源 - Key Vault (用于ML工作区)
resource "azurerm_key_vault" "key_vault" {
name = "kv-ecosystem-${random_string.suffix.result}"
location = azurerm_resource_group.ai_lab.location
resource_group_name = azurerm_resource_group.ai_lab.name
tenant_id = var.tenant_id
sku_name = "standard"
purge_protection_enabled = false
access_policy {
tenant_id = var.tenant_id
object_id = data.azurerm_client_config.current.object_id
key_permissions = [
"Get", "List", "Create", "Delete"
]
secret_permissions = [
"Get", "List", "Set", "Delete"
]
}
}
# 支持资源 - Storage Account (用于ML工作区)
resource "azurerm_storage_account" "storage" {
name = "staiecosystem${random_string.suffix.result}"
location = azurerm_resource_group.ai_lab.location
resource_group_name = azurerm_resource_group.ai_lab.name
account_tier = "Standard"
account_replication_type = "LRS"
}
# 3. Azure 机器学习工作区
resource "azurerm_machine_learning_workspace" "ml_workspace" {
name = "ml-ecosystem-workspace"
location = azurerm_resource_group.ai_lab.location
resource_group_name = azurerm_resource_group.ai_lab.name
application_insights_id = azurerm_application_insights.app_insights.id
key_vault_id = azurerm_key_vault.key_vault.id
storage_account_id = azurerm_storage_account.storage.id
identity {
type = "SystemAssigned"
}
tags = {
environment = var.environment
}
}
# 4. Azure Cognitive Search
resource "azurerm_search_service" "search_service" {
name = "search-ecosystem-demo-${random_string.suffix.result}"
resource_group_name = azurerm_resource_group.ai_lab.name
location = azurerm_resource_group.ai_lab.location
sku = "free" # 免费层,适合学习
}
# 获取当前客户端配置
data "azurerm_client_config" "current" {}
powershell
# outputs.tf
output "resource_group_name" {
value = azurerm_resource_group.ai_lab.name
}
output "computer_vision_endpoint" {
value = azurerm_cognitive_account.computer_vision.endpoint
}
output "language_service_endpoint" {
value = azurerm_cognitive_account.language_service.endpoint
}
output "ml_workspace_name" {
value = azurerm_machine_learning_workspace.ml_workspace.name
}
output "search_service_endpoint" {
value = "https://${azurerm_search_service.search_service.name}.search.windows.net"
}
output "random_suffix" {
value = random_string.suffix.result
sensitive = false
}
powershell
# terraform.tfvars
client_id = "XXXXXXXXXXXXXXXXXXXXXX" # 这里可以填入最开始创建SP 时返回的信息。
client_secret = "XXXXXXXXXXXXXXXXXXXXXX" # 这里可以填入最开始创建SP 时返回的信息
tenant_id = "XXXXXXXXXXXXXXXXXXXXXX" # 这里可以填入最开始创建SP 时返回的信息
subscription_id = "XXXXXXXXXXXXXXXXXXXXXX" # 这里可以填入最开始创建SP 时返回的信息
然后在powershell中按顺序执行:
powershell
# 1. 重新初始化
terraform init
# 2. 规划部署
terraform plan -compact-warnings -out=tfplan
# 3. 如果规划成功,应用变更
terraform apply tfplan
# 查看所有输出
terraform output
# 保存输出到文件以便后续使用
terraform output -json > deployment_outputs.json
有时候因为网络原因可能会失败,重试一下可能就成功了。

在命令执行成功后可以在新建的资源组里面看到所需的资源创建成功。
小结
至此我们的环境已经初步搭建成功,接下来将开始进行"Azure机器学习工作区架构" 的介绍。