技术思考问题35:DeepSeek开搜索,RAG白建了?

DeepSeek把搜索塞进API,企业RAG是不是白建了?

搜索能力可以买,回答的责任买不走。

读者 正在评估"把企业RAG换成API自带搜索"的架构师

痛点 公网搜索便宜到让人怀疑自建检索是浪费

现在读 一次越权回答的代价,远高于省下的检索成本

读完 拿到一条公域可买、私域自控的分界线与四个落地动作

旧方案 自建爬虫 + 清洗 + 向量库 + 重排,人工维护语料

|

v

新需求 API 侧已提供网页 Search / Fetch,覆盖与时效强于自建

|

v

冲突 能搜到不等于有权答,租户、权限、时点、保密都不在供应商侧

|

v

后果 检索全托管,等于把"答错谁负责"一起托管出去

我是老李,做架构评审时常被问到同一个问题:外面都能搜了,我们自己那套检索还留几层?

据 DeepSeek 官方文档,其 API 侧已开放搜索类接口,具体能力、计费与配额需按当前官方文档核验(见更新日志与Search 接口文档)。这意味着"公网检索"这一层,确实可以外购。

真正的问题不在能不能搜,而在搜完之后敢不敢直接答------尤其当你的知识库里躺着合同、报价和客户名单时(可参考架构文章推荐)。

那自建 RAG 到底还剩哪几层?

把 Search 直接接在内部知识库前面,最先出事的会是什么?

凭什么判断哪些环节能外包、哪些必须自己扛?

01、故事

一次方案评审,投影上放着一张老图:爬虫、清洗、切分、向量库、召回、重排、拼 prompt。会上有人提了一句------DeepSeek API 已经有 Search/Fetch 了,这张图还留几层?

任务是:把"检索"这个词拆开,分成"谁能搜到"和"谁有权答"两件事,再分别决定买还是做。

讨论很快分成两派。一派说公网覆盖和时效,自建永远追不上,索性全换;一派说内部数据一泄露就是事故,一步也不能退。两派都没错,错在把两件事混成了一件。

真正要回答的不是"要不要自建 RAG",而是"哪些检索结果一旦答错,业务承担不起"。

能力可外购

责任难外包

先问敢不敢

再问快不快

02、问题

旧方案的失效点很清楚:自建公网检索,覆盖面和时效的维护是长期负担,更新没有尽头。

新诱惑也很清楚:一个接口就把网页搜索和抓取拿回来。

业务影响不在"慢",在"错"。用户问内部制度,系统从公网抓了一篇同名文件,答得头头是道,来源与版本都不是你的。

技术表现是:召回命中,权限没判。相似度给了一个"看起来很像"的文档,而它本不该出现在这个租户、这个时点、这个人的答案里。

可验证的完成标准只有一条:每条答案都能给出 source、date、tenant、authority 四要素,缺一不可入答。

旧路贵且慢

新路快且险

标准先立住

再谈省多少

03、原理

反直觉判断:企业检索系统真正的质量指标不是召回率,而是"越权答案的拦截率"。召回率高只说明你捞得多,拦截率才说明你答得对。

第二个反直觉判断:搜索是能力,权限是事实。能力可以采购,事实必须自己维护。网页搜索本质是拼装公开信息,它不知道你公司的组织架构、合同归属和保密等级。

第三点容易被忽略:时点一致性。网页是活的,今天抓到的政策和昨天不同;企业事实有生效与失效区间,答案必须锚定时间。

所以供应商给的准确率分数,不是你的批准名单。它衡量的是公网问答的相对表现,不是你内部哪条数据能对谁可见。

相似非授权

命中非可答

权限是事实

不是相似分

04、架构

输入 用户问题 + 租户ID + 身份

|

v

模块 路由器:公域 Search / 私域检索

|

v

数据/状态 租户标签 · 权限表 · 生效日期

|

v

处理 出站脱敏 → 检索 → 证据闸门 → 答案组装

|

v

输出 带来源/日期/租户的可追溯答案,或拒答

边界:公域路由只处理公开事实,私域路由只处理授权事实;两条路都不允许"先检索后过滤"。收益是越权面收窄、责任可追。代价是多了一层路由与闸门,延迟与运维复杂度上升。适用条件:只要存在多租户或敏感文件,这套结构就必须有。

一路分公私

一闸定取舍

出站先脱敏

入答留证据

