AI 时代的平台工程:把模型接入、护栏与开发者自主权放进同一套系统

2026-09-08 37 预计阅读时间: 1 分钟
来源: infoq.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:10 分钟

AI 辅助编码正在改变研发流程:开发者不仅调用 CI、制品库和 Kubernetes,还会调用代码补全、聊天模型、智能代理与自动评审工具。平台团队面对的问题因此不再只是“如何提供基础设施”,而是“哪些 AI 能力应成为平台能力,以及如何在统一治理和团队自主之间划线”。

这类变化并不意味着平台团队要接管所有 AI 工具。更合理的方向,是把重复、敏感且需要审计的部分沉淀为共享能力,同时保留开发团队选择模型和设计工作流的空间。

哪些 AI 能力适合进入平台层

适合平台化的能力通常具有三个特征:多个团队重复建设、涉及组织级风险,或者需要统一的成本与可观测性管理。

可以将平台能力划分为四组:

  • 统一模型入口:为不同模型提供稳定的内部 API,集中处理身份验证、限流、超时、重试和模型路由。
  • 安全护栏:阻止密钥、个人数据或受限代码进入未经批准的模型;限制可用模型、区域和供应商。
  • 可观测性与成本管理:记录调用方、模型、延迟、Token 用量和失败率,但避免默认保存完整提示词。
  • 开发者自助服务:通过模板、CLI 或开发者门户,让团队自行申请权限、创建评测集和接入流水线。

平台不必统一每一条提示词,也不应强制所有团队采用同一种代理框架。提示词、上下文组装和业务评测往往包含领域知识,更适合由产品团队掌握。平台应提供“铺好的道路”,而不是只有一条不能绕开的轨道。

标准化接口,而不是冻结工具选择

AI 工具变化很快。如果平台直接把某个 IDE 插件、模型版本或代理框架写进组织标准,迁移成本会迅速累积。更耐用的标准化对象是边界和契约,例如:

  1. 调用必须经过组织身份认证。
  2. 生产数据只能发送到批准的模型和区域。
  3. 每次请求都必须携带团队、应用和环境标识。
  4. 模型输出进入生产操作前必须经过确定性校验或人工确认。
  5. 平台公开延迟、成本和质量指标,但业务团队负责定义“回答是否有用”。

这种方式允许团队更换模型或编排框架,同时保留一致的审计与安全控制。平台团队管理的是风险边界,开发团队管理的是解决问题的方法。

可以这样实践:搭建一个最小 AI 网关

下面是一个可运行的示例,用来演示平台层可以承担的最小职责:内部 API Key 校验、模型白名单、请求大小限制、调用标识和不保存原始提示词的审计日志。

假设条件:上游服务提供 OpenAI 兼容的 POST /chat/completions 接口。运行前需要把 UPSTREAM_URLUPSTREAM_TOKEN 替换为组织批准的服务地址与凭据。该示例用于说明架构,不包含生产级高可用、分布式限流和敏感信息检测。

创建 requirements.txt

fastapi==0.115.0
uvicorn==0.30.6
httpx==0.27.2

创建 gateway.py

import hashlib
import json
import logging
import os
import time
import uuid

import httpx
from fastapi import FastAPI, Header, HTTPException
from pydantic import BaseModel, Field

UPSTREAM_URL = os.environ["UPSTREAM_URL"].rstrip("/")
UPSTREAM_TOKEN = os.environ["UPSTREAM_TOKEN"]
PLATFORM_API_KEY = os.environ["PLATFORM_API_KEY"]
ALLOWED_MODELS = set(os.getenv("ALLOWED_MODELS", "approved-model").split(","))

logging.basicConfig(level=logging.INFO, format="%(message)s")
app = FastAPI(title="Internal AI Gateway")


class ChatRequest(BaseModel):
    model: str
    messages: list[dict[str, str]] = Field(min_length=1, max_length=50)
    temperature: float = Field(default=0.2, ge=0, le=2)


@app.get("/healthz")
def healthz():
    return {"status": "ok"}


