编程教程
RAG 2.0:下一代检索增强生成架构详解
作者: 管理员发布: 2026/4/29👁 11623❤️ 43
深入解析RAG 2.0架构改进,包括混合检索、重排序和多模态RAG。
# RAG 2.0:下一代检索增强生成架构详解
RAG(检索增强生成)解决了大模型知识过时和幻觉问题。RAG 2.0 在此基础上大幅提升了检索质量和生成效果。
## 一、为什么需要RAG?
```
纯LLM的问题:
1. 知识有截止日期(GPT-4截止到2025年)
2. 不知道你公司的私有数据
3. 会"编造"不存在的信息(幻觉)
RAG的解决方式:
用户提问 → 从知识库检索相关内容 → 把检索结果给LLM → LLM基于真实内容回答
```
## 二、RAG 1.0 vs RAG 2.0
| | RAG 1.0 | RAG 2.0 |
|---|---------|---------|
| 文档处理 | 简单分块 | 语义分块 + 层次化索引 |
| 检索方式 | 单次向量搜索 | 多路召回 + 重排序 |
| Embedding | 通用模型 | 领域微调模型 |
| 上下文 | 拼接top-k结果 | 智能压缩 + 去重 |
| 评估 | 人工检查 | 自动化RAGAS评估 |
## 三、RAG 2.0 完整架构
```
文档输入 → 解析 → 语义分块 → Embedding → 向量数据库
↓
用户提问 → Query改写 → 多路检索 → 重排序 → 上下文压缩 → LLM生成
```
### 3.1 文档解析
```python
from unstructured.partition.auto import partition
# 支持PDF、Word、PPT、Excel、HTML、图片等
elements = partition(filename="report.pdf")
# 提取表格
tables = [e for e in elements if e.category == "Table"]
# 提取标题
titles = [e for e in elements if e.category == "Title"]
# 提取正文
texts = [e for e in elements if e.category == "NarrativeText"]
```
### 3.2 语义分块(不是按字数切)
```python
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
separators=["\n## ", "\n### ", "\n\n", "\n", "。", ";", ","],
)
chunks = splitter.split_text(document_text)
```
**关键:按语义边界切,不要按固定字数切。**
### 3.3 多路召回
```python
from langchain_community.retrievers import BM25Retriever
from langchain_community.vectorstores import Chroma
# 1. 向量检索(语义相似)
vector_retriever = Chroma.from_documents(chunks, embedding).as_retriever(k=10)
# 2. BM25检索(关键词匹配)
bm25_retriever = BM25Retriever.from_documents(chunks, k=10)
# 3. 合并去重
def multi_recall(query):
vec_results = vector_retriever.invoke(query)
bm25_results = bm25_retriever.invoke(query)
all_results = vec_results + bm25_results
# 去重
seen = set()
unique = []
for doc in all_results:
if doc.page_content not in seen:
seen.add(doc.page_content)
unique.append(doc)
return unique
```
### 3.4 重排序(Reranking)
```python
from langchain.retrievers import ContextualCompressionRetriever
from langchain_cohere import CohereRerank
# 用Cohere Rerank对检索结果重新排序
compressor = CohereRerank(model="rerank-v3.5", top_n=5)
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=vector_retriever
)
# 重排序后只保留最相关的5个
results = compression_retriever.invoke("如何配置SSL证书?")
```
### 3.5 完整RAG链
```python
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
llm = ChatOpenAI(model="gpt-4o")
prompt = ChatPromptTemplate.from_template("""基于以下参考资料回答问题。
如果资料中没有相关信息,说"我没有找到相关信息"。
不要编造内容。
参考资料:
{context}
问题:{question}
回答:""")
def rag_query(question):
# 1. 检索
docs = compression_retriever.invoke(question)
context = "\n\n".join([d.page_content for d in docs])
# 2. 生成
chain = prompt | llm
response = chain.invoke({"context": context, "question": question})
return response.content
# 使用
answer = rag_query("公司的年假政策是什么?")
print(answer)
```
## 四、向量数据库选择
| 数据库 | 特点 | 适合 |
|--------|------|------|
| Chroma | 简单轻量,Python原生 | 原型/小项目 |
| FAISS | Meta开源,速度快 | 高性能场景 |
| Milvus | 分布式,可扩展 | 生产环境 |
| Pinecone | 全托管云服务 | 不想运维 |
| Qdrant | Rust写的,高效 | 性能敏感 |
| Weaviate | 功能全面 | 企业级 |
## 五、评估RAG效果
```python
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_relevancy
# 准备测试数据
test_data = {
"question": ["公司年假几天?", "报销流程是什么?"],
"answer": ["15天", "填报销单→主管审批→财务打款"],
"contexts": [["年假政策文档内容..."], ["报销流程文档内容..."]],
"ground_truth": ["15天", "填单→审批→打款"],
}
results = evaluate(test_data, metrics=[faithfulness, answer_relevancy])
print(results)
```
## 总结
**RAG 2.0 关键改进:多路召回 + 重排序 + 语义分块**
新手路线:
1. Chroma + LangChain搭建基础RAG
2. 加入BM25多路召回
3. 加入Rerank重排序
4. RAGAS自动评估
> 📌 关注AI导航,获取更多AI开发教程!
*最后更新:2026年4月*