Security Compliance

零数据留存 LLM 网关:企业为什么需要会遗忘的转发器

大多数 LLM 中转站都在悄悄存你的 prompt。对个人玩具应用来说,这只是讨厌;对一个跑生产流量的企业来说,这是合规雷区、攻击面、以及你竞争壁垒的慢性流失。本文讲清楚"零留存"到底是什么意思,以及怎么判断你的网关只是嘴上说说。

作者:BUZZ AI Gateway 阅读约 10 分钟 更新:2026-05-22

只要你在应用和 LLM 上游之间塞了任何一层路由,你就给客户数据多开了一个落地的房间。这一层可能是你自己撸的反向代理、可能是开源 router、也可能是托管的 AI 网关。但从 GDPR、SOC 2、HIPAA 或者你自己事故响应预案的角度看,问的都是同一个问题:这个中间盒会不会留住穿过它的东西?

大多数会留。它们把 prompt 留在请求日志里方便调试。它们把 completion 留在缓存里降低上游成本。它们把两者都灌进数据仓库做面板。它们在异常时把请求体快照进 error tracker。这些操作单看每一项都是无邪的工程便利,合在一起,从合规视角看,就是同一件事:一个厂商现在持有了你客户输入的副本。

零留存网关是反过来的设计。中间盒把字节往上游推、把字节往回带,然后忘掉。一次请求结束后能活下来的只有一行计费读数。本文讲清楚这种设计具体要求什么、为什么留存在生产环境里很危险、以及在把真实流量切过去之前怎么验证厂商的承诺。

"零留存"应该指的是什么

这个词已经被磨平了。营销页上写着"我们不留存你的数据",底层系统其实把 prompt 写进 30 天的日志桶,还把那叫"运营需要"。一个有用的定义得更尖锐。

作为技术承诺,零留存应当指:请求体和响应体永远不会写入任何持久化介质。它们只在上游调用的生命周期里活在进程内存中,响应一结束就被释放。具体来讲,一个零留存网关:

如果一个厂商的留存说明对以上任何一条沉默,把这种沉默直接当成"是"。工程团队不会羞于宣传客户在意的功能的"缺席"。

同样要明确,零留存等于"不训练"政策。不训练政策的意思是:我们不会把你的数据喂进我们的模型训练。零留存的意思是:我们根本不存你的数据。前者更弱:它仍然允许存储、人工审阅、内部分析、和泄露风险。后者直接把数据从威胁面里拿掉,消除整一类风险。

留存在生产里为什么危险

"我们记录 prompt 是为了调试"听起来人畜无害,直到你和隐私律师坐下来过一遍合规。这种留存离开你管控边界的那一刻起,至少在四条路上都会变成负债。

1. 监管暴露(GDPR、SOC 2、HIPAA、CCPA)

大多数企业隐私框架围绕一个原则:数据最小化——只收集和保留你需要的,只在你需要的时间里。当一个第三方网关存了 prompt,这些 prompt 现在就交给了你客户可能没有同意过的子处理者处理。在 GDPR 第 28 条下,你需要和这个子处理者签 DPA,并能可辩护地说明它持有什么。在 SOC 2 下,网关进入你的隐私和保密性边界,审计师会问 prompt 数据是怎么保护、留存和销毁的。在 HIPAA 下,只要 prompt 可能含 PHI,网关就是 business associate,需要签 BAA。当答案是"网关从一开始就不存请求体",上面每一条都会变得简单得多。

2. 你客户数据的连带责任

如果你的应用接受用户输入并把任何片段塞进了一次 LLM 调用,你的网关就是你用户内容的托管方。网关侧的一次泄露就是你客户数据的一次泄露——尽管丢数据的存储层不是你写的。出去通知用户的人会是你,不是网关厂商。把网关的留存面缩小,是降低自身爆炸半径最便宜的一种办法。

3. Prompt 内容本身就是攻击面

被留存的 prompt 就是可以被外泄的 prompt。多数 LLM 应用把私有 system prompt、检索上下文、用户输入塞在同一个请求体里。如果网关存了这些请求体,一次凭据泄露、一个 SSRF bug、或者厂商内部一次安全事件,就会变成所有曾经穿过这一层的 system prompt 和检索片段全数泄出。Prompt 没法像 API key 那样"轮换",一旦语料出去了,就出去了。

4. 竞争和 IP 流失

你的 prompt 编码了你的业务逻辑。评估器 prompt 的措辞、tool calling 协议的形状、你磨了几个月的 few-shot 示例、你注入检索结果的顺序——这些就是壁垒,也是被留存日志可以轻松抄走的东西。一个持有你请求体的网关,就是一个持有你 IP 的网关。把它当成把训练数据交给第三方一样去对待。

零留存网关的架构形态

