你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure Functions 是一种无服务器计算服务,可用于使用代码生成的自定义工具扩展 Foundry 代理服务代理。 当你需要代理与企业中的系统集成时,此方法特别有用。
Functions 提供了多个托管计划。 弹性消耗计划非常适合托管自定义工具,因为它提供:
- 支持缩放到零无服务器托管,基于消耗量定价。
- 对 Azure 中资源的基于标识的访问,包括虚拟网络中的资源。
- 通过 输入/输出绑定进行声明性数据源连接。
何时使用 Azure Functions 与函数调用
虽然 函数调用 允许你定义使用代理代码进行进程内运行的工具,但在需要时,在 Azure Functions 上托管自定义工具可提供其他企业功能:
- 关注点分离:将业务逻辑与代理代码隔离,从而启用独立的开发、测试和部署周期。
- 集中管理:创建多个代理、应用程序或团队可以一致使用的可重用工具。
- 安全隔离:分别控制代理对工具和企业资源的访问。 此方法允许你仅分配代理所需的特定权限来调用该工具,而无需提供对基础数据库、API 或网络的直接访问。
- 外部依赖项:利用非Microsoft库、特定运行时环境或旧版系统集成。
- 复杂作:处理多步骤工作流和数据转换,或卸载计算密集型作。
- 异步处理:使用重试功能和消息可靠性处理执行长时间运行的操作。
集成选项
Foundry 代理服务为代理提供了两种访问 Azure Functions 托管工具的主要方法:
| 功能 / 特点 | 模型上下文协议 (MCP) 服务器 | 基于 Azure 队列存储的工具 |
|---|---|---|
| 工作原理 | 代理使用 MCP 协议连接到 Azure 中的函数应用。 函数应用本身充当自定义 MCP 服务器,将单个函数公开为工具。 自定义 MCP 服务器从代理项目中抽象化托管和公开工具的复杂性,并提升代码的可重用性。 | 代理通过队列存储在 Azure 中的函数应用中与工具代码通信,方法是将消息放置在队列中,这会触发工具代码执行。 函数应用侦听输入队列,异步处理消息,并返回对第二个队列的响应。 |
| 何时使用它? | ✔ 最适合利用行业标准协议进行代理工具集成。 ✔ 提供实时同步的交互,并且即时响应。 |
✔ 最适合不需要实时响应的异步工作流。 ✔ 非常适合使用重试功能进行后台处理和可靠的消息传递。 |
| SDK 配置 | 通用 MCP 工具 | 特定的 Azure Functions 工具 |
| 入门 | 如何将 Azure Functions 与 MCP 配合使用 | 如何将 Azure Functions 与队列配合使用 |
对于 HTTP 触发器函数,还可以通过在代理配置中使用 OpenAPI 工具 将函数描述为可调用的工具并将其注册为可调用工具,从而集成。 此方法为现有的基于 HTTP 的函数提供了灵活性,但它需要额外的设置来定义 API 规范。
支持的模型
若要使用函数调用的所有功能(包括并行函数),需要使用在 2023 年 11 月 6 日之后发布的模型。
创建和部署基于队列的工具集成示例
本文的其余部分演示如何使用 Azure 开发人员 CLI (azd) 示例,该示例使用 Functions 配置 Foundry 代理服务项目,以支持代理的基于队列的工具集成。
Note
有关如何将基于 Functions 的工具定义为 MCP 服务器的详细说明,请参阅 Azure Functions 中的主机 MCP 服务器。
Prerequisites
- Azure Functions Core Tools v4.x
-
具有标准设置的已部署代理
Note
不支持基本代理设置。
- Azurite
- 拥有有效订阅的 Azure 帐户。 免费创建帐户。
使用支持
| Azure AI Foundry 支持 | Python SDK | C# SDK | Java SDK | REST API | 基本代理设置 | 标准代理设置 |
|---|---|---|---|---|---|---|
| ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
初始化项目模板
此项目用于 azd 简化创建 Azure 资源和部署代码。 此部署遵循当前安全且可缩放的 Functions 部署的最佳做法。 可以在 GitHub 上找到此处使用的模板和代码。
azd init在终端窗口中运行以下命令,从 azd 模板初始化项目:azd init --template azure-functions-ai-services-agent-python
出现提示时,请提供环境名称,例如 ai-services-agent-python。 在 azd 中,环境可维护应用的唯一部署上下文,你可以定义多个环境。 环境名称还用于资源组的名称和在 Azure 中创建的其他资源。
运行以下命令以允许本地安装脚本成功运行,具体取决于本地作系统:
chmod +x ./infra/scripts/*.sh
配置资源
运行以下命令 azd provision ,在 Azure 中创建所需的资源:
azd provision
出现提示时,请提供以下所需的部署参数:
| Prompt | Description |
|---|---|
| 选择要使用的 Azure 订阅 | 选择您希望创建资源的订阅。 |
| 位置 部署参数 | 要在其中创建包含新 Azure 资源的资源组的 Azure 区域。 仅显示当前支持 Flex 消耗计划的区域。 |
| vnetEnabled 部署参数 | 虽然模板支持在虚拟网络中创建资源,但为了简化部署和测试,请选择 False。 |
部署文件 main.bicep 然后由 azd 读取,并用于在 Azure 中创建这些资源。
- Flex 消耗计划和函数应用
- Foundry 中的代理平台,包括:
- 服务帐户
- 模型部署
- 项目
- Agents
- 搜寻
- Azure Cosmos DB 帐户(供搜索使用)
- Azure 存储(Azure Functions 和 AI 代理需要)和 Application Insights(推荐)
- 您的账户的访问策略和角色
- 使用托管标识(而不是存储的连接字符串)的服务到服务连接
还可以在 文章中使用这些集成的 Azure 资源:如何将基于队列的 Azure Functions 与 Microsoft Foundry 代理配合使用。
预配后脚本还会创建一个 local.settings.json 文件,以便 Functions 能够在本地运行。 生成的文件应如下所示:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "python",
"STORAGE_CONNECTION__queueServiceUri": "https://<storageaccount>.queue.core.windows.net",
"PROJECT_CONNECTION_STRING": "<project connnection for AI Project>"
}
}
在 Visual Studio Code 中运行应用
- 在新终端中打开文件夹。
- 运行
code .代码命令,在 Visual Studio Code 中打开项目。 - 在命令面板(F1)中,键入
Azurite: Start,它允许使用 Functions 运行时的本地存储进行调试。 - 按 Run/Debug (F5) 在调试器中运行。 如果系统提示本地模拟器未运行,请选择 “仍然调试”。
- 使用 HTTP 测试工具分别发送 POST
prompt终结点。 如果已安装 RestClient 扩展,可以直接从test.http项目文件执行请求。
部署到 Azure 云
azd deploy运行以下命令,将项目代码发布到刚刚预配的函数应用和相关 Azure 资源:
azd deploy
成功完成发布后,azd 会提供新函数的 URL 终结点,但不会提供访问终结点所需的函数键值。 可以使用 Azure Functions Core Tools 命令 func azure functionapp list-functions 和 --show-keys 选项来获取函数终结点的密钥。 有关详细信息,请参阅在 Azure Functions 中使用访问密钥。
重新部署代码
还可以根据需要多次运行 azd up 该命令,以便预配 Azure 资源并将代码更新部署到函数应用。
Note
已部署的代码文件始终被最新的部署包覆盖。
清理资源
使用完函数应用和相关资源后,可使用此命令从 Azure 中删除函数应用及其相关资源,并避免产生任何进一步的成本(--purge 不会留下软删除的 AI 资源并会恢复你的配额):
azd down --purge