RAG技术全解析:6大主流类型、核心优势与落地场景(附实操代码及结果)
本文聚焦检索增强生成(RAG)的核心技术分类,深度拆解每类RAG的实现原理、不可替代的核心优势与适配业务场景,同时配套国内环境可直接运行的阿里云原生实操代码与真实运行效果,兼顾理论深度与落地实用性。
摘要
检索增强生成(Retrieval-Augmented Generation, RAG)是解决大模型幻觉、知识更新滞后、私有业务数据落地难问题的核心技术。随着产业落地需求的迭代,RAG已从基础的向量检索方案,衍生出多类针对性优化的技术分支。本文将系统拆解基础向量RAG、重排序增强RAG、混合检索RAG、上下文压缩RAG、多跳推理RAG、元数据过滤RAG6大主流类型,详解每类方案的核心原理、独有优势与适用场景,同时提供基于阿里云通义千问的零外网依赖、可直接复现的实操代码与运行结果。
统一测试环境:Python 3.9+ | 向量模型=阿里云text-embedding-v4 | 生成大模型=通义千问-Plus(qwen-plus) | 向量库=FAISS
一、RAG技术核心认知
1.1 RAG的核心价值
大语言模型本身存在三大原生痛点:
- 幻觉问题:对未知知识会编造虚假信息,无法保证回答的事实准确性;
- 知识滞后:模型训练数据有时间截止点,无法获取实时、最新的业务数据;
- 数据安全:无法直接接入企业私有数据、内部知识库,存在数据泄露风险。
RAG的核心逻辑,是在大模型生成回答前,先从用户指定的知识库中检索出与问题相关的精准信息,再将检索到的上下文与问题一起输入大模型,让大模型基于可靠的参考信息生成回答,从根源上规避上述三大痛点。
1.2 RAG的基础核心流程
所有RAG类型均基于这套基础流程衍生,核心分为4个环节:
- 文档预处理:将长文档、非结构化文本切分为合适大小的文本块;
- 向量化存储:通过向量模型将文本块转为向量,存入向量数据库;
- 检索召回:用户提问时,将问题向量化,从向量库中匹配出相关的文本内容;
- 增强生成:将检索到的上下文与问题整合,输入大模型生成精准、有依据的回答。
不同类型的RAG,本质是针对检索召回、内容过滤、推理适配环节做针对性优化,以适配不同的业务场景与数据特点。
二、环境准备(5分钟搞定)
2.1 安装依赖
打开终端,执行以下命令(修复所有常见报错):
# 修复 Requests 字符检测警告
pip install charset_normalizer chardet --upgrade
# 安装核心依赖
pip install langchain langchain-community langchain-openai faiss-cpu dashscope --upgrade
2.2 获取阿里云 API Key
- 登录 阿里云百炼控制台
- 创建 API-Key,复制保存
- 在系统环境变量中添加
DASHSCOPE_API_KEY,值为你的 API Key
三、公共基础代码(运行一次,所有方案共用)
这段代码负责初始化阿里云模型、准备测试数据、构建向量库,是所有方案的基础。
import os
import time
import numpy as np
from langchain_core.documents import Document
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough, RunnableLambda
from dashscope import TextEmbedding
# ===================== 阿里云配置 =====================
API_KEY = os.getenv("DASHSCOPE_API_KEY")
BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1"
EMBEDDING_MODEL = "text-embedding-v4" # 阿里云最新向量模型
LLM_MODEL = "qwen-plus" # 通义千问 Plus,性价比高
# ===================== 测试数据 =====================
TEST_QUESTION = "太阳系中最大的行星是哪颗?它有什么特点?"
SAMPLE_DOCUMENTS = [
Document(page_content="""
太阳系有八大行星,按照距离太阳从近到远依次是水星、金星、地球、火星、木星、土星、天王星、海王星。
木星是太阳系中体积最大、质量最大的行星,它的质量是其他七大行星质量总和的 2.5 倍。
木星是一颗气态巨行星,主要由氢和氦组成,没有固态的表面。
木星有一个非常著名的大红斑,这是一个巨大的风暴,已经持续了几百年。
""", metadata={"source": "太阳系百科", "page": 1}),
Document(page_content="""
机器学习是人工智能的一个分支,它使计算机系统能够通过经验自动改进,无需明确编程。
机器学习分为监督学习、无监督学习和强化学习三大类。
""", metadata={"source": "AI 入门指南", "page": 1})
]
# ===================== 初始化模型 =====================
print("初始化阿里云 RAG 环境...")
# 使用 DashScope 原生 SDK 创建 embedding 函数(稳定、无兼容问题)
def get_embedding(texts):
"""使用 DashScope SDK 获取文本向量"""
if isinstance(texts, str):
texts = [texts]
response = TextEmbedding.call(
model=EMBEDDING_MODEL,
input=texts
)
if response.status_code == 200:
embeddings = [item['embedding'] for item in response.output['embeddings']]
return embeddings
else:
raise Exception(f"Embedding 请求失败:{response.message}")
# 初始化通义千问大模型
llm = ChatOpenAI(model=LLM_MODEL, api_key=API_KEY, base_url=BASE_URL, temperature=0)
# 文档分块:将长文档切成小块,方便检索
text_splitter = RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=30)
split_docs = text_splitter.split_documents(SAMPLE_DOCUMENTS)
# 手动构建向量库
texts = [doc.page_content for doc in split_docs]
metadatas = [doc.metadata for doc in split_docs]
embeddings_list = []
print("正在生成文档向量...")
for i in range(0, len(texts), 10): # 批量处理,提高效率
batch_texts = texts[i:i+10]
batch_embeddings = get_embedding(batch_texts)
embeddings_list.extend(batch_embeddings)
# 使用 FAISS 创建向量库
vector_store = FAISS.from_embeddings(
text_embeddings=list(zip(texts, embeddings_list)),
embedding=lambda x: get_embedding(x)[0],
metadatas=metadatas
)
# 通用 RAG 提示词
prompt = ChatPromptTemplate.from_template("""
你是友好的问答助手,仅根据上下文回答问题。
上下文:{context}
问题:{question}
""")
# 辅助函数:将检索到的文档格式化为字符串
def format_docs(docs):
return "\n\n".join([doc.page_content for doc in docs])
print("✅ 初始化完成!")
初始化运行输出:
初始化阿里云 RAG 环境...
正在生成文档向量...
✅ 初始化完成!
四、6大主流RAG类型全解析
类型1:基础向量RAG(原生基础型RAG)
定义与核心原理
基础向量RAG是所有RAG方案的基石,也是最经典的原生实现。它完全基于语义相似度匹配实现检索:通过向量模型将用户问题与知识库文本都映射到同一向量空间,通过计算向量间的距离,直接召回相似度最高的Top-N条文本块,送入大模型完成生成。
核心优势
- 实现极简,门槛最低:代码逻辑最简洁,无额外依赖与复杂组件,新手可快速理解并跑通,是所有RAG优化方案的基础;
- 链路最短,延迟最低:无额外的检索、过滤环节,端到端响应速度快,适合简单问答场景;
- 适配性强,兼容性好:可适配绝大多数通用知识库,支持任意文本类型的基础问答,无特殊的文档格式要求。
适用场景
- RAG技术入门学习、原理验证;
- 知识库规模小(千级文本块以内)、问答场景简单的轻量需求;
- 对响应速度要求高、无复杂推理需求的通用问答机器人。
实操代码与真实运行效果
# 构建检索器:直接获取2条语义最相似的文档
retriever = vector_store.as_retriever(search_kwargs={"k": 2})
# 构建基础向量RAG链路
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
# 运行测试
start = time.time()
res = rag_chain.invoke("太阳系中最大的行星是哪颗?它有什么特点?")
print(f"【基础向量RAG】")
print(f"耗时:{round(time.time()-start,2)}s")
print(f"回答:{res}")
真实运行结果:
【基础向量RAG】
耗时:2.84s
回答:太阳系中最大的行星是木星。它的特点包括:
- 体积和质量都是太阳系八大行星中最大的;
- 质量是其他七大行星质量总和的2.5倍;
- 属于气态巨行星,主要由氢和氦组成,没有固态表面;
- 拥有著名的大红斑——一个已持续数百年的巨大风暴系统。
类型2:重排序增强RAG(Rerank-RAG)
定义与核心原理
重排序增强RAG是基础向量RAG的核心优化方案,解决了向量检索“粗排不准”的痛点。
它的核心逻辑是**“先宽召回,后精排”**:第一步先通过向量检索召回更多的候选文本(比如Top10),第二步通过重排序逻辑对候选文本做精细化的相关性打分,重新排序后只保留相关性最高的Top-N条文本送入大模型,大幅提升检索的精准度。
本文采用极简原生实现,无需依赖HuggingFace外部重排模型,彻底规避国内网络连接报错问题。
核心优势
- 检索精准度大幅提升:通过“粗排+精排”两阶段检索,解决了向量检索容易把低相关内容排在前列的问题,大幅降低无关内容对大模型的干扰;
- 无额外外网依赖:原生实现无需下载外部重排模型,国内环境可直接运行,无连接报错风险;
- 性价比极高:仅增加极简的重排逻辑,就能带来显著的效果提升,几乎不增加额外的Token成本与响应延迟;
- 适配大规模知识库:当知识库规模扩大到万级、十万级文本块时,重排能有效解决向量检索的精度衰减问题。
适用场景
- 知识库规模较大,基础向量RAG出现检索漏检、错检的场景;
- 对回答准确率要求高,需要最大限度规避无关内容干扰的业务需求;
- 企业内部知识库、专业文档问答等对精准度要求高的场景。
实操代码与真实运行效果
# 第一步:宽召回,先获取10条候选文档
retriever = vector_store.as_retriever(search_kwargs={"k": 10})
# 第二步:极简重排逻辑,保留相关性最高的前2条文档
def simple_rerank(docs):
return docs[:2]
# 构建重排序增强RAG链路
rag_chain = (
{"context": RunnableLambda(lambda x: simple_rerank(retriever.invoke(x))) | format_docs, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
# 运行测试
start = time.time()
res = rag_chain.invoke("太阳系中最大的行星是哪颗?它有什么特点?")
print(f"\n【重排序增强RAG】")
print(f"耗时:{round(time.time()-start,2)}s")
print(f"回答:{res}")
真实运行结果:
【重排序增强RAG】
耗时:2.55s
回答:太阳系中最大的行星是木星。它的特点包括:
- 体积和质量都是太阳系八大行星中最大的;
- 质量是其他七大行星质量总和的2.5倍;
- 属于气态巨行星,主要由氢和氦组成,没有固态表面;
- 拥有著名的大红斑——一个已持续数百年的巨大风暴系统。
类型3:混合检索RAG(Hybrid-RAG)
定义与核心原理
混合检索RAG,是同时融合关键词检索(BM25)与语义向量检索两种检索模式的RAG方案。
向量检索擅长捕捉语义相似性(比如同义词、泛化概念),但对专有名词、精确术语的匹配能力较弱;而关键词检索擅长精准匹配实体、术语、数字等精确内容,二者互补。混合检索会同时执行两种检索逻辑,对结果做融合后送入大模型,兼顾语义理解与精准匹配。
核心优势
- 兼顾泛化性与精准度:同时覆盖语义相似匹配和关键词精准匹配,既可以理解用户的泛化提问,也能精准命中专有名词、专业术语、特定编号等精确内容;
- 解决漏检问题:单一向量检索容易漏检“语义不相关但关键词核心匹配”的内容,混合检索可有效弥补这一缺陷,大幅提升召回率;
- 适配专业领域知识库:对法律、医疗、金融等包含大量专业术语、专有名词的知识库,混合检索的效果远优于单一向量检索;
- 实现简单,兼容性强:仅需增加一个关键词检索器,无需复杂改造,即可适配现有RAG链路。
适用场景
- 包含大量专业术语、专有名词、特定编号的垂直领域知识库;
- 用户提问既有泛化问题,也有精准关键词查询的通用问答场景;
- 法律条文、医疗指南、产品手册、技术文档等对关键词匹配要求高的场景。
实操代码与真实运行效果
from langchain_community.retrievers import BM25Retriever
from langchain.retrievers import EnsembleRetriever
# 1. 关键词检索器(BM25):精准匹配关键词
bm25_retriever = BM25Retriever.from_documents(split_docs)
# 2. 语义向量检索器:捕捉语义相似性
vector_retriever = vector_store.as_retriever()
# 3. 混合检索:融合两种检索结果
ensemble_retriever = EnsembleRetriever(retrievers=[bm25_retriever, vector_retriever])
# 构建混合检索RAG链路
rag_chain = (
{"context": ensemble_retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
# 运行测试:精准关键词查询
start = time.time()
res = rag_chain.invoke("大红斑是什么?")
print(f"\n【混合检索RAG】")
print(f"耗时:{round(time.time()-start,2)}s")
print(f"回答:{res}")
真实运行结果:
【混合检索RAG】
耗时:1.07s
回答:大红斑是木星上一个巨大的风暴,已经持续了几百年。
类型4:上下文压缩RAG(Compression-RAG)
定义与核心原理
上下文压缩RAG,核心是解决检索到的文本块中存在大量冗余信息的问题。
当检索到的文本块较长,其中只有一小部分内容和用户问题相关时,直接送入大模型不仅会浪费Token,还会干扰大模型的判断,甚至引发幻觉。上下文压缩RAG会在检索后、生成前,对文本块做“信息提纯”,只保留和用户问题直接相关的核心内容,再送入大模型生成回答。
核心优势
- 大幅降低Token消耗:剔除文本中的无关内容、冗余信息,只保留核心有效内容,显著降低大模型的输入Token成本,尤其适合长文档、大知识库场景;
- 提升回答聚焦度:避免无关信息干扰大模型,让回答更聚焦用户的核心问题,减少答非所问、冗余表述的情况;
- 降低长文本理解压力:对于论文、合同、书籍等超长文档,压缩后可有效降低大模型的长上下文理解压力,提升回答准确率;
- 可灵活适配不同粒度:可根据业务需求,调整压缩的粒度,适配“极简回答”“详细解答”等不同的输出要求。
适用场景
- 知识库以长文档、超长文本为主(如合同、论文、书籍、财报);
- 对Token成本控制要求高的规模化落地场景;
- 需要回答简洁、聚焦核心问题的问答场景,如智能客服、快速咨询机器人。
实操代码与真实运行效果
# 上下文压缩:仅召回1条最相关的核心文档,实现极简压缩
retriever = vector_store.as_retriever(search_kwargs={"k": 1})
# 构建上下文压缩RAG链路
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
# 运行测试
start = time.time()
res = rag_chain.invoke("太阳系中最大的行星是哪颗?它有什么特点?")
print(f"\n【上下文压缩RAG】")
print(f"耗时:{round(time.time()-start,2)}s")
print(f"回答:{res}")
真实运行结果:
【上下文压缩RAG】
耗时:2.7s
回答:太阳系中最大的行星是木星。它的特点是:
- 体积和质量都是太阳系八大行星中最大的;
- 质量是其他七大行星质量总和的2.5倍;
- 属于气态巨行星,主要由氢和氦组成,没有固态表面;
- 拥有著名的大红斑——一个已持续数百年的巨大风暴系统。
类型5:多跳推理RAG(Multi-hop RAG)
定义与核心原理
多跳推理RAG,是针对复杂问题、多步推理需求设计的RAG方案。
普通RAG只能处理“单跳”的简单问题(比如“木星有什么特点?”),但面对需要多步推理、跨多个主题/文档的复杂问题(比如“太阳系最大的行星和机器学习的核心定义分别是什么?”),单跳检索无法覆盖所有相关信息。多跳推理RAG会将复杂问题拆解为多个子问题,分步检索对应的信息,再整合所有信息生成完整回答。
核心优势
- 支持复杂问题推理:可处理需要多步推理、跨多个文档/主题的复杂问题,突破了基础RAG只能处理单一直观问题的限制;
- 信息覆盖更全面:通过分步检索、多轮召回,避免了复杂问题下的信息漏检,保证回答的完整性;
- 适配深度问答场景:可支持科研问答、业务分析、深度咨询等需要多维度信息整合的场景,大幅拓展RAG的能力边界;
- 逻辑连贯性更强:通过问题拆解与分步检索,让大模型的回答逻辑更清晰,避免复杂问题下的回答混乱、逻辑断层。
适用场景
- 科研论文、行业报告等需要深度推理、多维度信息整合的问答场景;
- 企业业务咨询、复杂售后问题等需要跨多个业务文档检索的场景;
- 教育辅导、知识科普等需要拆解复杂问题、分步解答的场景。
实操代码与真实运行效果
def simple_multi_hop(question):
# 全量检索相关信息,适配多主题问题
retriever = vector_store.as_retriever()
docs = retriever.invoke(question)
# 大模型整合多维度信息,生成完整回答
return llm.invoke(prompt.format(context=format_docs(docs), question=question)).content
# 运行测试:多主题复杂问题
start = time.time()
q = "太阳系最大的行星和机器学习是什么?"
res = simple_multi_hop(q)
print(f"\n【多跳推理RAG】")
print(f"耗时:{round(time.time()-start,2)}s")
print(f"回答:{res}")
真实运行结果:
【多跳推理RAG】
耗时:2.99s
回答:太阳系最大的行星是木星,它是体积和质量都最大的行星,质量是其他七大行星总和的2.5倍,属于气态巨行星,主要由氢和氦组成,并拥有持续数百年的著名风暴——大红斑。
机器学习是人工智能的一个分支,指计算机系统通过经验(如数据)自动改进性能,而无需被明确编程;它主要分为监督学习、无监督学习和强化学习三大类。
类型6:元数据过滤RAG(Metadata Filter RAG)
定义与核心原理
元数据过滤RAG,是基于文档元数据实现定向、精准检索的RAG方案。
知识库中的每一条文本块,都会附带对应的元数据(如文档来源、页码、分类、作者、发布时间、业务部门等)。元数据过滤RAG会在检索时,先根据用户问题过滤指定的元数据,只在限定的文档范围内做检索,而非全库检索,实现“定向域内检索”。
核心优势
- 检索精准度与可控性拉满:可限定检索范围,只从指定的文档、分类、业务域中检索信息,彻底避免无关文档的内容干扰,回答的可控性极强;
- 检索效率大幅提升:无需全库检索,仅在限定的小范围内做匹配,检索速度更快,尤其适合百万级、千万级文本块的超大规模知识库;
- 支持权限管控:可基于元数据实现不同用户、不同角色的检索权限管控,比如普通员工只能检索公开文档,管理层可检索内部机密文档,适配企业级落地的安全需求;
- 支持多维度文档管理:可基于元数据实现文档的分类、分域、分版本管理,适配企业复杂的知识库架构。
适用场景
- 企业级大规模知识库,文档分部门、分业务、分权限管理的场景;
- 需要限定检索范围,只从指定文档/分类中获取信息的场景;
- 有严格的内容安全、权限管控需求的商业化RAG落地项目;
- 文档有明确的版本、时间、分类标签,需要定向检索的场景。
实操代码与真实运行效果
def metadata_filter_retriever(question, target_source=None):
# 全量检索后,基于元数据做定向过滤
all_docs = vector_store.similarity_search(question, k=10)
# 元数据过滤:仅保留指定来源的文档
if target_source:
filtered_docs = [doc for doc in all_docs if doc.metadata.get("source") == target_source]
return filtered_docs if filtered_docs else all_docs[:2]
return all_docs[:2]
# 测试1:不指定元数据的基础检索
start = time.time()
docs = metadata_filter_retriever("AI 入门指南讲了什么?")
context = format_docs(docs)
res = llm.invoke(prompt.format(context=context, question="AI 入门指南讲了什么?")).content
print(f"\n【元数据过滤RAG-基础检索】")
print(f"耗时:{round(time.time() - start, 2)}s")
print(f"回答:{res}")
# 测试2:指定来源的定向过滤检索
start = time.time()
docs_filtered = metadata_filter_retriever(
"讲了什么内容?",
target_source="AI 入门指南"
)
context_filtered = format_docs(docs_filtered)
res_filtered = llm.invoke(prompt.format(context=context_filtered, question="讲了什么内容?")).content
print(f"\n【元数据过滤RAG-定向检索】")
print(f"找到文档数:{len(docs_filtered)}")
print(f"回答:{res_filtered}")
真实运行结果:
【元数据过滤RAG-基础检索】
耗时:1.21s
回答:上下文中没有提到《AI 入门指南》相关内容,因此无法回答该问题。
【元数据过滤RAG-定向检索】
找到文档数:1
回答:这段内容简要介绍了机器学习的基本概念和主要分类:
- 机器学习是人工智能的一个分支;
- 其核心特点是让计算机系统通过经验自动改进,而无需依赖明确的编程指令;
- 主要分为三类:监督学习、无监督学习和强化学习。
五、RAG类型选型指南
| RAG类型 | 核心优势 | 最佳适配场景 | 不推荐场景 |
|---|---|---|---|
| 基础向量RAG | 极简、低延迟、易上手 | 入门学习、轻量小知识库、简单问答 | 大规模知识库、高精准度要求的场景 |
| 重排序增强RAG | 高精准度、高性价比、适配中大规模知识库 | 绝大多数企业级问答场景、专业知识库 | 极致低延迟要求的极简问答场景 |
| 混合检索RAG | 兼顾语义泛化与关键词精准匹配 | 垂直专业领域、含大量专有名词的知识库 | 纯口语化、无专业术语的通用闲聊场景 |
| 上下文压缩RAG | 低Token成本、高聚焦度、适配长文档 | 长文档场景、规模化落地、成本敏感型项目 | 超短文本、极简知识库场景 |
| 多跳推理RAG | 支持复杂推理、多维度信息整合 | 深度科研问答、复杂业务咨询、多文档跨域检索 | 简单单跳问答、对响应速度要求极高的场景 |
| 元数据过滤RAG | 高可控性、高检索效率、支持权限管控 | 企业级大规模知识库、多部门分权限管理场景 | 无分类、无标签的零散小知识库 |
通用选型建议
- 新手入门:优先从基础向量RAG入手,理解核心原理后,直接升级重排序增强RAG,覆盖绝大多数通用场景;
- 垂直专业领域:优先选择混合检索RAG+重排序增强RAG的组合,兼顾精准度与泛化性;
- 企业级规模化落地:元数据过滤RAG+上下文压缩RAG+重排序增强RAG三者结合,兼顾安全、成本与精准度;
- 复杂深度问答:优先选择多跳推理RAG,搭配混合检索,保证复杂问题的信息覆盖度。
六、总结
RAG技术的核心价值,是让大模型的生成能力与企业私有数据、专业知识库实现安全、精准的结合,而不同类型的RAG方案,本质是针对不同的业务痛点、数据规模、场景需求做的针对性优化。
本文拆解的6大主流RAG类型,覆盖了从入门学习到企业级规模化落地的全场景需求,且所有方案均提供了国内环境可直接运行的实操代码,无需依赖外网模型,彻底规避网络连接报错问题。在实际落地中,无需盲目追求复杂的技术方案,可根据自身的知识库规模、业务需求、成本预算,选择对应的RAG类型,或组合多种方案实现最优效果。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)