RAG技术全解析:从概念到实践,构建高效语义检索系统——嵌入模型与向量数据库搭建指南

一、RAG技术概述:为什么需要RAG?

1.1 什么是RAG?
RAG(Retrieval-Augmented Generation)是一种结合检索生成能力的AI架构。其核心思想是通过外部知识库动态增强大语言模型(LLM)的生成能力,解决传统模型知识过时、幻觉(Hallucination)等问题。

1.2 RAG的核心优势

  • 动态知识更新:无需重新训练模型即可引入最新数据。
  • 降低幻觉风险:基于真实文档生成答案,提升可信度。
  • 支持私有数据:企业可利用内部文档构建专属问答系统。

1.3 RAG的工作流程

  1. 数据预处理:加载并清洗文档(PDF、HTML等),分割为小块(Chunking)。
  2. 向量化:通过嵌入模型(Embedding Model)将文本转为高维向量。
  3. 存储与检索:将向量存入向量数据库,根据用户查询进行语义相似度匹配。
  4. 生成答案:将检索结果与用户问题结合,输入LLM生成最终输出。

二、核心组件详解:嵌入模型与向量数据库

2.1 嵌入模型:语义向量化的基石
嵌入模型(Embedding Model)将文本转化为向量,决定检索的准确性。

2.1.1 模型选择与性能对比
通义千问提供的文本嵌入模型在MTEB(多语言任务)和CMTEB(中文任务)中表现优异:

模型名称MTEB(通用任务)MTEB(检索任务)CMTEB(中文任务)CMTEB(中文检索任务)向量维度特点
text-embedding-v158.3045.4759.8456.591536维基础模型,支持多语言通用语义检索。
text-embedding-v260.1349.4962.1762.781536维优化中文与多语言处理能力,检索效果提升显著。
text-embedding-v363.3955.4168.9273.231024维旗舰模型,性能登顶MTEB/CMTEB榜单,支持自定义向量维度(需通过API指定)。

2.1.2 嵌入模型调用示例(LangChain框架)

from langchain_community.embeddings import DashScopeEmbeddings# 初始化嵌入模型
embeddings = DashScopeEmbeddings(model="text-embedding-v2")# 单个文本向量化
query_vector = embeddings.embed_query("This is a test document.")
print("文本向量长度:", len(query_vector))# 批量文本向量化
doc_vectors = embeddings.embed_documents(["Hi there!","Oh, hello!","What's your name?","My friends call me World","Hello World!"
])
print("文本向量数量:", len(doc_vectors), ",单个向量长度:", len(doc_vectors[0]))

2.2 向量数据库:高效检索的关键
向量数据库(Vector Database)存储并检索高维向量,支持语义搜索。

2.2.1 常见向量数据库对比

数据库开源/闭源部署难度支持语言适用场景
Chroma开源Python本地开发、小规模测试
FAISS开源C++/Python高性能相似度搜索
Milvus开源多语言企业级大规模部署
Pinecone闭源多语言云端即服务(SaaS)

2.2.2 向量数据库搭建示例(Chroma)

import chromadb
from chromadb.api.types import EmbeddingFunction
from sentence_transformers import SentenceTransformer# 自定义嵌入函数
class MyEmbeddingFunction(EmbeddingFunction):def __init__(self):self.model = SentenceTransformer('all-MiniLM-L6-v2')def __call__(self, input: List[str]) -> np.ndarray:return self.model.encode(input).tolist()# 初始化Chroma客户端
client = chromadb.Client()
collection = client.create_collection(name="my_collection", embedding_function=MyEmbeddingFunction())# 添加文档
collection.add(documents=["文档1内容", "文档2内容"], ids=["id1", "id2"])# 查询示例
results = collection.query(query_texts=["用户查询内容"], n_results=3)
print(results)

三、RAG系统搭建全流程

3.1 数据预处理与向量化

  1. 文档加载与分割

    • 使用工具如 UnstructuredPyPDF2 解析PDF/HTML。
    • 分割策略:按固定长度(如512 tokens)或语义边界(如段落)。
    from unstructured.partition.auto import partition
    chunks = partition(filename="data.pdf", chunk_size=512)
    
  2. 嵌入模型生成向量

    • 推荐模型:all-MiniLM-L6-v2(轻量)、text-embedding-v3(高性能)。
    from sentence_transformers import SentenceTransformer
    model = SentenceTransformer('all-MiniLM-L6-v2')
    embeddings = model.encode([chunk.text for chunk in chunks])
    

3.2 向量数据库部署

  • 本地模式(Chroma)

    pip install chromadb
    
    import chromadb
    client = chromadb.PersistentClient(path="./chroma_db")
    
  • 云端模式(Milvus)

    from pymilvus import connections, Collection
    connections.connect(host='localhost', port='19530')
    collection = Collection(name="docs", schema=...)
    

3.3 检索与生成集成

  1. 检索引擎配置

    • 结合BM25(关键词匹配)与向量相似度(混合检索)。
    from langchain.retrievers import MilvusRetriever
    retriever = MilvusRetriever(collection_name="docs")
    
  2. 生成模型调用

    • 使用LLM(如Llama、GPT)生成答案。
    from langchain.llms import Llama2
    llm = Llama2(model_path="models/llama-2-7b")
    rag_chain = {"context": retriever, "question": lambda x: x} | llm.generate
    

