向量数据库实战:选型、调优与落地~系列文章19:向量数据库 + RAG 融合实战:构建企业级知识库的完整链路

发布时间:2026/7/27 8:24:33
向量数据库实战:选型、调优与落地~系列文章19:向量数据库 + RAG 融合实战:构建企业级知识库的完整链路 向量数据库 RAG 融合实战构建企业级知识库的完整链路 本文是《向量数据库实战选型、调优与落地》专栏第 19 篇⏱️阅读时间约 15 分钟 开篇RAG 是向量数据库最核心的应用场景RAGRetrieval-Augmented Generation 检索增强生成简单说就是让大模型在回答之前先从你的知识库里查资料┌─────────────────────────────────────────────────────────┐ │ RAG 向量数据库 大模型 │ ├─────────────────────────────────────────────────────────┤ │ │ │ 没有 RAG 的大模型: │ │ 用户: 我们公司的退货政策是什么 │ │ AI: 抱歉我不知道贵公司的具体政策... │ │ │ │ 有 RAG 的大模型: │ │ 用户: 我们公司的退货政策是什么 │ │ → Step 1: 从向量知识库检索相关文档 │ │ → Step 2: 把检索到的文档 用户问题一起发给大模型 │ │ AI: 根据公司退货政策2025年3月更新 │ │ 自购买之日起30天内可无理由退货... │ │ │ └─────────────────────────────────────────────────────────┘️ RAG 完整架构┌─────────────────────────────────────────────────────────────┐ │ RAG 完整架构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 离线阶段数据入库 │ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │ │ │ 文档 │ → │ 分块 │ → │向量化 │ → │ 存储 │ │ │ │ PDF/ │ │Chunk │ │Embed │ │向量DB│ │ │ │ Word │ │ │ │ding │ │ │ │ │ └──────┘ └──────┘ └──────┘ └──────┘ │ │ │ │ 在线阶段检索问答 │ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │ │ │ 用户 │ → │查询 │ → │向量 │ → │重排序 │ → │ 大模型 │ │ │ │ 提问 │ │向量化 │ │检索 │ │Rerank│ │ 生成 │ │ │ └──────┘ └──────┘ └──────┘ └──────┘ └──────┘ │ │ ↑ │ │ 检索到的文档 │ │ │ └─────────────────────────────────────────────────────────────┘ 完整代码实现Step 1文档处理 入库fromlangchain.text_splitterimportRecursiveCharacterTextSplitterfromsentence_transformersimportSentenceTransformerfrompymilvusimportCollectionimportnumpyasnp# 1. 加载嵌入模型modelSentenceTransformer(BAAI/bge-m3)# 2. 文档分块text_splitterRecursiveCharacterTextSplitter(chunk_size500,chunk_overlap50,separators[\n\n,\n,。,,])defprocess_document(file_path,collection):处理单个文档并入库# 读取文档withopen(file_path,r,encodingutf-8)asf:textf.read()# 分块chunkstext_splitter.split_text(text)# 向量化embeddingsmodel.encode([frepresent document:{chunk}forchunkinchunks],normalize_embeddingsTrue)# 构造元数据metadatas[{source:file_path,chunk_index:i,total_chunks:len(chunks)}foriinrange(len(chunks))]# 入库data[chunks,# text 字段embeddings.tolist(),# embedding 字段[str(m)forminmetadatas]# metadata 字段]collection.insert(data)collection.flush()print(f✅{file_path}:{len(chunks)}个分块已入库)Step 2检索 生成defrag_query(question,collection,model,llm,top_k5):RAG 问答# 1. 查询向量化query_embeddingmodel.encode(frepresent passage:{question},normalize_embeddingsTrue)# 2. 向量检索collection.load()resultscollection.search(data[query_embedding.tolist()],anns_fieldembedding,param{metric_type:COSINE,params:{ef:128}},limittop_k,output_fields[text,source])# 3. 构造上下文context_parts[]forhitinresults[0]:context_parts.append(f[来源:{hit.entity.get(source)}] f{hit.entity.get(text)})context\n\n.join(context_parts)# 4. 构造 Promptpromptf基于以下参考资料回答用户问题。如果资料中没有相关信息请如实说明。 参考资料{context}用户问题{question}请给出准确、简洁的回答# 5. 调用大模型生成回答answerllm.generate(prompt)return{answer:answer,sources:[hit.entity.get(source)forhitinresults[0]],scores:[hit.distanceforhitinresults[0]]} RAG 进阶优化优化 1查询改写defquery_rewrite(question,llm):查询改写提升检索效果promptf请将以下用户问题改写为更适合检索的形式。 保留核心意图补充可能的同义词和相关概念。 原始问题{question}改写后的检索查询returnllm.generate(prompt)# 使用rewrittenquery_rewrite(怎么退货,llm)# → 商品退货流程 退货政策 退换货规则 退款申请优化 2HyDE假设文档嵌入defhyde_search(question,collection,model,llm):HyDE: 先让 LLM 生成假设性回答用回答去检索# 1. 生成假设性回答hypothetical_answerllm.generate(f请回答以下问题即使不确定也请尝试{question})# 2. 用假设性回答做向量检索query_embeddingmodel.encode(hypothetical_answer)resultscollection.search(data[query_embedding.tolist()],anns_fieldembedding,paramsearch_params,limit5,output_fields[text])returnresults优化 3Reranker 重排序fromsentence_transformersimportCrossEncoder# 加载重排序模型rerankerCrossEncoder(BAAI/bge-reranker-v2-m3)defrerank(query,results,top_k3):对检索结果重排序pairs[(query,doc[text])fordocinresults]scoresreranker.predict(pairs)# 按重排序分数排序rankedsorted(zip(results,scores),keylambdax:x[1],reverseTrue)return[docfordoc,scoreinranked[:top_k]] RAG 优化效果对比方案Recall5回答准确率延迟基础 RAG85.2%72%1.5s 查询改写89.5%78%2.0s HyDE91.3%82%3.0s Reranker93.8%89%2.5s 混合搜索95.2%91%2.8s 本篇核心要点回顾要点说明RAG 核心检索 生成让大模型用你的数据回答完整链路文档分块 → 向量化 → 存储 → 检索 → 生成关键优化查询改写、HyDE、Reranker、混合搜索效果提升优化后准确率可从 72% 提升到 91%下篇预告《向量数据库在推荐系统中的应用从协同过滤到向量召回 》有问题欢迎评论区讨论觉得有用请点赞收藏 作者高炉炼铁智能化技术研究者专注钢铁冶金与人工智能 交叉领域。 如果觉得有帮助请点赞、收藏、转发版权归作者所有未经许可请勿抄袭套用商用(或其它具有利益性行为)。 关注专栏不错过后续精彩内容