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

(2025)图文解锁RAG从原理到实操

什么是RAG

RAG(检索增强生成)是一种将语言模型与可搜索知识库结合的方法,主要包含以下关键步骤:

  1. 数据预处理

    • 加载:从不同格式(PDF、Markdown等)中提取文本
    • 分块:将长文本分割成短序列(通常100-500个标记),作为检索单元
      在这里插入图片描述
  2. 检索系统构建

    • embedding:使用embedding模型为每个文本块生成向量表示
    • 存储:将这些向量索引到向量数据库中
    • 可选-重排:结合关键词搜索构建混合搜索系统,并添加重排序步骤
      在这里插入图片描述
  3. 查询处理流程

    • 接收用户查询并评估其相关性
    • 对查询进行嵌入,在向量库中查找相关块
      在这里插入图片描述
  4. 生成输出

    • 将检索到的相关内容与原始查询一起传递给LLM
    • LLM根据这些上下文信息生成更准确、更符合事实的回答
      在这里插入图片描述

RAG的核心价值在于通过非参数数据源为模型提供正确、具体且最新的信息,从而改进传统LLM的回答质量。

RAG vs 超长上下文

随着模型如Claude、GPT-4和Gemini 1.5等能够处理高达100万tokens甚至200万tokens的输入,业界开始思考一个关键问题:在如此长的上下文支持下,我们未来是否还需要检索增强生成(RAG)技术。

下表将会对比RAG与超长文本优缺点

特点超长上下文RAG技术实际影响
成本⚠️ 高✅ 低200万tokens API调用vs.数千tokens
安全性⚠️ 全部暴露✅ 按需暴露敏感信息保护程度
检索精度⚠️ 随文档长度降低,AI对更近的文本记忆力更好✅ 相对稳定问答准确率差异
容量限制⚠️ 有上限(~200万tokens)✅ 基本无限可处理知识库规模

RAG综合实操

由于本系列已经提到有关RAG的各个细节理论与代码,因此这里有些细节不再重复。

RAG入门篇

环境准备
本机Ollama需要下载了模型ollama run deepseek-r1:7b

# 安装必要依赖
pip install langchain langchain-community chromadb  beautifulsoup4  sentence-transformers langchain-ollama

一个RAG分为一下5个部分

  1. 加载: 通过 document_loaders 完成数据加载
  2. 分割: text_splitter 将大型文档分割成更小的块,便于索引和模型处理
  3. 存储: 使用 vectorstores embeddings 模型存储和索引分割的内容
  4. 检索: 使用 RetrievalQA 基于用户输入,使用检索器从存储中检索相关分割
  5. 生成: llms 使用包含问题和检索数据的提示生成答案
from langchain.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
from langchain.llms import Ollama
import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'loader = WebBaseLoader("https://blog.csdn.net/ngadminq/article/details/147687050")
documents = loader.load()text_splitter = RecursiveCharacterTextSplitter(chunk_size=500,chunk_overlap=50
)
chunks = text_splitter.split_documents(documents)embedding_model = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh"
)vectorstore = Chroma.from_documents(documents=chunks,embedding=embedding_model,persist_directory="./chroma_db"
)# 创建检索器
retriever = vectorstore.as_retriever()template = """
根据以下已知信息,简洁并专业地回答用户问题。
如果无法从中得到答案,请说"我无法从已知信息中找到答案"。已知信息:
{context}用户问题:{question}回答:
"""
prompt = PromptTemplate(template=template,input_variables=["context", "question"]
)#
llm = Ollama(model="deepseek-r1:7b")  # 本地部署的模型qa_chain = RetrievalQA.from_chain_type(llm=llm,chain_type="stuff",retriever=retriever,chain_type_kwargs={"prompt": prompt}
)question = "图灵的论文叫什么?"
result = qa_chain.invoke({"query": question})
print(result["result"])

在这里插入图片描述

相关文章:

  • 当冲压焊接遇上Canopen到Profinet协议转换网关
  • 【XCP实战】AUTOSAR架构下XCP DAQ功能配置实现
  • 代码随想录算法训练营第三十七天
  • 学习黑客5 分钟深入浅出理解Linux Logs [特殊字符]
  • MD5 值是什么?为什么文件需要检验 MD5?
  • 手机银行怎么打印流水账单(已解决)
  • LintCode第485题-生成给定大小的数组,第220题-冰雹猜想,第235题-分解质因数
  • 便签软件哪个好用?2025年桌面记事本便签软件推荐大全
  • ProfiNet转MODBUS模块构建西门子PLC与RTU仪表通讯连接方案
  • 考研408《计算机组成原理》复习笔记,第三章数值数据的表示和运算(定点数篇)
  • CMake 入门实践
  • jflash下载时出现 Could not read unit serial number! 的解决方法
  • SierraNet M1288网络损伤功能显著助力GPU互联网络的测试验证,包含包喷洒,LLR等复杂特性的验证测试
  • Python中的事件循环是什么?事件是怎么个事件?循环是怎么个循环
  • 【C++】string类(一)构造、重载、容量操作、访问与遍历(迭代器、范围for)、练习
  • C.循环函数基础
  • Java大师成长计划之第17天:锁与原子操作
  • OSPF综合实验实验报告
  • Java—— 泛型详解
  • 洗衣机电机驱动电路
  • 西藏日喀则市拉孜县发生5.5级地震,震源深度10公里
  • 中美经贸高层会谈在日内瓦结束,中国代表团将举行发布会
  • 三大股份制银行入局AIC,一级市场再迎“活水”
  • 首映丨纪录电影《滚烫年华》:献给所有奋斗者
  • 1至4月全国铁路完成固定资产投资1947亿元,同比增长5.3%
  • 呼和浩特推进新一轮国企重组整合:杜绝一项目一公司、一业务一公司