25
25 / 50

LLM 工程化与网关

⏱️ 35分钟

LLM Gateway 不是把不同供应商伪装成完全相同的 API。它统一业务 contract、身份、预算、观测和发布控制,同时保留每个 provider 的能力、参数、错误和数据处理差异。

系统位置

Product / Agent
      ↓ business request + identity + task type
LLM Gateway
  ├─ auth / tenant / purpose
  ├─ request + schema validation
  ├─ policy routing + provider allowlist
  ├─ budget / quota / timeout
  ├─ provider adapters
  ├─ response validation
  └─ trace / audit / kill switch
      ↓
Approved model endpoint

1. Gateway Contract

type GatewayRequest = {
	taskType: 'draft_note' | 'policy_answer' | 'tool_decision';
	tenantId: string;
	actorId: string;
	dataClass: 'public' | 'internal' | 'sensitive';
	input: unknown;
	schemaVersion?: string;
	traceId: string;
	idempotencyKey?: string;
};

客户端提交业务任务,不直接选择任意 provider/model,也不能传入 provider key。

2. Model Registry

字段作用
exact model ID避免 alias/产品名混淆
provider/endpoint/region明确数据去向
supported controls防止跨模型照搬参数
tools/schema/modalities路由前 capability check
data class/retention合规 allowlist
checked_at/source管理快速变化
statusactive/canary/blocked/retired

3. Policy Routing

Routing 顺序应先检查硬约束,再比较质量、成本和延迟:

permission → data classification → region/provider allowlist
→ required capability → task quality baseline
→ budget/latency → selected model

Fallback 不是“主模型报错就换一家”。跨 provider 可能改变数据区域、retention、工具 contract 和模型行为。只有 routing policy 预先允许、请求可安全重试且目标模型通过相同 contract tests 时才能 fallback。

4. Provider Adapter

Adapter 负责把统一业务请求转换为该 provider 的真实契约,并把结果归一到可观测字段。它不能假装所有模型都支持相同的 temperaturetop_p、reasoning、tool call、stream event 或 prompt cache。

5. Reliability Boundary

失败默认动作
authentication/permissionfail closed,不重试
unsupported parameter/schema修配置,不重试
429/5xx/network仅在安全且有预算时有限重试
output validationrepair 或 human review,保留失败证据
provider outagepolicy-approved fallback / queue / unavailable
budget exceededstop / cheaper approved route / approval

有副作用的 tool action 需要 idempotency key、approval 和结果确认;Gateway 的模型重试不能导致工具重复执行。

6. Observability

记录:trace ID、task type、tenant(可脱敏)、selected provider/model、routing reason、schema version、latency、usage/cache usage、retry、fallback、validation 和 final status。

默认不记录:API key、完整敏感 Prompt、未脱敏 tool output 或 PII。日志的访问、保留和删除也受 governance 控制。

7. Rollout Controls

  • canary:只允许指定 task/tenant/case;
  • shadow:在获授权且成本允许时并行比较,不影响用户结果;
  • regression gate:新模型必须通过既有 dataset;
  • kill switch:按 model/provider/task 禁用;
  • rollback:恢复已验证 route/config,不回滚已发生的外部动作;
  • model retirement:迁移、回归、下线与审计记录。

8. 安全配置示例

routes:
    policy_answer:
        required_capabilities: [structured_output]
        allowed_data_classes: [public, internal]
        allowed_regions: [configured_at_runtime]
        primary: registry-policy-answer-primary
        fallback: null
        timeout_ms: 30000
        max_attempts: 2
        release_gate: policy-answer-regression-v3

这里使用 registry alias,不把当期 model ID 散落在业务代码。具体型号、价格和区域在使用时核验。

9. Gateway Contract Tests

  1. 未授权 tenant/model 被拒绝。
  2. Sensitive data 不进入未允许 provider/region。
  3. Unsupported control 在请求前失败。
  4. 429 只触发有限、带预算重试。
  5. Fallback 被禁用时明确返回 unavailable。
  6. Structured Output failure 不被包装成 success。
  7. Trace 能还原 routing decision,但不泄露 PII。
  8. Kill switch 能阻止新请求并保留审计。

完成标准

  • Gateway 统一业务 contract,但 provider adapter 保留差异。
  • Routing 先执行 permission/data/region/capability 硬约束。
  • 跨供应商 fallback 需要显式 policy。
  • 重试有上限、预算和 idempotency 边界。
  • Model registry、trace、regression、canary 与 kill switch 可用。
  • 未知访问、价格或地区状态标记 unavailable,不做猜测。

📚 相关资源

常见问题

点击问题,查看本章对应的实践答案。

为什么要做 LLM gateway,直接调 OpenAI SDK 不行吗?

直接调有 4 个隐患:provider key 暴露给 client、quota 和 rate limit 没法统一、想换 provider / 灰度 / kill switch 全要改业务代码、observability 散落在各处。Gateway 把所有 LLM call 收到一个入口,统一鉴权、routing、quota、logging、safety,换模型只改 config 不动业务。

Gateway config 长什么样?

YAML 两段式:models 段定义每个 provider/model 的 timeout、max_tokens、rpm、PII 脱敏、blocklist、canary 流量百分比;routes 段定义业务路由(如 chat),指向 primary model + fallback model + tools_schema。例如 gpt-5 设 traffic_percent: 5 做 canary,claude-3-5-sonnet 设 fallback: gpt-4o 做兜底。

Canary、A/B、Kill switch 三个概念到底有什么区别?

Canary 是把 1-5% 流量切到新 model 或新 prompt,对比 success / cost / latency 再 ramp;A/B 是按 user / tenant 分桶,把 bucket 写进 trace 给 dashboard 看;Kill switch 是把某个 model 或 prompt version 立刻标记 disabled,瞬间路由回上一个 stable alias —— 出事时止损用。

429 / 5xx 时 gateway 怎么处理?

三件事:带 idempotency key 的 POST 加 backoff 重试避免重复副作用;如果配了 fallback model,自动切到 fallback alias 再发一次(示例代码里直接 app.handle 重入);下游 tool 用 circuit breaker + timeout 保护,避免单个 provider 抖动把整条链路拖垮。

多租户场景下 gateway 必须做哪些控制?

4 项:tenant 级 rate limit + model allowlist(不是所有租户都能用 gpt-5);billing hook 把每个 tenant 的 token 消耗写日志做 showback / chargeback;data isolation 按 tenant_id 过滤,绝不让 context 跨 tenant 混;audit log 记录是谁改的 routing / prompt / config 和何时改的。