05、实战一次

环境:Python 3.10 以上,仅标准库。以下为最小 V1,未在当前环境实测,以下为预期结果。

from dataclasses import dataclass

@dataclass

class Hit:

source: str # public / private

tenant: str

doc_tenant: str # 公域记为 *

date: str

text: str

def route(q: str) -> str:

private_kw = ('合同', '报价', '客户', '内部', '制度')

return 'private' if any(k in q for k in private_kw) else 'public'

def gate(hits, tenant):

ok = \[\]

for h in hits:

if h.source == 'private' and h.doc_tenant != tenant:

continue # 越权,直接挡

if not h.date:

continue # 无时点,不作证据

ok.append(h)

return ok

启动与请求:

hits = [

Hit('private', 't1', 't1', '2025-09-01', '内部报价口径'),

Hit('private', 't1', 't2', '2025-09-02', '他租户合同摘要'),

Hit('public', 't1', '*', '2025-10-17', '公开行情'),

]

print(gate(hits, 't1'))

示例输出:

Hit(source='private', doc_tenant='t1'), Hit(source='public', doc_tenant='\*')

V1 跑通了:跨租户那条被挡住,公域那条保留。问题也留在了这里------公域结果没经过出站脱敏,路由只靠关键词。

先跑通最小

再暴露最大

代码不省略

结论才站住

06、排查

现象一:某租户的答案里出现另一租户的合同摘要。

怀疑:向量库的租户过滤没生效。

检查:看检索日志里过滤发生在 top-k 之前还是之后。

证据:日志显示先取 top-k,再按 doc_tenant 过滤。

根因:过滤写在排序后,候选集里已经混入越权文档。

修复:把租户条件下推到检索语句,作为前置过滤。

现象二:出站查询里带出了客户证件号。

怀疑:拼 prompt 环节没做脱敏。

检查:比对入口日志与出站日志。

根因:脱敏只做在入口,出站二次拼装又把原文放回去了。

修复:出站再做一次 PII 与商业秘密扫描,命中即拦截或改写。

错误尝试: 一开始我们调高了相似度阈值,想让"不像"的结果自动掉出去。这没用------越权文档往往和问题长得非常像,相似度和权限是两个维度,阈值治不了授权问题。

先看证据链

再改参数表

阈值治不了

权限类的病

07、优化

根因:路由靠关键词、过滤在排序后、脱敏只有一次、结果没有证据元数据。

修改:一是把公域与私域拆成独立路由,各自带自己的约束;二是租户条件前置到检索;三是出站增加脱敏审计;四是所有命中必须携带来源、日期、租户标签,再过证据闸门。

原因:前三条把"不该出现的"挡在生成之前,第四条让"已经出现的"可被追溯与复核。

新行为:无来源或无时点的结果不进答案;高风险问题走白名单与人工复核,没把握时走拒答路径。

验证:用黄金集对比公域与私域两条路的准确率、单次成本与 P95 延迟,先小流量灰度,不拿供应商分数当验收标准。

根因定动作

动作带验证

不加新概念

只补真缺口

08、演进

同一输入

|

±-V1 单一检索 + 事后过滤

| 代价:越权面大,责任无法追溯

|

±-V2 公私分路由 + 前置隔离 + 证据闸门 + 出站脱敏

| 代价:延迟与运维成本上升,需维护权限表

|

Trade-off

得到:责任可追、越权可挡

失去:一部分"能搜到就答"的便利

边界:公域事实继续外购,私域事实与授权判断自持

正确性上,V2 把权限判定前移;稳定性上,多一层闸门就多一个故障点;复杂度上,路由与脱敏都需要持续维护;成本上,外购搜索省了爬虫,但省不掉治理;适用范围上,多租户、涉密、金融保险这类场景必须走 V2;遗留问题是证据闸门的判定规则仍需要人维护。

一图看两版

各算各的账

得到与失去

写在同一行

09、洞见

9.1 能搜到不等于有权答

反直觉判断:把搜索接进来,最先暴露的不是覆盖面不足,而是权限判定缺失。检索越强,越权面越大。

9.2 采购的是覆盖率,自建的是授权边界

反直觉判断:越是想省钱全托管,越需要自己维护一份权限表。省下的是爬虫,省不掉的是治理。

9.3 先列"绝不能错",再谈能搜多少