零留存是一种架构属性,不是一条政策条款。政策会变,架构留下。一个正确搭建的转发器,形状大致是这样:

      client                  gateway                upstream LLM
        |                        |                         |
        |  POST /v1/messages     |                         |
        |  (request body)        |                         |
        |--------------------->  |                         |
        |                        |  open upstream conn     |
        |                        |  stream body through    |
        |                        |-----------------------> |
        |                        |                         |
        |                        |  <-- response chunks    |
        |                        |  pass-through to client |
        |  <------- chunks ----  |                         |
        |                        |                         |
        |                        |  on stream end:         |
        |                        |  parse usage headers    |
        |                        |  write 1 billing row    |
        |                        |  drop body buffer       |
        v                        v                         v
                            [ memory only ]          [ provider keeps
                            [ no disk, no DB ]         per its own ToS ]

这种设计有几个关键属性:

是架构,不是政策。这件事重要的原因是:政策会在压力下被放松。某个工程师为了追一个 bug,加上"就一行 debug 日志",就能悄悄打破一条基于政策的承诺。架构上的承诺则是 fail-closed 的——根本不存在写请求体的代码路径,也就没有那一行可加。

哪些字段会被留下,为什么

"请求体零留存"不等于"什么都不留存"。网关至少要留够元数据来计费、做限流、给你看用量。诚实的回答是,以下运营元数据会被保留:

字段为什么必须保留
model不同模型有不同的单价。计算账单需要模型名。
input_tokens请求侧的 token 整数计数,从上游 usage 元数据里解析得来。开账单必需。
output_tokens输出侧同理,开账单必需。
cache_read_tokens / cache_write_tokens对支持 Prompt Cache 的上游,缓存读写计数单独定价,需要分开记。
timestamp日级聚合、限流、审计轨迹都需要。
user_id持有该 API key 的认证身份,用来把用量归属到账户。
http_status上游调用是成功、被限流还是出错,影响退款和重试逻辑。
latency_ms端到端传输延迟,SLA 报告用,和请求体内容无关。

注意这张表里没有的:prompt、completion、system 消息、工具定义、tool call 参数、检索文档、附件,或者任何文本内容。这些都不计费需要,零留存网关不会去收它不需要的东西。

孤立看,token 计数就是整数,无法反推出 prompt 文本。多数监管者和审计师把 token 计数这种聚合计费指标视为运营遥测,而不是个人数据。和 user_id 的组合可能落入你自己的隐私政策,但真正承担监管重量的部分——prompt 本身——已经不在了。

作为客户怎么核实网关的留存承诺

营销话术廉价。在把生产流量打过任何一个网关之前,跑一遍核实清单。下面这些步骤都不需要厂商配合,它们能告诉你的比一张光鲜合规页多得多。

逐字读服务条款

在 ToS 里搜:retainstorelogcachearchiveanalyticsimprovetraining。注意留存窗口。"我们留存请求数据 30 天"不是零留存。"我们在提供服务必要的时间内留存请求数据"也不是零留存,这是一张空头支票。你想看到的措辞更接近于"请求体和响应体不会被写入任何持久化存储"。

要数据流图

任何认真做这件事的厂商都能给你一张图,标出从入口到出口字节的走向。看分叉:每一个从主转发路径上岔出去的箭头,都是一个可能藏留存的位置。一张干净的零留存图只有两条路径——请求和响应——加上一条专门给计费元数据的支线。

跑一次反向验证

发一个带唯一可搜字符串的请求,比如 ZRTEST-7c4a9b2f-please-do-not-store-this。然后在厂商所有暴露面里搜这串:控制台、账户导出接口、客服会话、错误追踪集成、示例 webhook。如果它在上游厂商日志之外的任何地方出现,这家就是在留存请求体。

抓取链路

同一个请求跑两次:一次直接打上游,一次走网关。把网关的出向 IP 加白(或者在你出口流量上做一次受控镜像),你可以字节级地确认网关转出去的 body 和你发的一致。任何偏差——注入了 system prompt、改写了与内容相关的请求头、压缩了响应导致 payload 变化——都说明这不是一个透明转发器。

看 SOC 2 / 渗透测试摘要

对一家正经厂商,要 SOC 2 Type II 报告或近期第三方渗透测试摘要。看 system description 里的在范围组件。如果描述里列了接触请求体的日志聚合系统、分析仓库、消息队列,那就是你的留存面。如果没有,这是一个强信号。

提防"安全例外"措辞

有些厂商会写:除"滥用预防所必需"之外不留存。这往往意味着一部分流量被镜像到了一个独立的审核系统。这可以接受,前提是审核管线本身也是零留存的、且只在内存里跑。问清楚:审核副本去了哪里、活多久?

BUZZ 在这张图里

BUZZ AI Gateway 就是按上面那个架构搭的。一把 API key 同时打通 Claude、GPT、Gemini、Grok。请求体和响应体是流式过去的——不写日志、不进数据库、不做跨用户回放、不转发给任何第三方分析或审核管线。一次请求结束后能活下来的只有那一行计费记录:模型名、token 计数、时间戳、user_id、状态、延迟。

接入只需改一行。把 Anthropic SDK 指向 https://buzzai.cc,或者把 OpenAI SDK 指向 https://buzzai.cc/v1。线协议和上游厂商完全一致,因为 BUZZ 不去改它。

# Anthropic SDK
from anthropic import Anthropic
client = Anthropic(
    base_url="https://buzzai.cc",
    api_key="sk-buzz-..."
)

