当前位置: 首页 > news >正文

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

向量数据库 + RAG 融合实战:构建企业级知识库的完整链路 🔗

🔥本文是《向量数据库实战:选型、调优与落地》专栏第 19 篇

⏱️阅读时间:约 15 分钟


🎯 开篇:RAG 是向量数据库最核心的应用场景

RAG(Retrieval-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. 加载嵌入模型model=SentenceTransformer("BAAI/bge-m3")# 2. 文档分块text_splitter=RecursiveCharacterTextSplitter(chunk_size=500,chunk_overlap=50,separators=["\n\n","\n","。","!","?"])defprocess_document(file_path,collection):"""处理单个文档并入库"""# 读取文档withopen(file_path,'r',encoding='utf-8')asf:text=f.read()# 分块chunks=text_splitter.split_text(text)# 向量化embeddings=model.encode([f"represent document:{chunk}"forchunkinchunks],normalize_embeddings=True)# 构造元数据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_k=5):"""RAG 问答"""# 1. 查询向量化query_embedding=model.encode(f"represent passage:{question}",normalize_embeddings=True)# 2. 向量检索collection.load()results=collection.search(data=[query_embedding.tolist()],anns_field="embedding",param={"metric_type":"COSINE","params":{"ef":128}},limit=top_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. 构造 Promptprompt=f"""基于以下参考资料回答用户问题。如果资料中没有相关信息,请如实说明。 参考资料:{context}用户问题:{question}请给出准确、简洁的回答:"""# 5. 调用大模型生成回答answer=llm.generate(prompt)return{"answer":answer,"sources":[hit.entity.get('source')forhitinresults[0]],"scores":[hit.distanceforhitinresults[0]]}

🚀 RAG 进阶优化

优化 1:查询改写

defquery_rewrite(question,llm):"""查询改写:提升检索效果"""prompt=f"""请将以下用户问题改写为更适合检索的形式。 保留核心意图,补充可能的同义词和相关概念。 原始问题:{question}改写后的检索查询:"""returnllm.generate(prompt)# 使用rewritten=query_rewrite("怎么退货",llm)# → "商品退货流程 退货政策 退换货规则 退款申请"

优化 2:HyDE(假设文档嵌入)

defhyde_search(question,collection,model,llm):"""HyDE: 先让 LLM 生成假设性回答,用回答去检索"""# 1. 生成假设性回答hypothetical_answer=llm.generate(f"请回答以下问题(即使不确定也请尝试):{question}")# 2. 用假设性回答做向量检索query_embedding=model.encode(hypothetical_answer)results=collection.search(data=[query_embedding.tolist()],anns_field="embedding",param=search_params,limit=5,output_fields=["text"])returnresults

优化 3:Reranker 重排序

fromsentence_transformersimportCrossEncoder# 加载重排序模型reranker=CrossEncoder("BAAI/bge-reranker-v2-m3")defrerank(query,results,top_k=3):"""对检索结果重排序"""pairs=[(query,doc["text"])fordocinresults]scores=reranker.predict(pairs)# 按重排序分数排序ranked=sorted(zip(results,scores),key=lambdax:x[1],reverse=True)return[docfordoc,scoreinranked[:top_k]]

📊 RAG 优化效果对比

方案Recall@5回答准确率延迟
基础 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%

📌下篇预告:《向量数据库在推荐系统中的应用:从协同过滤到向量召回 🎯》

💬有问题欢迎评论区讨论,觉得有用请点赞收藏 👍

作者:高炉炼铁智能化技术研究者,专注钢铁冶金与人工智能 交叉领域。

👍 如果觉得有帮助,请点赞、收藏、转发!
版权归作者所有,未经许可请勿抄袭,套用,商用(或其它具有利益性行为)
🔔 关注专栏,不错过后续精彩内容

http://www.cnnetsun.cn/news/3679240.html

相关文章:

  • 向量数据库实战:选型、调优与落地~系列文章20:向量数据库在推荐系统中的应用:从协同过滤到向量召回
  • TMS320C6421开发全解析:从命名规则到工具链与实战避坑指南
  • LangChain结构化输出:Pydantic与JSON解析器实战
  • uv:快得像火箭,顺便把“安装依赖”藏起来了
  • FSDrive框架:时空思维链与视觉推理的自动驾驶决策
  • TVA数字小脑:具身智能的物理交互革命(7)
  • MSO算法在柔性作业车间调度中的Matlab实现与优化
  • HsMod终极指南:32倍速炉石传说插件,200+皮肤定制与自动化功能完全解析
  • TVA数字小脑:具身智能产业化落地的关键支撑(9)
  • TVA数字小脑:具身智能产业化落地的关键支撑(10)
  • 定点DSP上IIR滤波器优化:规范型结构防溢出与高效实现
  • Python作业实战:函数与数据结构进阶指南
  • 云原生12要素应用开发实践指南
  • Java后端面试7天冲刺:系统化复习八股文与场景题实战
  • GPT-4o企业级成本优化实战:从Prompt设计到架构部署
  • 功率谱估计算法从零详解(纯C#原生实现、无第三方库、超全理论+源码)
  • 英雄联盟智能助手Seraphine:告别繁琐查询,3分钟掌握全队数据
  • MiniMax Agent:全栈式AI智能代理的技术解析与应用
  • MySQL SQL执行全链路解析:从Parser到Executor的完整生命周期
  • AI动态调整销售目标的技术实现与实战经验
  • TI 64位定时器看门狗配置详解:从原理到防误触发实战
  • 688号文多用户绿电直连全流程拆解|全网独家复现源荷储能收益仿真 双阶段入市模式、四维交易能力、多方风险收益分配助力园区零碳落地、算力负荷稳供、绿碳资产增值
  • 英雄联盟智能助手Seraphine:如何用免费开源工具提升你的游戏胜率
  • TMS320C6474 DSP电源设计实战:CVDD、Bulk电容与SmartReflex详解
  • 【AI配色无障碍设计黄金法则】:20年UI/UX专家亲授——覆盖98.7%色觉障碍用户的5大智能配色模型
  • AI表单处理不是“开箱即用”——为什么93%的RPA项目在第3个月崩溃?(附可立即部署的校验增强插件包)
  • 深入解析DSP/BIOS六大核心驱动模块:原理、配置与实战应用
  • 微信数据库解密终极指南:三步恢复你的聊天记录
  • Unity游戏翻译神器:5分钟搞定外语游戏汉化
  • Java集合框架:Map与Set核心原理与性能优化实践