聊《我用大数据经验做了次 AI 项目,最先失效的是旧方法》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。
摘要
接了一个医疗知识库问答的 Agent 项目,Demo 跑得很顺,业务方看着满意。结果上线第一天,有人投诉看到了不该看的内容,而我翻遍日志,根本还原不了当时的权限判断过程。
那次之后我意识到一件事:数据工程师转型大模型,最大的坑不是模型选型,也不是提示词怎么写,而是权限、日志、可观测性这些工程化细节。
目录
- 大数据和大模型的交叉点
- 一个真实案例
- 排查过程
- 代码解释
- 失败原因
- 适用边界
- 总结
大数据和大模型的交叉点

很多人说大数据和大模型没关系,这个说法不准确。它们有交叉,但交叉点不是你想的那样。
传统数据工程强调精确查询、强一致性、数据血缘。大模型时代,向量检索的本质是模糊匹配,评估指标从准确率变成了召回率和回答质量,数据形态从结构化表格扩展到了非结构化文本甚至图片。
真正能复用的,只有两件事:数据治理的思路,以及管道设计的经验。
我做项目的时候,发现团队里做大数据出身的人有两个优势:第一,对数据质量敏感,知道脏数据会直接毁掉下游;第二,习惯写可维护的 ETL,不会为了 Demo 快就堆屎山代码。
但也有两个坑特别容易踩:一是过度设计权限体系,把简单的需求搞成迷宫;二是觉得有了模型就万事大吉,忽略了可观测性的基础建设。
一个真实案例

去年下半年,我给一个区域医疗集团做知识库 RAG。输入是一批结构化病历数据加非结构化诊疗规范,目标是在医生输入症状时,给出带依据的治疗建议。
技术栈选了 FAISS 做向量存储,Spark 做预处理,FastAPI 搭服务。Demo 阶段一切正常,检索准确率跑到 0.82,业务方很满意。
然后我们进入上线准备,这时候问题一个个冒出来。
第一个是权限。我设计了细粒度的 ACL 表,按科室、职级、患者授权范围三层过滤,查询逻辑复杂得连自己都理不清。第二个是日志。我只记录了向量查询的耗时和结果,没有记录权限判断的具体路径,出事的时候完全无法还原现场。第三个是评估。我用的是检索准确率,但业务方关心的是答案质量,两个指标根本对不上。
上线第一天,有医生反馈看到了超出自己权限范围的病例。监控里查不到任何异常,因为权限判断走了三层 JOIN,而日志里没有记录每层判断的结果。排查花了整整两天,才找到问题——某个角色的权限映射配置错了,但因为没有完整的审计链,没人能第一时间定位到具体哪一层出了问题。
这件事给我上了很大的一课。
排查过程
权限事故发生的当天,业务方反馈有人看到了不该看的内容。我当时的排查路径是这样的:
现象是"越权访问",但我不知道是哪个角色的用户、访问了哪条数据、走了哪个权限分支。
第一步,我先查了向量库的查询日志。日志里只有 embedding 请求和返回的 top-k 结果,没有任何权限相关的信息。这一步排除了向量库本身的问题。
第二步,我查了权限服务的接口日志。发现每次查询都会调用权限接口,但接口只返回了 pass 或 deny,没有记录判断依据。这一步说明权限服务的设计本身就存在问题。
第三步,我翻了代码,找到了权限判断的三层逻辑:科室归属、职级限制、患者授权。每层都是独立的 IF 判断,但没有任何一层记录了中间结果。
第四步,我重新加了一次日志,把每层权限判断的输入、输出、判断依据都记录下来,同时补上了请求的唯一 trace_id,这样可以把权限判断和向量查询关联起来。
排查的过程很痛苦,因为问题不在代码逻辑,而在缺少可观测性。这也是大多数数据工程师转型时会忽略的点:你们习惯了事后从数据里还原现场,但 Agent 的运行轨迹不是静态数据,是动态的执行路径,不记录就没法复盘。