# OpenAI SDK
from openai import OpenAI
client = OpenAI(
    base_url="https://buzzai.cc/v1",
    api_key="sk-buzz-..."
)

所有支持模型的价格都在 buzzai.cc/api/pricing 列出,实时模型目录和能力描述在 buzzai.cc/models。两个端点都公开且机器可读,你可以直接接进自己的分发逻辑,不用去爬营销页。

一句话总结

零留存意味着:载着你客户数据的字节,不会落到网关的磁盘上。这不是口号,是你能用一次抓包验证的架构属性。如果你的中转站能在控制台里给你看"最近的 prompt",那它就有留存。如果它现在没有、未来也不会有,那它就是你真正想要的那种东西。

试试 BUZZ AI Gateway  ·  查看模型价格  ·  浏览模型

常见问题

对 LLM 网关来说,零留存到底是什么意思?

零留存意味着请求体和响应体永远不会写入任何持久化介质。它们只在进程内存里存活到上游模型回完为止,响应一结束就被释放。没有日志文件、没有数据库、没有分析管道、没有调试快照。

Token 计数算个人可识别信息(PII)吗?

孤立看,token 计数就是没有语义内容的整数,无法反推出 prompt 文本。多数监管机构和审计师把 token 计数这种聚合计费指标视为运营数据,而不是 PII。token 计数 + user_id 的组合可能落在你自己的隐私政策范围内,但真正承载监管重量的是 prompt 内容本身。

调试日志怎么办?不留 prompt 怎么排查故障?

零留存网关只记录排查传输层问题需要的元数据:HTTP 状态码、上游延迟、错误分类、上游返回的 request ID。它不记录 prompt 或 completion 内容。如果某个故障真的没法靠元数据定位,工程上的回应是补一个结构化错误分类,而不是开始留存请求体。

如果响应是流式返回的,中途断了,计费怎么对?

Token 计数会随上游响应头和 SSE 流的最后一个 usage 事件返回。流结束时,网关解析这些计数并写一行计费记录,响应体本身不会被持久化。如果流中途中断,网关会带着状态标记记录部分用量,方便后续退款和重试。

零留存会阻止跨用户缓存吗?

会。一个真正零留存的转发器不会缓存某个用户的 completion 再回放给另一个用户。跨用户缓存等于把一个用户的 prompt 上下文借给另一个用户用,即便缓存只在内存,也是机密性泄露。如果一个网关把"跨客户缓存命中"当卖点,它就不是零留存。

零留存和不训练政策有什么区别?

不训练政策说的是"我们不会拿你的数据去训模型"。零留存说的是"我们根本不存你的数据"。前者更弱,因为它仍然允许存储、人工审阅、内部分析、泄露风险。零留存把数据从威胁面里整个拿掉。

零留存网关能支持内容审核或安全过滤吗?

可以,但过滤器必须在内存里、与请求生命周期绑定地跑,且只输出判定结果(放行 / 阻断 / 分类)。被检视的文本不能被持久化。许多合规团队接受内存内的安全分类,前提是内容不留过请求边界。

零留存对 HIPAA、GDPR、SOC 2 有帮助吗?

零留存有助于满足 GDPR 的数据最小化要求、SOC 2 的隐私和保密性原则,并且通过限制 PHI 落地的位置来缩小 HIPAA 范围。它本身不是一套完整的合规方案,但能把最大的一类风险——厂商侧 prompt 存储——直接消除。剩下的合同、访问控制、应急响应你自己那侧仍然要做。

我怎么核实一个网关真的是零留存?

逐字读服务条款里的留存条款,要厂商出数据流图,索取 SOC 2 报告或渗透测试摘要,然后跑一次反向验证:发一个带唯一标记的 prompt,在厂商所有暴露面(控制台、日志、工单系统)里搜它。再做一次字节级抓包对比,确认你、网关、上游之间没有第三方存储跳点。

BUZZ AI Gateway 是零留存的吗?

是。BUZZ 按透明转发架构搭建。请求体和响应体只在上游调用期间留在内存里,只有计费元数据(模型名、token 计数、时间戳、user_id、状态、延迟)会持久化。模型目录见 buzzai.cc/api/pricing,接入细节见 buzzai.cc

结语

对软件来说,留存是默认行为——存储很便宜,工程师也喜欢有日志可看。但对一个夹在企业应用和模型上游之间的 LLM 网关,这个默认是错的选择。每一条被留下来的 prompt,都是未来的一次安全通报、未来的一次审计发现、未来某个对手抄走你壁垒的一次机会。这种留存的代价不会出现在月账单上,而是在事情出问题那天才浮现。

零留存网关把默认翻了过来。字节穿过、计数器统计 token、请求体消失,活下来的只有一张收据。如果你在评估一个 AI 网关,而厂商对"我的 prompt 在哪里"的回答不是"它们不在,而且这是证明这件事的架构图",继续找。

需要一个把 Claude、GPT、Gemini、Grok 收在一把 key 后面的透明零留存转发器,看 BUZZ AI Gateway、公开的价格端点、以及模型目录