LLM 工程化与网关
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 | 管理快速变化 |
| status | active/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 的真实契约,并把结果归一到可观测字段。它不能假装所有模型都支持相同的 temperature、top_p、reasoning、tool call、stream event 或 prompt cache。
5. Reliability Boundary
| 失败 | 默认动作 |
|---|---|
| authentication/permission | fail closed,不重试 |
| unsupported parameter/schema | 修配置,不重试 |
| 429/5xx/network | 仅在安全且有预算时有限重试 |
| output validation | repair 或 human review,保留失败证据 |
| provider outage | policy-approved fallback / queue / unavailable |
| budget exceeded | stop / 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
- 未授权 tenant/model 被拒绝。
- Sensitive data 不进入未允许 provider/region。
- Unsupported control 在请求前失败。
- 429 只触发有限、带预算重试。
- Fallback 被禁用时明确返回 unavailable。
- Structured Output failure 不被包装成 success。
- Trace 能还原 routing decision,但不泄露 PII。
- 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 和何时改的。