代码解释
权限过滤这块,我后来改成了一个比较简洁的实现。思路是:不写复杂的权限树,先根据用户角色拿到允许的文档 ID 集合,然后在向量检索时把这个集合作为过滤条件。
def retrieve_with_permission(user_id: str, query: str, top_k: int = 5):
# 输入:用户ID、查询文本、返回条数
# 核心逻辑:先拿到用户的文档权限集合,再做向量检索
# 1. 获取用户允许的文档ID集合
allowed_doc_ids = get_user_allowed_docs(user_id)
if not allowed_doc_ids:
return [] # 异常处理:无权限时直接返回空
# 2. 对查询文本做 embedding
query_embedding = embed_text(query)
# 3. 在允许的文档ID范围内做向量检索
results = faiss_index.search_with_filter(
query_embedding,
filter=allowed_doc_ids,
k=top_k
)
# 输出:带权限过滤的检索结果
return format_results(results, allowed_doc_ids)
这段代码的核心逻辑有三步:先拿权限集合,再做 embedding,最后在权限范围内检索。关键点在于 FAISS 的 search_with_filter 方法,它可以在检索时直接应用布尔过滤,避免了先全量检索再二次过滤的性能损耗。
异常处理方面,get_user_allowed_docs 返回空的时候直接返回空列表,避免后续检索抛错。这个方法在权限配置错误的情况下也比较安全,不会因为权限系统故障导致整个查询崩溃。
权限集合的获取逻辑我没有展开,因为它取决于你们的权限模型设计。常见的有两种:一种是把权限表做成用户到文档 ID 的映射,查询时直接取;另一种是角色映射,先查用户角色,再查角色对应的文档范围。第一种适合权限粒度细的场景,第二种适合角色分类明确的场景。
我的建议是小团队用第一种,简单直接,排查也方便。
失败原因
那次项目我踩了三个主要的问题,拆开来讲。
第一个是权限过度设计。我一开始想做完整的 RBAC 加属性访问控制,每个文档打上多个维度的标签,查询时做多维过滤。结果查询慢、维护难,出问题时还找不到根因。后来简化成"用户直接绑定文档 ID 集合",查询性能提升了将近三倍,排查也方便多了。
第二个是日志缺失。我只记了查询结果和耗时,没有记录权限判断过程、模型调用的 prompt 和 response、用户的原始输入。这些东西不出事的时候没用,出事的时候就是救命稻草。
第三个是评估指标错位。我用检索准确率来评估,业务方用回答质量来评估,两边的数据对不上,导致上线后业务方满意度很低。后来我加了一个回答质量的评估维度,用规则加抽样人工复核的方式,才把指标对齐。
区分业务错误、配置错误和环境错误,我有一个简单的判断方法:业务错误是逻辑问题,代码没问题但结果不对;配置错误是参数或数据源的问题,代码没问题但配置错了;环境错误是基础设施的问题,代码和配置都没问题但环境不对。排查的时候先确认是哪一类,再针对性地解决,效率会高很多。
适用边界
这套方案有一些明显的适用边界。
第一,它适合中小规模的知识库,文档数量在十万级别以下。如果数据量更大,FAISS 的过滤检索性能会下降,需要考虑分片或者换成 Milvus 这类分布式向量库。
第二,权限模型适合角色明确的场景。如果你们的权限体系非常复杂,比如有动态权限、临时授权、跨部门共享,这套方案就不够用了,需要引入更完善的权限框架。
第三,日志和可观测性这里只做了最基础的实现。如果你们是合规要求高的行业,比如医疗、金融,需要对接专业的可观测性平台,比如 OpenTelemetry,把 trace、metric、log 打通。
取舍方面,小团队不要一开始就做完整的可观测性体系,先把最重要的东西记下来:权限判断路径、模型调用记录、用户输入输出。等规模上去了,再逐步完善。
总结
大数据工程师转型大模型,最大的障碍不是技术栈的变化,而是思维模式的转变。
你们习惯做精确的、可验证的、有明确标准的事情。大模型项目的很多环节是概率性的、模糊的、需要不断试错的。但这不代表旧经验没用,数据治理的思路、管道设计的经验、对数据质量的敏感度,这些都是真实可用的。
真正需要补课的,是权限控制、日志记录和可观测性。这些不是大模型的专属问题,是工程化的通用问题。但在大模型项目里,你们更容易忽略它们,因为 Demo 阶段这些问题不会暴露。
我的建议是,先做一个小型的内部项目,把权限、日志、可观测性这三件事做实,再去看更大的场景。Demo 能跑通只是及格线,能把这三件事做好,才是真正的门槛。
如果你正在准备转型,简历上不要只写"做过 RAG 项目",要写清楚你的权限设计思路、日志记录方案、以及你如何处理了权限事故。这些才是面试官真正想听到的东西。
资料展示
下面是我整理的AI大模型学习资料和工具包预览,适合收藏后按主题逐步学习。



如果你想看完整资料目录,可以在评论区留言「资料」;也欢迎告诉我你更关注AI大模型里的哪类内容。

517



被折叠的 条评论
为什么被折叠?