四、实践案例:基于DeepSeek的RAG系统

4.1 系统架构

  • 数据预处理:上传PDF文档 → 分割为Chunk → 生成向量。
  • 向量数据库:使用Milvus存储向量。
  • 检索与生成:通过DeepSeek模型生成答案。

4.2 搭建步骤

  1. 环境准备

    # 安装Ollama与DeepSeek
    curl -fsSL https://ollama.com/install.sh | sh
    ollama run deepseek-r1:1.5b
    
  2. 代码实现

    # 使用Streamlit构建前端
    import streamlit as st
    from chatpdf_rag_deepseek import RAGrag = RAG(llm_model="deepseek-r1:1.5b", embedding_model="mxbai-embed-large")
    st.title("RAG问答系统")
    uploaded_file = st.file_uploader("上传文档", type="pdf")
    query = st.text_input("输入问题")
    if st.button("提交"):answer = rag.query(query, uploaded_file)st.write("答案:", answer)
    

五、优化策略与最佳实践

5.1 性能优化

  • 混合检索:结合BM25与向量相似度,提升召回率。
  • 索引优化:使用HNSW或IVF-PQ加速大规模数据检索。
  • 缓存机制:对高频查询结果进行缓存,降低延迟。

5.2 错误排查与调试

  • 日志分析:启用Chroma的调试日志(CHROMA_LOG_LEVEL=DEBUG)。
  • 常见问题
    • 检索不准确:检查嵌入模型是否与训练数据分布一致。
    • 连接失败:确保向量数据库服务已启动,防火墙开放对应端口。

5.3 扩展应用场景

  • 多模态支持:结合图像、音频的向量化处理。
  • 安全增强:为向量数据库添加访问控制与加密传输。

六、总结与未来展望

RAG技术通过引入外部知识库和高效检索机制,显著提升了大模型的输出质量与适用性。嵌入模型与向量数据库的选型与搭建是RAG系统的核心环节。通过本文的指南,开发者可以快速构建从数据预处理到生成的全流程系统,并在问答、推荐、智能客服等场景中实现落地。

进阶方向

  1. 动态更新机制:设计自动化管道,确保知识库实时同步。
  2. 多语言支持:探索跨语言嵌入模型(如text-embedding-v3)。
  3. 边缘计算:将轻量级RAG系统部署到移动设备或IoT终端。

参考资源

  • 通义千问模型库:https://tongyi.aliyun.com/models
  • LangChain官方文档:https://docs.langchain.com/
  • Chroma官方文档:https://docs.trychroma.com/

通过以上步骤与实践,技术团队可高效实现RAG系统的开发与优化,为各类知识驱动型应用奠定坚实基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/83410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【资源分享】手机玩转经典游戏!小鸡模拟器1.9.0:PSP/NDS/GBA完美运行!

阿灿今天给大家推荐一款小鸡模拟器,这是一个老款PC和掌上游戏机模拟器。完美模拟街机(fbamamemameplus).PS、PSP、FC(NES)SFC(SNES)、GBA、GBC、MD、NDS、DC、NGP、WS (WSC) PCE、ONS 等18款经典掌机游戏机。小鸡模拟器同时也提供海量热门的汉化版游戏免…

matlab脉冲信号并绘制波形2025.6.11

以下是一个使用MATLAB生成5V、10MHz脉冲信号并绘制波形的示例代码: % 5V 10MHz脉冲信号仿真 clc; clear; close all; % 参数设置 voltage = 5; % 信号幅度(V) frequency = 10e6; % 脉冲频率(10MHz) duty_cycle =

ElasticJob初探

依赖版本 JDK版本是&#xff1a;jdk17 springboot版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.4</version></parent>zookeeper elasticjo…

【Vue3】(三)vue3中的pinia状态管理、组件通信方式及总结、插槽

目录 一、vue3的pinia 1、什么是pinia&#xff1f; 2、为什么Vue3选择pinia&#xff1f; 3、使用pinia的好处 4、安装pinia 2、项目配置 3、存储/读取pinia中的数据 4、修改pinia中的数据 5、storeToRefs&#xff08;保持store中数据的响应式&#xff09; 6、getters 7、…

WEB3全栈开发——面试专业技能点P1Node.js / Web3.js / Ethers.js

一、Node.js 事件循环 Node.js 的事件循环&#xff08;Event Loop&#xff09;是其异步编程的核心机制&#xff0c;它使得 Node.js 可以在单线程中实现非阻塞 I/O 操作。 &#x1f501; 简要原理 Node.js 是基于 libuv 实现的&#xff0c;它使用事件循环来处理非阻塞操作。事件…

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…

web架构4------(nginx常用变量,nginx中英文自动匹配,lnmp网站架构,正向代理,反向代理,负载均衡)

