helloGPT Azure Functions指南

helloGPT可借助AzureFunctions快速上线:在本地用FunctionsCore Tools创建HTTP触发函数,配置OpenAI或AzureOpenAI密钥与模型,编写请求逻辑并部署到消费计划或专用托管计划,结合KeyVault保存密钥与Application Insights监控。

helloGPT Azure Functions指南

为什么用 Azure Functions 来承载 helloGPT?

想象一下,你要把一个会聊天的小程序放在云上,按需扩缩、只为请求付费,不想操心服务器运维,这时候函数计算就像租用按需的灯光系统:有客人来就亮,没有就熄。Azure Functions 提供快速启动、与 Azure 服务原生对接的便利,适合做 HTTP 接入层、Webhook、或作为中间层调用 OpenAI/Azure OpenAI。

适用场景

  • 轻量对话代理(短会话、快速响应)
  • 作为后端微服务,接收前端请求并调用模型生成回答
  • 事件驱动任务,例如处理用户上传文本并触发生成摘要

先决条件(要准备什么)

  • Azure 订阅(用于创建 Function App、Key Vault、Application Insights)
  • 本地开发工具:Azure Functions Core Tools、Node.js 或 Python、Azure CLI
  • OpenAI API Key 或 Azure OpenAI 的资源与部署名
  • 理解 HTTP、环境变量、JSON 以及基本的异步请求逻辑

核心概念速览(别跳过)

HTTP 触发器:函数以 HTTP 请求触发,最常见也最直观。你可以把它当成一个小型的 Web API。

托管计划:消费计划(Consumption)按请求计费并自动伸缩,冷启动可能更明显;专用/高级计划(App Service Plan/Premium)支持预热、长期连接、且并发更稳定。

Azure OpenAI vs OpenAI 公有 API:两者接口相近但鉴权与域名不同:Azure OpenAI 要指定资源名与部署名,且通过 Azure 资源管理;OpenAI 则使用 openai.com 提供的 API Key。

Key Vault:把 API Key 放到 Key Vault,可以减少明文泄露风险,并支持受限访问。

Application Insights:用于收集日志、请求性能与异常,部署后用于排查延迟与错误率。

从本地到云:一步一步做(Feynman 风格讲清楚)

我会用一个最常见的流程把事情拆开:先在本地写好能回应“一句 helloGPT”的函数,再把它放到 Azure 上,同时把密钥藏好,最后加监控与认证。

步骤 1:初始化函数工程(以 Node.js 为例)

  • 安装 Azure Functions Core Tools:用 Azure CLI 或包管理器。
  • 新建项目:func init MyHelloGPT –javascript
  • 添加 HTTP 函数:func new –name HelloGpt –template “HTTP trigger” –authlevel “anonymous”

生成的函数会有一个 index.js(或 __init__.py),这是入口。核心思路是接收请求体,提取 prompt 或消息,然后调用模型返回结果。

示例代码(Node.js)

module.exports = async function (context, req) {
  const prompt = req.body && req.body.prompt;
  if (!prompt) {
    context.res = { status: 400, body: { error: 'missing prompt' } };
    return;
  }
  const apiKey = process.env.OPENAI_API_KEY; // 或从 Key Vault 获取
  // 发出请求到 OpenAI 或 Azure OpenAI
  const responseText = await callModel(apiKey, prompt);
  context.res = { status: 200, body: { reply: responseText } };
};

这里的 callModel 是封装对 OpenAI/Azure OpenAI 的 HTTP 请求,注意设置超时与重试策略。

步骤 2:安全管理密钥

  • 开发时:使用本地的环境文件(.env)并 不要把它提交到仓库。
  • 生产时:在 Azure 上用 Key Vault 存储密钥,并给 Function App 分配访问权限(托管标识)。
  • 在 Function App 的应用设置里,绑定 Key Vault 引用或直接把密钥写到环境变量(不推荐)。

步骤 3:部署到 Azure