逆向思考的用法:先写下哪些检索结果一旦答错就不可接受------工资、合同、客户名单、监管口径------再倒推数据隔离、脱敏与审计。顺序反过来,就会先被覆盖率说服。

9.4 黄金集是唯一能比较两条路的尺子

公域接口和企业私域检索不能靠感觉比较。准备一批带标准答案的问题,同时量准确率、成本与 P95 延迟,才有讨论基础。没有黄金集,所有结论都是情绪。

判断要有据

洞见不悬空

反直觉之处

最见真功夫

10、系统落地

原来有的:一套自建检索链路,覆盖公网与内部文档。

本篇新增的:公域/私域分路由、出站脱敏审计、带来源与日期的证据闸门、拒答路径。

现在能做的:公域事实直接采购,私域事实自持,每条答案可追溯。

还缺的:权限表与文档标签的自动化维护、高风险问题的白名单与人工复核流程、黄金集的持续更新。

下一步:先在低风险场景灰度公域路由,用黄金集做对照,再逐步放开;金融保险等高风险答案必须保留人工复核和拒答路径。

原有先盘点

新增可落地

缺口写清楚

演进才有路

11、小结

Q1 → 自建 RAG 剩下的不是检索能力,而是权限、租户、时点与证据链

Q2 → 最先出事的是越权答案:命中很像,但这个人无权看

Q3 → 公域事实可买,私域事实与责任不可外包,靠"绝不能错清单"划线

状态 → 一套可交付的分路由 + 脱敏审计 + 证据闸门的最小闭环

三问三作答

一图定状态

能交付什么

白纸黑字写

12、作业

12.1 理解题:为什么供应商的准确率分数不能当企业批准名单?

参考答案:它衡量的是公网问答的相对表现,不包含你内部的租户、权限、时点与保密要求。批准名单是授权问题,不是准确率问题。

12.2 实战题:给出一个最小证据闸门的判定条件。

参考答案:命中必须同时具备来源、日期、租户标签;私域命中的 doc_tenant 必须等于请求租户;缺失任一要素即不入答,落入拒答或人工复核。

12.3 排障题:答案里出现其他租户文档,先查什么?

参考答案:先查过滤发生在检索前还是排序后,看日志里 top-k 与 doc_tenant 的先后顺序;再看脱敏是否只在入口做过。不要先调相似度阈值。

12.4 架构判断题:是否可以把私域检索也整体交给外部搜索服务?

参考答案:不建议。私域检索的核心约束是权限与保密,属于事实与责任,不在外部服务的可控范围;可以外购公域能力,私域需自持隔离与审计。

题题有回响

答答有依据

练的是判断

不是背结论

13、思考

回到开头的争议:DeepSeek 把搜索塞进 API,企业 RAG 并没有白建,但必须重建。白建的是"我也能爬网页"这一层,没白建的是权限、隔离、证据和责任。判断一条检索链路能不能外包,只要问一句:答错了,是谁的责任?答不上来的那部分,就是你必须自己写的那几行代码。

搜索可以买

责任买不走

边界先划清

取舍自分明

相关推荐
小肝一下1 小时前
1.大模型介绍
python·langchain·大模型·ollama·langgrap
德林恩宝3 小时前
搜索 Agent 的两条路——训练一个,还是工程搭一个
人工智能·大模型·llm·agent
vibecoding7719 小时前
FLUX 3 Image Klein 实战:int8 量化 8GB 显卡跑商用文生图,ComfyUI 完整部署流程
人工智能·计算机视觉·大模型
console.log('npc')1 天前
第 10 章 更多业务模块扩展
前端·人工智能·大模型
comedate1 天前
DeepSeek API 接入教程:申请、Python 调用与常见坑
大模型·api·deepseek
海带紫菜菠萝汤1 天前
MemT 1.0 开源:128K 历史装进 40 MiB,记忆从外挂搬进模型里
人工智能·深度学习·ai·开源·大模型
Web3&Basketball1 天前
DeepSeek V4.1 Flash 实测:Token 砍半、Search API 跑通
数据库·人工智能·python·大模型·api调用·deepseek·推理优化
Web3&Basketball1 天前
Meta Muse 816B 实测:两台 Mac 本地跑通
macos·大模型·mac·本地部署·moe·显存优化·meta muse
goehou1 天前
LoRA 微调实战 - 显存、标签掩码与合并部署的踩坑记录(附清单)
深度学习·lora·大模型·模型微调