ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从大数据到大模型:我接手AI项目后,最先失效的是用了十年的老方法

从大数据到大模型:我接手AI项目后,最先失效的是用了十年的老方法 聊《我用大数据经验做了次 AI 项目最先失效的是旧方法》之前先说一句实在的别急着背概念先看它在真实项目里到底解决什么问题。摘要摘要从Hadoop生态转到大模型工程技术栈变了但真正让我踩坑的不是Python或LangChain而是权限控制、日志追踪和交付文档。这篇复盘我参与的一个RAG项目讲清楚为什么能跑通Demo和能交出去用之间差的不只是模型能力而是一套新的工程习惯。---目录大数据和大模型到底在交叉什么数据治理老本行还是新战场向量数据库换了个存储逻辑没变RAG数据管道从批处理到流式处理的思维切换落地项目权限和日志才是真正的分水岭总结---大数据和大模型到底在交叉什么我转大模型的时候简历上写的是熟悉Hadoop、Spark、Flink面试时对方问的第一个问题不是让我手写SQL而是你怎么处理RAG里的权限隔离。我愣住了。做过大数据的人都知道权限管理是基础中的基础。Hive有RLSRow Level SecuritySpark有Kerberos数据仓库有行级/列级权限控制。但这些能力在大模型项目里几乎没有人主动去实现。我参与的那个项目是一个企业内部的知识问答系统。技术选型很标准向量数据库用MilvusRAG框架用LangChain模型调用的API走通义千问。Demo做得很漂亮业务方很满意然后就到了集成阶段。第一个问题就来了不同部门的人问同一个问题返回的答案应该不一样吗比如HR问年假政策研发问的也是年假政策但返回的内容需要按部门过滤。这在传统数据仓库里是基础需求但在大模型项目里很少有人主动设计这个机制。我当时的第一反应是在查询阶段加过滤条件。但问题没那么简单因为RAG的检索过程是向量相似度匹配不是SQL查询。你没办法直接加WHERE子句。这迫使我重新思考整个数据管道的设计。数据治理老本行还是新战场数据治理是我在大模型项目里最感知的能力迁移点。传统数据治理关注的是数据质量、元数据管理、数据血缘。这些在大模型项目里依然重要但优先级发生了变化。以前我们做ETL关注的是数据从A系统到B系统的完整性。现在做RAG关注的是知识片段从原始文档到向量入库的准确性以及每次查询时的上下文完整性。我接手的项目里有一个关键问题文档更新后向量库里的旧数据怎么处理传统做法是增量更新但向量数据库的更新成本比关系型数据库高得多。Milvus支持partial update但需要精确的向量ID。如果文档被修改了旧的向量必须被删除新的向量需要重新生成。我设计的方案是# 文档更新时的向量处理逻辑 def update_document_embeddings(doc_id: str, new_content: str, collection: str): 更新文档向量先删除旧向量再插入新向量 # 1. 查询旧向量ID old_vectors client.query( collectioncollection, filterfdoc_id {doc_id}, output_fields[embedding_id] ) # 2. 删除旧向量 if old_vectors: client.delete( collectioncollection, ids[v[embedding_id] for v in old_vectors] ) # 3. 生成新向量 new_embeddings embedder.encode([new_content]) # 4. 插入新向量 client.insert( collectioncollection, data{ doc_id: [doc_id], content: [new_content], embedding: new_embeddings, embedding_id: [str(uuid.uuid4())] } )这段代码看起来简单但背后有一个关键决策删除旧向量还是直接追加追加更简单但会导致检索结果包含过时信息。删除再插入更准确但需要保证ID的对应关系。我们最终选择了后者因为业务方明确要求答案必须是最新的。这个决策背后是我在大数据时代养成的习惯数据准确性永远比实现成本重要。向量数据库换了个存储逻辑没变向量数据库是RAG的基石但很多人把它当成黑盒。我见过太多项目选型时纠结于Milvus和Pinecone却没人问你的数据量级是多少查询延迟要求是多少是否需要实时更新这些问题的答案决定了你的存储方案。我们项目的数据规模是约50万条文档片段每条片段约500字向量维度1536OpenAI的text-embedding-ada-002。查询QPS峰值约50。这个规模用Milvus完全够用。但如果数据量到千万级或者需要更低的延迟可能需要考虑其他方案比如FAISS加缓存层或者专门的向量数据库如Zilliz Cloud。向量数据库的另一个关键是元数据过滤。纯向量检索的问题是它不知道数据的语义只认相似度。如果你的文档有部门、时间、类型等属性必须把这些信息作为元数据存进向量数据库查询时才能做过滤。# 带元数据过滤的向量检索 results client.search( collectionknowledge_base, data[query_embedding], limit5, filterfdepartment {user_department} and status active, output_fields[content, doc_id, source] )这个filter条件就是权限控制的底层实现。不同部门的人查询时携带不同的department值返回的结果自然不同。传统大数据项目里这种过滤是通过数据仓库的权限表实现的。大模型项目里它变成了向量查询的一个参数。逻辑没变实现变了。RAG数据管道从批处理到流式处理的思维切换大数据时代的管道思维是批处理为主流处理为辅。大模型时代的管道思维是流处理为主批处理为辅。为什么因为用户期望的是实时响应。你问一个问题系统要在几秒钟内返回答案。这意味着检索、重排序、生成必须在一个合理的延迟内完成。我们项目的管道设计如下1. 查询解析用户输入的问题先做意图识别判断是否需要走RAG还是直接回答2. 向量检索将问题转化为向量在向量数据库里检索相关片段3. 重排序对检索结果做精排筛选出最相关的3-5条4. 上下文构建将筛选后的片段组装成Prompt5. 模型生成调用大模型生成最终答案6. 结果缓存将问答对存入缓存相同问题直接返回这个管道里最容易出现问题的环节是第2步和第3步。向量检索的召回率决定了答案的准确性重排序的质量决定了答案的精准度。我们最初用的是纯向量检索结果经常返回不相关的内容。后来加了BM25混合检索召回率提升了约30%。重排序用的是Cross-Encoder模型比双塔模型更准确但延迟更高。我们在性能和准确性之间做了权衡最终选择了在向量检索召回Top-20的基础上用Cross-Encoder重排Top-5。# 混合检索 重排序 def hybrid_search(query: str, user_department: str, top_k: int 5): # 1. 向量检索 query_embedding embedder.encode([query]) vector_results client.search( collectionknowledge_base, data[query_embedding], limit20, filterfdepartment {user_department}, output_fields[content, doc_id, score] ) # 2. BM25检索 bm25_results bm25_search(query, top_k20) # 3. 融合排序 merged rerank_by_reciprocal_rank(vector_results, bm25_results, k60) # 4. Cross-Encoder重排序 final_results cross_encoder_rerank(query, merged[:20], top_ktop_k) return final_results这段代码看起来不复杂但背后的调优过程很痛苦。BM25的参数、融合权重、重排序的阈值都需要根据实际数据调整。这就是大模型工程的真实状态模型能力只是基础工程调优才是核心竞争力。落地项目权限和日志才是真正的分水岭我参与的那个项目最终上线时最让业务方满意的不是答案的准确性而是系统的可观测性。之前我们做的所有Demo都没有日志。用户问了一个问题系统返回了答案但没人知道这个答案是怎么来的。如果答案错了也找不到原因。上线后业务方第一个问题就是这个答案是从哪篇文档里查出来的这迫使我们加了两样东西溯源日志和权限审计。溯源日志记录每次查询的完整链路用户ID、问题、检索到的文档片段、生成的答案、使用的模型、延迟时间。这样出了问题可以回溯。权限审计记录每个用户的访问行为什么时候问了什么问题、返回了什么答案、是否被过滤了某些内容。这样可以看出权限控制是否生效。# 查询日志记录 def log_query( user_id: str, query: str, retrieved_docs: list, generated_answer: str, latency_ms: float, model: str ): log_entry { timestamp: datetime.utcnow().isoformat(), user_id: user_id, query: query, retrieved_docs: [ {doc_id: d[doc_id], score: d[score]} for d in retrieved_docs ], generated_answer: generated_answer, latency_ms: latency_ms, model: model } # 写入日志存储 logger.info(json.dumps(log_entry, ensure_asciiFalse)) # 写入审计表用于权限追踪 audit_client.insert(query_audit, log_entry)这段代码很简单但它的价值巨大。上线一个月后业务方反馈了三个问题其中两个可以通过日志快速定位原因。第一个问题是某个用户反馈答案不准确。通过日志我们发现他检索到的文档片段确实包含错误信息是因为文档本身过时了。第二个问题是某个部门的用户反馈看不到某些答案。通过权限审计我们发现他的部门属性配置有误导致过滤条件不生效。这两个问题如果没有日志和审计排查起来会非常困难。这就是大模型工程化和传统大数据工程化的共同点能跑通Demo是入门能稳定交付是本事能解释失败才是专业。总结从大数据转大模型技术栈的变化是表面的工程思维的变化才是本质的。我们这代人习惯批处理、习惯SQL、习惯数据仓库的权限模型。但大模型工程要求我们适应流式处理、适应向量检索、适应新的权限和日志机制。我最大的收获是不要抱着旧方法不放。大数据的经验很有价值但它不是万能的。权限控制、日志追踪、可观测性这些在大模型项目里同样重要甚至更重要。如果你也是从大数据转过来的我的建议是先把RAG的完整链路跑通然后重点补齐权限和日志这两个短板。这不是技术的短板是工程思维的短板。能写Demo的人很多能搞定权限和日志的很少。后者才是团队真正需要的人。资料展示下面是我整理的AI大模型学习资料和工具包预览适合收藏后按主题逐步学习。如果你想看完整资料目录可以在评论区留言「资料」也欢迎告诉我你更关注AI大模型里的哪类内容。
返回列表