私有部署的组成
推理、模型网关、检索、工具接入、可观测各管什么,一次知识库问答经过哪几站
私有部署在机房里分成推理、检索、工具三层,前面是一个模型网关,旁边是可观测。下文先列各个部分,再以知识库问答为例走一遍。知识库问答让企业的人用自然语言查自己的资料。它经私有部署的模型网关进入检索与推理,不经核心经营系统的模型网关;模型读得到原文,所以权限在检索阶段过滤。引擎、向量库任一更换,业务代码不改;业务依赖引擎专有字段时,这种换法不成立。
各个部分
私有部署由下面的部分组成。引擎和检索各自可评估、可替换,经营系统只与模型网关和检索服务打交道。
| 部分 | 管什么 | 对外接口 | 换掉它的条件 |
|---|---|---|---|
| 推理引擎 | 加载权重,连续批处理并发请求(以 vLLM 为例,continuous batching) | 不直接对外,经模型网关;指标端点供可观测抓取 | 业务用到的请求字段逐个回归通过 |
| 模型网关 | 统一入口:一套公开的 HTTP 请求格式,如对话 /v1/chat/completions、嵌入 /v1/embeddings;承担 TLS 与鉴权,按 token 限流,按任务路由到不同模型,故障时回退到备用模型 | 企业内网地址 | 不换,是契约本身 |
| 检索 | 知识库混合检索(向量与关键词)与重排,按文档权限过滤;知识库是被检索的对象,入库经切块、嵌入写进向量库 | 向量库只对检索服务开放 | 评测集得分不降;换嵌入模型要整库重嵌入 |
| 工具接入 | 经 MCP(Model Context Protocol)连接在用系统,读与写分开授权,写操作单独开通;知识库问答这条管线里的模型不拿工具,见下文 | 在用系统各自的接口,用户保持原有界面 | 随在用系统变更 |
| 可观测 | 显卡与引擎指标,每次调用的追踪与 token 用量;追踪服务部署在机房内,提示词与日志不外送 | 看板,见运维与升级 | 换引擎后重新核对抓取的指标 |
本页的模型网关是私有部署机房里的统一入口,此前各页称「接口层」,个别配图仍沿用旧称。它与核心经营系统的模型网关不是同一个部件:后者只给模型聚合数与令牌,投影白名单与输出契约见接入模型服务;那些保证不适用于私有部署的模型网关。
模型网关要自己承担鉴权与限流,原因在引擎自带的密钥覆盖有限。vLLM 的安全指南写明,它的访问密钥只覆盖 /v1、/v2 等前缀,/metrics 等端点不在其内,并建议把引擎放在反向代理之后,只开放要用的端点(vLLM 安全指南)。
接口契约
「兼容 OpenAI 接口」通常只是子集。Ollama 的文档写明它只支持 OpenAI API 的一个子集,logprobs、tool_choice、n 在对话接口里都不支持(Ollama 兼容性);vLLM 则在标准字段之外加了 structured_outputs 等扩展参数(vLLM 在线服务)。同一个请求在两个引擎上,能用的字段不同。
契约因此写成业务实际用到的字段清单。换引擎时,逐个字段回归,再跑评测集。核心经营系统的模型网关取同样的做法:接入模型服务的协议只取请求格式最通用的一种,不接工具。清单里出现引擎专有字段的那一天,换引擎就变成改业务代码,要在选型时当作一条代价写进记录。
一次问答的经过
图里蓝色的权限过滤站在召回之前,没有通过它的片段到不了模型。每一站有自己的失败方式,生成站另有一行出口控制:
| 站 | 做什么 | 怎样失败 | 设防要求 |
|---|---|---|---|
| 权限过滤 | 按提问者的身份,限定能检索到的文档范围 | 跨部门泄漏;或过滤后召回变少 | 条件写进检索查询,向量库分区;验收用例见上线前安全核对 |
| 混合召回 | 向量相似度与关键词匹配各召回一批,合并 | 只用一路,另一路能找到的片段漏掉 | 两路合并,召回参数随索引版本记录 |
| 重排 | 对候选片段按相关度重新排序,取前几条 | 多一站延迟,多一个模型要部署 | 用评测集量收益,再决定是否保留 |
| 生成 | 模型读问题与片段,写回答 | 文档里的指令被当作指令 | 不靠提示词设防,见下文 |
| 生成的配套:外部内容标记与输出渲染 | 把检索到的片段标为外部内容,与指令分开;渲染回答时不自动加载其中的外部图片与链接 | 注入诱导模型插入指向攻击者地址的图片,带出对话内容;零出站只管服务端,用户网络能出站时仍成立 | 片段与指令分段并标明来源;前端对图片与链接做白名单 |
| 引用校验 | 核对回答里的来源是否真实存在 | 编造来源,或引用了没有权限的片段 | 来源必须落在本次召回且已通过权限过滤的集合里 |
权限过滤
权限要在检索查询里过滤,不能等模型写完再删。片段一旦进了提示词,模型就读到了它,输出里不显示不等于没有影响。OWASP 把这类风险列为 LLM08:访问控制不足或错位,会让人读到不该读的嵌入数据,多租户共用向量库时,上下文还会在用户之间串;它给的缓解办法是权限感知的向量存储,以及对数据集做严格的逻辑与访问分区(OWASP LLM08)。
过滤条件写进检索查询之后,还有一个容易踩的坑,出在近似索引上。pgvector 的文档写明:用近似索引时,过滤发生在索引扫描之后;条件命中 10% 的行时,按默认的 hnsw.ef_search 40,平均只能匹配 4 行。后果不是越权,是应该召回的片段没召回,回答变成「资料里没有」。文档给的办法有几种:过滤值很少时建部分索引,值很多时按值分区;0.8.0 起可以启用迭代索引扫描,让过滤后取到更多行(pgvector)。按部门分区时,查询带上部门条件,只扫对应的分区。
按个人授权到文档级时,分区数会失控,只能回到过滤加迭代扫描,或者在候选集上做精确扫描。选哪一种,取决于权限的粒度,要在选型时测。
混合召回与重排
单路向量检索会漏。Anthropic 的一篇文章报告了一组自测数字:在代码库、小说、论文等数据上,基线的前 20 条检索失败率为 5.7%;用 Contextual Embeddings 降到 3.7%,再加 Contextual BM25 降到 2.9%,再加重排降到 1.9%(Contextual Retrieval)。这是厂商自己的实验,数据不是中文企业资料,只能当作方向:加一路关键词、再加一站重排,通常值得试。
pgvector 的文档给出了做法:向量检索与 PostgreSQL 的全文检索合用,用倒数排名融合(RRF)或交叉编码器合并结果。重排模型可以由 vLLM 以 /rerank 之类的端点提供(vLLM 池化模型)。收益多大,只有企业自己的评测集能回答:问题、标准答案、来源文档三列,再加切片标签,如多跳、应拒答、跨部门。每次改动检索参数,都跑一遍并与上次对比。
生成与提示注入
「只根据上下文回答」写进系统提示,不是控制手段。OWASP 对间接提示注入的定义是:模型接收来自网站或文件等外部来源的输入,而文档里可以混着指令。该页还写到,检索增强与微调都不能完全消除提示注入,也不确定是否存在万无一失的防法(OWASP LLM01)。
所以设防放在模型之外:入库审核、权限过滤、模型无工具、引用校验。入库前审核文档来源,对应 OWASP LLM08 缓解清单里对知识来源的数据校验;LLM01 的缓解清单还要求把不可信内容与指令分开并标明。一份被投毒的文档会影响所有有权检索它的人,入库审核是其中唯一持续起作用的控制。
另有一条出口要堵:OWASP LLM01 的第 2 个场景里,网页中的隐藏指令让模型插入指向攻击者地址的图片,从而带出对话(OWASP LLM01)。回答在界面里渲染时,外部图片与链接要走白名单。
知识库问答与核心经营系统的调用面走不同的入口。它经私有部署的模型网关(TLS 与鉴权)进入检索与推理,不经核心经营系统的模型网关;模型能碰什么 不能碰什么里网关的投影白名单与输出契约保证,不适用于它。那一页写明,让模型读原文的场景要另做威胁模型。知识库问答的控制是:权限过滤、模型无工具、引用校验、入库审核;威胁与证据的完整对照见上线前安全核对。
引用校验
引用校验要核对:回答里的每个来源编号,必须落在本次召回且已通过权限过滤的片段里;回答引用的原句,必须能在该片段里找到。不通过的引用去掉并标记,整条回答没有任何有效来源时拒答。
这一站的边界要说清:它证明「来源是真的」,不证明「回答忠于来源」。回答可能引了一个真实的片段,却写出片段没有的结论。后者靠持续评测:Ragas 的 faithfulness 指标度量回答是否忠于检索到的片段,达线指标与阈值见私有部署概览的验收一节。
入库与换嵌入模型
入库是离线批处理,不在提问时发生:
| 步骤 | 做什么 | 要记下什么 |
|---|---|---|
| 切块 | 把长文档拆成适合检索的小段 | 切块参数、文档版本与权限标签 |
| 嵌入 | 把每块文本变成向量;语义相近的文本,向量也相近 | 嵌入模型名与版本、向量维度 |
| 写库 | 向量与原文片段、权限标签一起写入向量库 | 索引版本 |
提问与入库必须用同一个嵌入模型、同一个版本。「两边向量维度一致」只是必要条件:两个模型即便维度相同,各自的向量空间也不可比,混着用,检索结果没有意义。
因此换嵌入模型的做法是整库重嵌入:新建一套索引与旧索引并存,用评测集对比得分,通过后切换提问路径,旧索引保留到验收结束,以便退回。代价是重嵌入占用的 GPU 时间,以及新旧两份索引并存期间的存储。向量维度还受索引上限约束,pgvector 的 vector 类型索引上限是 2,000 维(pgvector),选嵌入模型时要先对照。
限制与不适用
- 各站是设计控制与验收要求,不是已发布产品的功能清单。
- 接口契约只覆盖公共字段。业务依赖 logprobs、结构化输出这类引擎专有能力时,契约会漏,换引擎就要改业务代码。
- 换嵌入模型不在契约之内,它等于整库重新嵌入。
- 混合召回与重排多一站延迟,重排还多一个模型的显存。
- 知识库问答里模型读得到文档原文,与核心经营系统调用面只给聚合数与令牌不同,要另做威胁模型。
其他做法
| 做法 | 它解决什么 | 为什么不用 |
|---|---|---|
| 把引擎专有字段放进业务契约 | 用上结构化输出等好处 | 模型接入只取最通用的请求格式;专有字段让换引擎变成改业务代码 |
| 让模型调用工具去查库 | 少一层检索管线 | 模型接入不接工具;工具、私有数据与读入不可信内容凑在一起,一次注入就能造成泄露,见模型能碰什么 不能碰什么。这条管线取同一条原则:模型不拿工具;区别是这里模型读得到原文,所以靠权限过滤、引用校验和入库审核补上 |
| 靠系统提示限定回答范围 | 实现最快 | 边界不靠让模型更听话;文档里的指令与系统提示在模型眼里是同一种文本 |
验收时可以问的问题
- 请用最小部门的资料测一次过滤后的召回量,并说明向量库用的是近似索引还是精确扫描。
- 检索日志里的问题与片段是业务机密,留存期限与日志不可改写之间怎么取舍,请在合同中约定。
- 请指给我看入库文档的来源由谁审核、审核记录放在哪里。
- 换嵌入模型时,新旧索引并存多久、由谁确认退回的条件,请在合同中约定。
相关页
- 私有部署概览:自建的判断方法与验收用的数。
- 估算显卡数量:嵌入与重排模型怎样计入显存。
- 模型能碰什么 不能碰什么:经营系统调用面的模型边界。
- 接入模型服务:经营系统一侧怎样接入推理服务。