一.前言 本期来介绍nginx最后几个知识点&#xff0c;看着要说的内容很多&#xff0c;其实一点也不多&#xff0c;都是所见即所得的东西。 二.nginx常用变量 2.1 常用变量 $args 请求中的参数&#xff0c;也叫查询参数&#xff0c;如www.123.com/1.php?a1&b2的$args就是…

openeuler系统(CentOs)图形化桌面黑屏/丢失(开启VNC服务冲突)

1. VNC服务开启如下&#xff1a; https://zhuanlan.zhihu.com/p/5049263261 在centos8系统上使用tigervnc-server搭建VNC_centos8 tigervnc-server-CSDN博客 2. 上述操作完成后&#xff0c;连接VNC仍会出现黑屏&#xff0c;则需要编辑/root/.vnc/xstartup&#xff1a; [运维…

MySQL:Prepared Statement 预处理语句

预处理语句&#xff08;Prepared Statements&#xff09;是 MySQL 中一种用于执行 SQL 查询的高效、安全的方法。通过使用预处理语句&#xff0c;可以显著提升查询性能&#xff0c;并防止 SQL 注入攻击。本文将详细介绍 MySQL 预处理语句的概念、使用方法及其优势。 一、预处理…

EPPLUS——CAD c#读写EXCEL的第三方库

EPPLUS(可支持NET35) 在 CAD 的 C# 二次开发中&#xff0c;使用 EPPLUS 库处理 Excel 文件具有以下显著优点&#xff0c;尤其在兼容性、便捷性和性能等方面契合 CAD 项目的需求&#xff1a; 1. 跨.NET 版本兼容性强&#xff0c;适配 CAD 多环境部署 多框架支持&#xff1a;EP…

Linux知识回顾总结----进程状态

本章将会介绍进程的一些概念&#xff1a;冯诺伊曼体系结构、进程是什么&#xff0c;怎么用、怎么表现得、进程空间地址、物理地址、虚拟地址、为什么存在进程空间地址、如何感性得去理解进程空间地址、环境变量是如何使用的。 目录 1. 冯诺伊曼体系结构 1.1 是什么 1.2 结论 …

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…

Android Test3 获取的ANDROID_ID值不同

Android Test3 获取的ANDROID_ID值不同 这篇文章来说明上一篇文章中说到的一个现象&#xff1a;在同一个项目中&#xff0c;创建不同的 app module&#xff0c;运行同一段测试代码&#xff0c;获取到的 ANDROID_ID 的值不同。 我也是第一次认真研究这个现象&#xff0c;这个还…

JSON 和 LabVIEW Data Types 互相转换

使用JSONtext C:\Program Files (x86)\National Instruments\LabVIEW 2021\examples\JDP Science\JSONtext JSONtext LabVIEW Data Types.vi

docker和docker-compose的版本对应关系怎么看?

docker和docker-compose的版本对应关系怎么看&#xff1f;最近在安装这两个工具&#xff0c;像知道他们的版本对应关系&#xff0c;查了不少资料才找到。 虽然 Docker 和 Docker Compose 的版本并不严格绑定&#xff0c;但是在某些情况下&#xff0c;新版本的 Docker Compose …

邮科ODM摄像头:多维度护航高铁安全系统方案解析

‌高铁作为现代交通的重要支柱&#xff0c;其安全稳定运行依赖于高效的监控体系。摄像头系统作为高铁安全管理的“视觉感知中枢”&#xff0c;凭借多场景覆盖、智能分析以及环境适应性设计&#xff0c;在行车安全、设备维护、乘客服务等方面发挥着不可或缺的作用。本文将从技术…

盒模型小全

CSS盒子模型详解 1. 定义 CSS盒子模型是用于描述HTML元素在页面中布局和表现的核心概念之一。在CSS中&#xff0c;所有HTML元素都被视为一个矩形的盒子&#xff0c;这些盒子封装了周围的HTML元素&#xff0c;并允许在其他元素和周围元素边框之间的空间放置内容。 2. 组成部分…

自定义鼠标效果 - 浏览器扩展使用教程

自定义鼠标效果 - 浏览器扩展使用教程 这里写目录标题 自定义鼠标效果 - 浏览器扩展使用教程功能特点安装方法Chrome/Edge浏览器 使用指南1. 更改鼠标光标样式2. 启用鼠标轨迹效果3. 自定义轨迹效果点状/彩虹/渐隐轨迹&#xff1a;表情轨迹&#xff1a; 管理自定义光标支持的文…

基于SpringBoot实现的课程答疑系统设计与实现【源码+文档】

基于SpringBootVue实现的课程答疑系统采用前后端分离架构方式&#xff0c;系统设计了管理员、学生、老师三种角色&#xff0c;系统实现了用户登录与注册、个人中心、学生管理、老师管理、科目类型管理、学生问题管理、老师回答管理、老师信息管理、关注列表管理、交流区、轮播图…

御微半导体面试总结

前一阵子在公司干的难受&#xff0c;所以再合肥这边面试了几家公司&#xff0c;挑一个御微半导体来说一下吧&#xff0c;公司主要是做半导体晶元测量的&#xff0c;具体啥我也不太明白。 公司产品线多&#xff0c;每条产品线配有独立的软件、结构、光学控制等人员开发语言和框…