适用读者:正在落地大模型应用的后端 / 平台工程师 环境:Python 3.11、httpx、任一兼容 OpenAI 协议的中转或自建推理服务 结论先行:大多数 AI 项目失败不在模型,在工程。模型只占一层,剩下五层没做好,换再强的模型也没用。
一个能上生产的大模型应用,可以拆成 6 层。每层都有明确的验收口径,缺一层就会在某个时间点爆掉。
下面逐层说清"做什么"和"怎么验收"。
做什么:统一入口,做身份、配额、并发控制、流式输出。
验收口径:
最后一条最容易漏。上下文无限增长,成本会随会话时长线性上升。
做什么:把"一次问答"变成"可重放的工作流"。
验收口径:
常见坑:把编排逻辑写进 prompt。prompt 里写"如果用户问 A 就调用 B",一旦模型不遵守就整条链路断。编排应该是代码,模型只做判断,不做调度。
这一层最值得单独写代码。目标:业务代码不感知具体模型。
import time
import httpx
from dataclasses import dataclass
@dataclass
class Model:
name: str
base_url: str
api_key: str
price_in: float # 元 / 千 token
price_out: float
class Gateway:
"""最小可用网关:优先模型 -> 顺序降级 -> 成本与延迟计量"""
def __init__(self, models: list[Model], timeout: float = 30, retries: int = 1):
self.models = models
self.timeout = timeout
self.retries = retries
def chat(self, messages: list[dict], prefer: str | None = None):
order = sorted(self.models, key=lambda m: m.name != prefer)
last_err = None
for m in order:
for _ in range(self.retries + 1):
t0 = time.time()
try:
resp = httpx.post(
f"{m.base_url}/chat/completions",
headers={"Authorization": f"Bearer {m.api_key}"},
json={"model": m.name, "messages": messages},
timeout=self.timeout,
)
resp.raise_for_status()
data = resp.json()
usage = data.get("usage", {})
cost = (
usage.get("prompt_tokens", 0) / 1000 * m.price_in
+ usage.get("completion_tokens", 0) / 1000 * m.price_out
)
meta = {
"model": m.name,
"cost": round(cost, 6),
"latency_ms": int((time.time() - t0) * 1000),
}
return data, meta
except Exception as e:
last_err = e
raise RuntimeError(f"all models failed, last error: {last_err}")验收口径:
注意:不同厂商对 temperature、max_tokens、tool_choice 的支持程度不同,网关里要做参数归一化,否则换模型就报错。
RAG 的效果,90% 由这一层决定,跟模型关系不大。
验收口径:
最容易糊弄的地方:只演示"问一个问题答得不错"。没有评测集,就没有优化方向,也无法在换模型、换切分策略后判断是变好还是变差。
验收口径:
这一层出事,技术问题会变成法律问题。 私有化部署的核心价值也在这里:模型、向量库、原始文档都不出内网。
验收口径:
没有观测层的系统,出问题时只能靠用户投诉发现。
这几个问题在交付后三个月内暴露的概率很高,前期花半天确认,能省两周返工。
1. 文档解析没有兜底。
PDF 有扫描件、DWG 有外部参照、Excel 有合并单元格。只按"标准文件"设计的解析器,真实数据一进来就崩。验收时要问:解析失败时,是报错、跳过、还是转人工队列?三种处理方式对应的产品逻辑完全不同。
2. 上下文长度当成了记忆。
把历史对话全量拼进 prompt,短期内看起来"记得住",实际上成本随轮数线性上涨,而且超过窗口后开头会被截断,表现为"聊到后面忘了前面"。正确做法是摘要 + 关键实体抽取,落库存储,按需回填。
3. 权限模型后期才加。
先做成单租户,上线前再补多租户,几乎一定要重写检索层。因为向量检索天然是"全库相似度",加租户过滤不是加个 where 那么简单,索引结构要一起改。
4. 评测集是上线前一周才编的。
这种评测集通常照着系统现有能力写,测出来自然好看,但覆盖不到真实用户的问法。评测集应该在需求阶段就开始积累,来源是客服记录、销售问答、真实工单。
这套分层不是为了"架构好看",是为了出问题时能定位到层。
线上答得不对,可能是检索没召回(L4)、可能是网关降级到了弱模型(L3)、可能是编排把上下文截断了(L2)。没有分层和 trace,只能靠猜,猜一次要一天。
另外一个现实问题:私有化部署的复杂度主要不在模型,在依赖。向量库、embedding 模型、OCR、文档解析,每一个都可能成为内网部署的阻塞点。选型阶段就要把这些组件列出来逐个确认能不能进内网,而不是等交付前一周才发现某个服务只能走公网。
作者:奇点大数据技术团队
能力边界:不承诺模型效果指标,验收以双方确认的评测集为准。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。