使用MCP进行人工智能搜索——基础设施
该项目为Azure AI搜索解决方案提供基础设施,该解决方案现在包括一个具有GPT-4o部署的Azure AI Foundry(Azure OpenAI)帐户。这些模板是用二头肌编写的,旨在与Azure Developer CLI一起部署(azd).
建筑🏗️
部署在单个资源组中创建以下资源:
- 具有系统分配标识的Azure AI搜索服务。
- 用于摄取搜索内容的存储帐户和私有blob容器。
- 部署脚本使用的用户分配的托管标识。
- 具有GPT-4o部署的Azure AI Foundry(Azure OpenAI)帐户。
- 具有GPT-4o和Ada嵌入部署的Azure AI Foundry(Azure OpenAI)帐户。
- 角色分配,授予Azure AI搜索服务身份贡献者访问OpenAI资源以进行Entra ID推断的权限。
- 允许搜索服务读取blob的角色分配和管理搜索服务的部署脚本。
部署
azd auth login
azd up您可以在运行之前通过设置环境变量来覆盖默认值 azd up例如:
$env:AZURE_ENV_NAME = "mysandbox"
$env:AZURE_LOCATION = "eastus"
$env:AZURE_OPENAI_MODEL_NAME = "gpt-4o"
$env:AZURE_OPENAI_MODEL_VERSION = "2024-11-20"
$env:AZURE_OPENAI_DEPLOYMENT_CAPACITY = "10"
$env:AZURE_OPENAI_EMBEDDINGS_MODEL_NAME = "text-embedding-ada-002"
$env:AZURE_OPENAI_EMBEDDINGS_MODEL_VERSION = "2"
$env:AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT_CAPACITY = "10"
azd upazd 自动将环境变量映射到 AZURE_ 二头肌参数的前缀。
二头肌参数
| 参数 | 说明 | 默认值 |
|---|---|---|
openAiModelName | 部署到Azure AI Foundry的模型标识符。 | gpt-4o |
openAiModelVersion | 要部署的特定模型版本。 | 2024-11-20 |
openAiDeploymentCapacity | 分配给GPT-4o部署的吞吐量单位。 | 10 |
openAiEmbeddingsModelName | 嵌入部署到Azure AI Foundry的模型标识符。 | text-embedding-ada-002 |
openAiEmbeddingsModelVersion | 要部署的特定嵌入模型版本。 | 2 |
openAiEmbeddingsDeploymentCapacity | 分配给嵌入部署的吞吐量单位。 | 10 |
其他参数,如 environmentName, location,以及 resourceGroupName 继续由 azd.
输出
在部署之后, azd 显示以下输出以进行集成:
OPENAI_ACCOUNT_ENDPOINTOPENAI_DEPLOYMENT_NAMEOPENAI_EMBEDDINGS_DEPLOYMENT_NAMESEARCH_SERVICE_ENDPOINTSTORAGE_ACCOUNT_BLOB_ENDPOINT
在使用AI搜索和GPT-4o功能的应用程序配置或自动化步骤中使用这些值。
角色分配
模板会自动授予Azure AI搜索服务的系统分配的托管身份 认知服务OpenAI贡献者 Azure OpenAI帐户上的角色。从Azure AI Search基于Entra ID访问GPT-4o和嵌入部署都需要此权限。如果需要访问其他工作负载,请分配适当的Azure OpenAI角色(例如, 认知服务OpenAI用户)在OpenAI帐户范围内将其托管身份转换为其他身份。
认证
MCP服务器在其HTTP传输端点上支持Azure AD(Microsoft Entra ID)承载令牌身份验证。身份验证是可选的,并通过环境变量进行控制。
身份验证优先级
服务器按以下顺序评估身份验证配置:
- Azure AD(RS256 JWKS) --何时
AZURE_AD_REQUIRE_AUTH=true - 对称密钥(HS256) --何时
MCP_AUTH_SECRET已设置 - 无身份验证 --当两者均未配置时(仅限本地开发)
环境变量
| 变量 | 必填 | 默认 | 描述 |
|---|---|---|---|
AZURE_AD_REQUIRE_AUTH | 没有 | false | 设置为 true 启用Azure AD令牌验证 |
AZURE_AD_TENANT_ID | 启用身份验证时 | -- | Azure AD租户ID |
AZURE_AD_CLIENT_ID | 启用身份验证时 | -- | MCP服务器的应用程序注册客户端ID(应用程序ID) |
CLOUD_NAME | 否 | -- | 设置为 AzureUSGovernment Azure政府;省略商业云 |
MCP_AUTH_SECRET | 没有 | -- | HS256 JWT身份验证的共享密钥(回退) |
MCP_AUTH_ISSUER | 没有 | mcp-issuer | HS256身份验证的预期JWT颁发者 |
MCP_AUTH_AUDIENCE | 没有 | azure-ai-search-mcp | HS256身份验证的预期JWT受众 |
Azure AD应用程序注册设置
- 注册MCP服务器应用程序 在Azure AD中:
- Azure 门户→ Azure Active Directory→ 应用程序注册→ 新注册 - 姓名: mcp-azure-ai-search (或您喜欢的名字) - 支持的帐户类型:单租户 - 无需重定向URI(仅限服务器)
- 公开API:
- 应用程序注册→ 您的应用程序→ 公开API - 设置应用程序ID URI: api:// - 添加作用域: api:///.default
- 授予调用应用程序权限:
- 调用后端的应用程序注册需要API权限→ 添加权限→ 我的API→ 选择MCP服务器应用程序→ 选择 .default 范围 - 授予管理员同意
- 配置部署环境:
AZURE_AD_REQUIRE_AUTH=true
AZURE_AD_TENANT_ID=
AZURE_AD_CLIENT_ID=
CLOUD_NAME=AzureUSGovernment # omit for commercial cloud验证身份
启用Azure AD身份验证后,服务器将在启动时记录:
INFO: Azure AD auth enabled – issuer=https://login.microsoftonline.us//v2.0, audience=api://没有有效的请求 Authorization: Bearer 标头接收HTTP 401。
手动验证 az rest
如果您需要在外部验证索引、技能集或索引器定义 azd 部署时,存储库包括准备发送的有效载荷(index-test.json, skillset-test.json,以及 indexer-test.json).更新占位符值(例如OpenAI资源URI),并从PowerShell运行以下命令:
$resourceGroup = ""
$searchServiceName = ""
$searchEndpoint = "https://$searchServiceName.search.windows.net"
$apiVersion = "2024-09-01-preview"
$indexName = "avcoe-demo-ai-search-mcp-index-and-vectorize"
$skillsetName = "avcoe-demo-ai-search-mcp-index-and-vectorize-skillset"
$indexerName = "avcoe-demo-ai-search-mcp-index-and-vectorize-indexer"
$indexPayloadPath = "$(Resolve-Path ./index-test.json)"
$skillsetPayloadPath = "$(Resolve-Path ./skillset-test.json)"
$indexerPayloadPath = "$(Resolve-Path ./indexer-test.json)"
$adminKey = az search admin-key show `
--resource-group $resourceGroup `
--service-name $searchServiceName `
--query primaryKey -o tsv
az rest --method put `
--uri "$searchEndpoint/indexes('$indexName')" `
--headers "Content-Type=application/json" "api-key=$adminKey" `
--url-parameters "api-version=$apiVersion" `
--body @$indexPayloadPath `
--skip-authorization-header
az rest --method put `
--uri "$searchEndpoint/skillsets/$skillsetName" `
--headers "Content-Type=application/json" "api-key=$adminKey" `
--url-parameters "api-version=$apiVersion" `
--body @$skillsetPayloadPath `
--skip-authorization-header
az rest --method put `
--uri "$searchEndpoint/indexers('$indexerName')" `
--headers "Content-Type=application/json" "api-key=$adminKey" `
--url-parameters "api-version=$apiVersion" `
--body @$indexerPayloadPath `
--skip-authorization-header手动调用有助于快速解决API架构问题,并反映Bicep模块使用的部署脚本逻辑。
