聊《一个大数据项目改成 AI 流程后,最难的部分完全变了》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。
摘要
做大数据转大模型(LLM)工程这几年,我见过太多人把精力全砸在怎么调优 Prompt、怎么搭建复杂的 RAG 检索链上。Demo 跑起来,准确率 90%,老板满意,同事鼓掌。但一旦进入集成测试或灰度上线,系统不是崩了,就是查不到数据,甚至更可怕的是——它擅自修改了不该碰的生产库配置。
这时候你才发现,之前引以为傲的向量检索优化,在“谁有权读什么”、“写了日志没”、“出错了谁背锅”这些工程化问题上,显得那么苍白。
对于从 Hadoop/Spark/Flink 体系转过来的数据工程师来说,最大的误区不是不懂算法,而是思维惯性。我们习惯了批处理的确定性,却忘了 LLM 应用本质上是高并发、非确定性的服务。今天不聊虚的模型架构,聊聊在小团队资源有限的前提下,如何跨过 Demo 到生产的这道“鬼门关”。
目录
- 1. 大数据与大模型的交叉点:从“清洗”到“治理”的范式转移
- 2. 小团队的陷阱:避免过度设计的 RAG 管道
- 3. 向量数据库:不仅仅是存向量,更是存“边界”
- 4. RAG 数据管道与可观测性:日志是最后的救命稻草
- 5. 落地项目复盘:权限与日志的生死线
- 总结
1. 大数据与大模型的交叉点:从“清洗”到“治理”的范式转移
很多数据工程师觉得,转 LLM 就是换个工具链。其实不然。
在传统的 ETL 流程中,我们的核心目标是数据的准确性和完整性。数仓里的数据错了,是事故;但在 RAG(检索增强生成)场景下,数据稍微有点噪声,模型可能反而能容错。然而,真正的痛点转移到了语义映射和访问控制。
以前我们关注的是user_id能不能关联到order_table,现在我们要关心的是:当 Agent 试图调用 API 查询订单时,它是否有权查看该用户的隐私字段?
这里有一个具体的取舍案例。我之前负责的一个内部知识助手项目,初期为了追求检索速度,直接给了 Agent 对底层 MySQL 的只读权限。结果在一个压力测试中,Agent 因为上下文窗口溢出,触发了错误的 SQL 注入逻辑,虽然没删库,但锁表了半小时。
结论很残酷:在 LLM 时代,数据治理的第一原则不再是“清洗”,而是“隔离”。你必须假设你的模型是不可信的,或者至少是“不可控的”。
2. 小团队的陷阱:避免过度设计的 RAG 管道
很多人一上来就搞 GraphRAG、搞多路召回、搞重排序(Rerank)。对于初创团队或中小项目组,这是致命的过度设计。
我的建议是:先跑通,再优化;先加锁,再加速。
一个简单的 RAG 管道,在数据工程师眼里应该是这样的:
1. 切片(Chunking):别搞太细,也别太粗。基于段落或逻辑块切片,保留元数据(Metadata)。
2. 向量化:选一个性价比高的开源 Embedding 模型,比如 BGE-M3 或 text-embedding-3-small。
3. 存储:Vector DB 只是容器,核心在于你能不能快速打上过滤标签。
这里有个代码层面的细节,很多人会忽略。在存入向量数据库时,一定要把权限标签作为 Metadata 存入,而不是后期再查库过滤。
# 伪代码示例:存入向量数据库时的关键操作 from langchain.vectorstores import FAISS from langchain.embeddings import SentenceTransformerEmbeddings def ingest_documents_with_acl(docs, user_permissions): """ docs: List[Document] user_permissions: Dict[str, Set[str]] # 用户ID -> 允许访问的部门/标签集合 """ embeddings = SentenceTransformerEmbeddings(model_name="BGE-M3") # 关键点:在创建 Document 对象时,将权限信息注入 metadata for doc in docs: # 假设 doc.metadata 中已经包含了 'department' 字段 # 我们需要根据当前用户的权限,动态决定这条数据是否对该用户可见 # 注意:这通常在查询时动态判断,但为了演示,我们可以预先打标 doc.metadata["acl_level"] = get_acl_level(doc.metadata.get('dept', 'public')) vector_store = FAISS.from_documents(docs, embeddings) return vector_store这段代码看起来简单,但它解决了一个大问题:权限预计算。不要在每次推理时去查一遍权限表,那太慢了。要在数据摄入阶段就把“谁能看”这个逻辑固化进去。
3. 向量数据库:不仅仅是存向量,更是存“边界”
在使用 Milvus、Pinecone 或 Weaviate 时,数据工程师容易陷入“检索准确率”的单一指标崇拜。但实际上,对于生产环境,过滤效率和权限隔离才是生命线。
如果你用的是关系型数据库作为后端存储,务必使用混合搜索(Hybrid Search)。即:向量相似度分数 + 元数据过滤。
举个例子,某金融客服系统,要求 Agent 只能回答公开的市场分析,不能回答内部风控策略。如果在检索阶段没有通过 Metadata 严格过滤,模型就可能“幻觉”出内部数据。这不是模型笨,是管道设计没留后门。
实战建议:
- 不要把所有数据都扔进 Vector DB。敏感数据走传统 API 查询,非敏感数据走向量检索。
- 给 Vector DB 设置严格的 IP 白名单和 API Key 权限。这和保护你的 Kafka Topic 一样重要。
4. RAG 数据管道与可观测性:日志是最后的救命稻草
在大模型应用中,最让人头疼的不是模型回答错了,而是你不知道它为什么错。
传统软件有 Stack Trace,LLM 应用有一堆中间变量:Prompt 长什么样?检索到了哪些文档?Token 消耗了多少?决策路径是怎样的?
对于小团队,不要搞复杂的 Jaeger 链路追踪。先从结构化日志做起。每一个 Agent 的请求,必须记录以下信息:
1. Input Query:用户的原始问题。
2. Retrieved Context IDs:检索到的文档 ID 列表。
3. Final Response:模型生成的最终答案。
4. Latency & Cost:耗时和 Token 费用。
5. User ID & Permission Level:谁问的,有什么权限。
下面是一个简单的日志埋点思路:
import logging import json logger = logging.getLogger("llm_agent") class ObservabilityMiddleware: def __init__(self, next_handler): self.next_handler = next_handler def handle_request(self, request_data): start_time = time.time() log_entry = { "trace_id": generate_uuid(), "user_id": request_data.get("user_id"), "query": request_data.get("query"), "timestamp": datetime.now().isoformat() } try: # 执行核心逻辑 response = self.next_handler(request_data) # 记录成功日志 log_entry.update({ "status": "success", "latency_ms": (time.time() - start_time) * 1000, "response_preview": str(response)[:500] # 截断以防日志过大 }) except Exception as e: # 记录错误日志 log_entry.update({ "status": "error", "error_msg": str(e) }) raise finally: logger.info(json.dumps(log_entry))有了这些日志,当线上出现“答非所问”或“权限违规”时,你才能反查是检索错了,还是 Prompt 被劫持了,亦或是模型本身的问题。
5. 落地项目复盘:权限与日志的生死线
回到开头提到的那个项目。在重构后,我们做了两件事:
1. 引入 RBAC(基于角色的访问控制)中间件:在向量检索前,强制拦截并校验用户权限。如果用户无权访问某类文档,直接在检索层将其剔除,确保模型根本看不到这些数据。
2. 全链路日志审计:所有对敏感数据的访问请求,无论成功失败,全部写入独立的审计日志表,并与现有的 SIEM(安全信息和事件管理)系统集成。
结果如何?
- 安全性:彻底杜绝了越权回答的风险。
- 排障效率:以前排查一个问题平均需要 4 小时(因为不知道模型看了啥),现在平均 15 分钟(直接查日志 trace_id)。
- 客户信任:因为可观测性强,我们在与客户汇报时,能拿出确切的证据链证明 AI 没有泄露机密,这比任何算法优化都更有说服力。
总结
从大数据转向大模型,技术栈的变化只是表象。核心的挑战在于工程思维的转变。
以前我们追求的是数据的“准”,现在我们更要追求系统的“稳”和“控”。对于数据工程师而言,不要沉迷于各种花哨的 Agent 框架或复杂的 Prompt 工程。先把权限控制好,把日志打清楚,把管道隔离好。
这才是让 LLM 应用从 Demo 走向生产、从小团队走向大规模部署的真正护城河。毕竟,在 AI 时代,可控性比智能性更稀缺。
资料展示
下面是我整理的AI大模型学习资料和工具包预览,适合收藏后按主题逐步学习。
如果你想看完整资料目录,可以在评论区留言「资料」;也欢迎告诉我你更关注AI大模型里的哪类内容。