大模型后端底座是否值得引入智能能力
讨论“大模型底座”之前,先要确认业务问题是否真的需要生成式能力。模型调用会增加网络依赖、推理等待、内容审核和按量成本,也会引入非确定性输出。如果任务本身有明确算法,或者结果必须逐字段精确复现,引入模型通常不是第一选择。
判断是否值得做,可以从四件事入手:现有方案哪里不够、模型能改善什么指标、错误结果由谁承担、没有模型时业务能否继续。比如开放式文本归类、知识辅助和自然语言交互,可能从模型能力中受益;格式校验、权限判断、金额汇总和数据库过滤,则更适合确定性代码。这里没有一条按技术名称划分的绝对界线,最终仍要用真实样本做离线评估和小范围验证。
先识别不适合直接交给模型的任务
确定性解析与格式校验
手机号、邮箱或业务编号是否合法,应由明确的规则和校验库判断。固定格式的数据可以交给 JSON、CSV 或协议对应的解析器。模型即使大多数时候能返回正确结构,也不能替代语法校验;当模型用于提取非结构化信息时,输出仍要经过 schema 校验,并为字段缺失和类型错误准备处理路径。
正则也不是越多越好。复杂嵌套格式应使用专用解析器,用户输入还要限制长度,避免高复杂度表达式带来性能问题。关键点不在于宣称某种方案固定快多少,而是确定性工具的行为容易测试、失败边界也更清楚。
延迟和可用性敏感的同步主路径
鉴权、下单前校验等主路径若同步依赖外部模型,模型超时就会直接变成业务超时。此类路径优先使用本地规则或已有服务。如果模型只是提供推荐文案、标签等附加结果,可以考虑异步生成、预计算或在超时后省略,不要让非关键能力决定主交易是否成功。
精确查询、排序和数值计算
订单汇总、库存扣减和条件过滤应由数据库或计算引擎完成。模型可以把自然语言转成候选查询,但生成的查询需要权限约束、语法检查、资源限制和必要的人工确认。也不要把完整订单明细塞进提示词:这既扩大数据暴露面,也让上下文长度和费用随数据量增长。
路由层的职责是控制风险,不是堆组件
当同一个入口同时承接规则任务和生成任务时,路由层可以先识别确定性快路径,再把其余请求交给模型。是否部署本地小模型取决于分类准确率、资源成本和维护能力,并非所有系统都需要增加这一层。任何分类器都有误判,涉及权限或资金的判断不能因为“模型认为是简单请求”就绕开原有校验。
下面的代码只表达控制流程,不是可直接运行的完整网关。示例为本地分类补充了错误处理,也把并发令牌的释放写出来,防止调用结束后配额一直被占用。真正的流式接口通常返回流对象或通过回调写响应,返回类型应按所用框架调整。
type GatewayRouter struct { ruleEngine *RuleEngine slmModel *LocalSLMClient llmClient *LLMClusterClient } func (r *GatewayRouter) Dispatch(ctx context.Context, input string) (string, error) { if match, result := r.ruleEngine.MatchFastPath(input); match { Metrics.Counter("path.rule.hit").Inc() return result, nil } intent, err := r.slmModel.PredictIntent(ctx, input) if err != nil { Metrics.Counter("path.slm.error").Inc() return "", fmt.Errorf("classify request: %w", err) } if intent == IntentSimpleFAQ { Metrics.Counter("path.slm.hit").Inc() return r.ruleEngine.GetFAQAnswer(input), nil } release, ok := r.llmClient.TryAcquire(ctx) if !ok { Metrics.Counter("path.llm.rejected").Inc() return "", ErrModelCapacityExceeded } defer release() return r.llmClient.StreamGenerate(ctx, input) }拒绝时返回业务提示还是显式错误,要由调用方契约决定。把“系统繁忙”文本伪装成正常模型答案,可能污染后续缓存和会话历史。网关还应把请求取消传给下游,客户端断开后及时终止推理或读取响应,避免继续消耗计算资源。
三类常见能力都有适用条件
1. 语义缓存(Semantic Cache)
语义缓存尝试让表达相近的问题复用结果,它适合答案稳定、与用户身份无关的内容,例如公开帮助中心问答。但“如何退货”和“我的订单如何退货”可能看似接近,后者却依赖订单状态和账号权限。缓存键至少要包含模型版本、提示词版本、知识库版本、租户与必要的权限维度,并设置失效策略。
相似度阈值需要用业务样本校准,不能只凭向量分数。上线前应检查误命中造成的后果,敏感或个性化回复通常不应跨用户复用。若重复率很低,维护嵌入模型、向量索引和失效链路的成本可能超过节省的调用量。
2. 请求合并与 Batching 批处理
自建推理服务可能通过连续批处理提高设备利用率,但具体收益取决于模型、输入输出长度、硬件和调度器。批量等待也会增加排队时间,对首字延迟敏感的交互请求未必合适。很多推理框架已经在服务端完成调度,网关再攒一次批可能重复排队,因此先确认框架接口和压测结果。
[Request 1] ──┐ [Request 2] ──┼─> [ Dynamic Batcher(按延迟预算或批大小触发) ] ──> [ 推理服务 ] [Request 3] ──┘做批处理测试时,应区分排队、提示词预填充和逐 Token 生成三个阶段,同时观察吞吐、首字时间、完整响应时间、取消请求占比和显存峰值。只看 GPU 利用率容易把用户等待时间藏起来。
3. 熔断隔离与配额(Quota)管控
模型调用应有独立的并发上限、队列和超时,防止下游变慢后占满整个应用的资源。租户配额可以同时考虑请求数、输入 Token、输出 Token 和并发数,额度来自成本预算与服务等级,不能用一组示例数字覆盖所有业务。
熔断条件要区分限流、服务端错误、超时和调用方取消。重试只适用于结果明确未产生、且请求满足幂等要求的场景,并加入退避与总次数限制。降级到搜索或小模型之前,还要确认返回语义一致;如果无法提供可信的替代结果,明确告知暂时不可用往往更合适。
立项与上线前的检查清单
- 用真实样本建立现有方案的质量、耗时和人工成本基线,再比较模型方案,而不是只展示少量成功案例。
- 定义不可接受的错误,例如越权、泄露个人信息、错误金额和不当内容,并在模型之外保留确定性防线。
- 根据接口延迟预算设置连接、首字、空闲和总超时;确认客户端取消能够传播到推理端。
- 估算峰值并发与输入输出 Token 成本,设置租户和全局上限,并监控拒绝、排队、缓存误命中与实际账单。
- 评估语义缓存、本地模型和批处理是否确实解决当前瓶颈。没有数据证明收益时,不必为了“底座完整”全部部署。
- 演练供应商错误、限流和模型版本切换,明确哪些请求可以降级、哪些必须失败,并避免把降级提示当作正常答案保存。
- 保存提示词、模型、知识库和评测集版本,使质量变化可以定位和回滚;日志中不要记录未经脱敏的提示词与输出。
值得引入的智能能力,应当让某个具体任务变得更好,并且错误与成本都可控制。若团队还无法说明成功标准、失败处理和退出方案,先做范围有限的验证,比先建设一套庞大的“通用底座”更容易得到可靠结论。