← 返回教程
编程教程

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月*

相关教程