可选方案很多:使用 Azure CLI 的 zip 部署、用 VS Code 的扩展直接部署、或设置 GitHub Actions 自动化部署。一个常见且推荐的流程是:

  • 用 Azure CLI 创建资源组、存储账户与 Function App。
  • 把应用设置(例如 OPENAI_API_KEY 的 Key Vault 引用、模型部署名、端点)配置到 Function App。
  • 部署代码并在 Application Insights 打开监控。

步骤 4:认证与流量控制

  • 如果是公开 API,至少用 API Key 或 Azure AD 进行保护;如果只是内部使用,可配合 VNet 与私有端点。
  • 在入口层做速率限制(API Management 或自定义逻辑),避免滥用造成高额调用费。

运行与调优:你会遇到的常见问题及解决

  • 冷启动:消费计划下首次调用有延迟。解决办法:如果对延迟敏感,考虑使用 Premium 或预热策略。
  • 超时:Azure Functions 默认有超时限制(消费计划通常 5 分钟),长任务要用 Durable Functions 或把任务拆成多段。
  • 并发限制:函数可以水平扩展,但被限于上游资源(例如模型吞吐限额)。可以用队列和退避重试缓解。
  • 成本不可控:监控请求量与模型调用次数,设置预算警报并在必要时降级模型或缓存常见回答。

示例:如何调用 Azure OpenAI(要点)

Azure OpenAI 的请求要指定资源名与部署名,HTTP 请求通常是 POST 到类似 /openai/deployments/{deployment-name}/completions 的路径,鉴权用 Azure 提供的密钥。注意请求体与 public OpenAI 的差异(部署名取代 model 字段)。

操作 关键点
鉴权 Azure 密钥或 OpenAI API Key;生产环境用 Key Vault
端点格式 Azure: /openai/deployments/{name}/…,OpenAI: api.openai.com/v1/…
模型选择 Azure 使用部署名,OpenAI 使用 model 参数

监控与日志——别临时抱佛脚

上线后把三样东西准备好:请求日志(谁、何时、payload 大小)、错误与异常(堆栈、失败原因)、性能指标(延迟、冷启动、并发数)。Application Insights 可以收集这些数据,设置告警规则,比如错误率或平均延迟超过阈值就通知。

进阶话题(按需再做)

  • 持久会话:用 Redis 或 Cosmos DB 存对话上下文,避免把全部历史一直传给模型。
  • 安全与合规:如果涉及个人数据,注意数据驻留、审计与删除策略。
  • 费用优化:缓存重复请求的输出、批量化调用、按重要性分层调用不同模型。
  • 长请求与异步:Durable Functions 适合需要多步调用或等待外部事件的场景。

小抄:部署检查清单

  • 函数本地能运行并返回正确响应。
  • 密钥已迁入 Key Vault,并为 Function App 授权。
  • 在 Function App 配置中设置必要的环境变量。
  • 启用 Application Insights 并配置日志级别。
  • 对外接口做认证与速率限制。
  • 制定成本与错误告警策略。

执行示例补充(Python 快速示例)

import os
import requests
from azure.functions import HttpRequest, HttpResponse

def main(req: HttpRequest) -> HttpResponse:
    prompt = req.get_json().get('prompt')
    key = os.environ.get('OPENAI_API_KEY')
    if not prompt or not key:
        return HttpResponse('missing prompt or key', status_code=400)
    # 简化调用逻辑
    r = requests.post('https://api.openai.com/v1/completions', json={
        'model': 'gpt-3.5-turbo',
        'prompt': prompt,
        'max_tokens': 150
    }, headers={'Authorization': f'Bearer {key}'}, timeout=10)
    return HttpResponse(r.text, mimetype='application/json')

这段代码是最精简的示范,真实项目要加异常捕获、输入校验、速率限制与重试。

说了这么多,可能你已经能把 helloGPT 从本地搬到 Azure 上了。别忘了,部署只是一半的工作,监控、安全与成本管理才是长期保证体验的关键。