跳到主要内容

AI 产品为什么又需要 BFF:前端别直接拼模型上下文,权限和路由也别四处分散

· 阅读需 4 分钟
一介布衣
全栈开发者

这两年我越来越觉得,AI 产品里的 BFF 又变得重要了。但它重要,不是因为我们突然怀念传统前后端分层,而是因为很多团队在 AI 功能早期图快,把会话拼装、模型选择、权限裁剪和供应商切换都散落在不同地方,后面一扩展就开始失控。

最常见的失控方式是这样的:

  • 前端自己拼一部分上下文
  • 工作流层再补一部分业务状态
  • 模型调用层偷偷加一部分默认参数
  • 权限和脱敏逻辑在好几个地方各做一遍

最后谁都能改一点,但谁也说不清一条请求到底带着什么上下文去找模型。

我现在更愿意让 BFF 先做“收口”而不是“多做事”

AI 场景里的 BFF 最重要的价值,不是替业务写更多逻辑,而是先把几件一定会分散的东西收拢起来:

  • 前端会话状态
  • 用户身份与权限
  • 模型调用所需的统一上下文
  • 供应商路由和超时策略
  • 基础脱敏和审计字段

这层如果不明确,前端、工作流和模型层很快都会开始各自补洞。

前端最不该直接做的,是拼最终模型输入

我现在特别反对前端直接把“最终送给模型的上下文”拼好。因为前端可以负责交互状态,但它不应该承担这几类决定:

  • 哪些上下文字段属于当前用户可见范围
  • 哪些内部元数据应该进模型,哪些只应该进审计日志
  • 当前场景到底该走哪个模型和哪个模板版本

这些判断一旦分散在前端里,后面做权限收缩、日志对齐和 Prompt 版本切换会很痛苦。

我更喜欢前端只提交一个相对干净的请求:

type ChatRequest = {
sessionId: string;
userInput: string;
attachmentIds: string[];
scene: 'chat' | 'review' | 'rewrite';
};

然后由 BFF 在服务端补齐真正要送往工作流和模型层的上下文。

模型路由放在 BFF,比散在业务里稳得多

我越来越不想让每个业务服务自己决定:

  • 用哪个供应商
  • 超时多长
  • 失败后切不切备用模型
  • 哪些场景该走便宜模型,哪些该走强模型

这些决策如果分散在不同服务里,后面成本控制和问题排查都会非常碎。

放在 BFF 的好处是,你至少可以统一处理:

  • 路由规则
  • 成本配额
  • 超时和重试
  • 降级策略

这样当某个供应商波动时,你不需要满系统去找谁偷偷写了自己的切换逻辑。

权限裁剪和脱敏也更适合在这层先做

AI 请求里最危险的一件事,是把不该带给模型的内容带进去了。前端当然可以做一部分隐藏,但真正可靠的权限裁剪,我更愿意放在 BFF 做。原因很简单:

  • BFF 离用户身份最近
  • 也最接近最终模型输入
  • 可以同时做审计记录

如果这件事前端做一半、模型层再补一半,最后最容易出现的就是“大家都以为别人已经处理过了”。

BFF 不该变成第二个工作流引擎

当然,我也不赞成把所有业务流程都塞进 BFF。它不该做的是:

  • 管整条任务编排
  • 持有复杂步骤状态
  • 承担业务真相

这些更适合在工作流层或业务服务层做。BFF 更适合扮演一个很清楚的角色:把来自前端的请求收干净,再以一致的方式交给后面的编排层。

我对 AI 场景里 BFF 的判断

AI 产品里的 BFF,价值在于收束复杂度,而不是重复传统后端职责。只要系统开始同时面对前端会话、模型路由、权限裁剪和多供应商切换,就需要一层来统一这些会四处散开的东西。

它最好的状态不是“什么都懂”,而是“把本来容易分散的边界收拢成一处”。这件事一旦做好,前端会轻很多,工作流也会清楚很多,排查问题时更不会像在不同层里拼一张已经碎掉的图。