@app.post("/v1/chat/completions")
async def chat(
    request: ChatRequest,
    x_platform_key: str = Header(),
    x_team: str = Header(),
):
    if x_platform_key != PLATFORM_API_KEY:
        raise HTTPException(status_code=401, detail="invalid platform key")

    if request.model not in ALLOWED_MODELS:
        raise HTTPException(status_code=403, detail="model is not approved")

    payload = request.model_dump()
    encoded = json.dumps(payload, ensure_ascii=False).encode()
    if len(encoded) > 64 * 1024:
        raise HTTPException(status_code=413, detail="request is too large")

    request_id = str(uuid.uuid4())
    prompt_hash = hashlib.sha256(encoded).hexdigest()[:16]
    started = time.monotonic()

    async with httpx.AsyncClient(timeout=30) as client:
        response = await client.post(
            f"{UPSTREAM_URL}/chat/completions",
            headers={"Authorization": f"Bearer {UPSTREAM_TOKEN}"},
            json=payload,
        )

    duration_ms = int((time.monotonic() - started) * 1000)
    logging.info(json.dumps({
        "request_id": request_id,
        "team": x_team,
        "model": request.model,
        "status": response.status_code,
        "duration_ms": duration_ms,
        "payload_hash": prompt_hash,
    }))

    if response.status_code >= 400:
        raise HTTPException(status_code=502, detail="upstream model failed")

    return response.json()

安装并启动:

python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

export UPSTREAM_URL="https://your-approved-provider.example/v1"
export UPSTREAM_TOKEN="replace-me"
export PLATFORM_API_KEY="local-platform-key"
export ALLOWED_MODELS="approved-model,approved-model-small"

uvicorn gateway:app --host 127.0.0.1 --port 8080

从另一个终端调用:

curl --fail-with-body http://127.0.0.1:8080/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -H 'X-Platform-Key: local-platform-key' \
  -H 'X-Team: payments' \
  -d '{
    "model": "approved-model",
    "messages": [
      {"role": "user", "content": "为这个函数生成三个边界测试用例"}
    ],
    "temperature": 0.2
  }'

这个网关刻意不记录完整提示词,只记录摘要、团队、模型、状态码和延迟。实际部署时还应加入工作负载身份、按团队配额、敏感信息检测、指标导出、密钥轮换和数据保留策略。仅有一个代理服务并不等于完成了 AI 治理。

工作流变化比工具接入更难

AI 不只是新增一个 API,它还会改变代码进入仓库和生产环境的方式。平台团队需要重新检查原有的质量关卡:

  • AI 生成的代码是否仍经过同样的测试、静态分析和依赖扫描?
  • 代理能否直接创建分支、合并代码、修改基础设施或触发部署?
  • 当输出错误时,能否追溯使用的模型、工具权限和输入版本?
  • 自动化节省的是开发时间,还是把审查成本转移给了维护者?

尤其要区分“生成建议”和“执行操作”。代码解释、测试草稿等低风险任务可以更开放;数据库迁移、生产发布和权限修改则应采用短期凭据、最小权限与人工确认。不要因为操作者从脚本变成了代理,就降低原有的生产控制标准。

落地时从一条铺好的道路开始

平台团队不必一次建立完整的 AI 控制平面。更稳妥的采用顺序是:

  • 选取一两个高频场景,例如代码问答或测试生成。
  • 提供统一入口、身份认证和基础审计,而不是先建设复杂门户。
  • 同时记录延迟、成本和开发者反馈,避免只统计调用次数。
  • 明确禁止的数据、允许的模型以及需要人工批准的操作。
  • 给高级团队保留例外机制,但要求例外有负责人、期限和退出计划。

成功的平台能力应让安全路径比绕过平台更容易。如果开发者必须提交多张工单才能试用模型,他们往往会寻找未经治理的替代方案;如果平台隐藏了过多模型差异,又可能妨碍团队优化质量和成本。真正的平衡点,是统一身份、策略和可观测性,同时让业务团队保有模型选择、提示设计与评测方法的自主权。


相关推荐