什么是RAG(检索增强生成)
了解RAG技术如何让AI获取最新知识,解决幻觉问题
8分钟
2025-12-18
进阶概念RAG知识库
什么是RAG(检索增强生成)
简单理解
RAG(Retrieval-Augmented Generation,检索增强生成) 是一种让AI能够访问外部知识库的技术。
简单来说:先搜索,再回答。
大模型的知识有截止日期,RAG让模型可以实时获取最新信息,大大减少"幻觉"问题。
RAG的工作原理
核心架构(2025最新)
用户问题
↓
┌─────────────────┐
│ 查询处理 │ ← 问题改写/扩展
└────────┬────────┘
↓
┌─────────────────┐
│ 向量检索 │ ← 在向量数据库中搜索
└────────┬────────┘
↓
┌─────────────────┐
│ 重排序 │ ← 优化检索结果
└────────┬────────┘
↓
┌─────────────────┐
│ 生成回答 │ ← LLM基于检索结果回答
└─────────────────┘
三个核心步骤
-
索引(Indexing)
- 将文档切分成小块(Chunks)
- 使用Embedding模型将文本转换为向量
- 存储到向量数据库中
-
检索(Retrieval)
- 用户提问时,将问题也转换为向量
- 在向量数据库中找到最相似的文档片段
- 返回最相关的Top-K个结果
-
生成(Generation)
- 将检索到的内容作为上下文
- 连同用户问题一起发送给大模型
- 模型基于这些信息生成回答
为什么需要RAG?
解决的问题
| 问题 | RAG如何解决 |
|---|---|
| 知识过时 | 实时检索最新文档 |
| 幻觉/编造 | 基于真实文档回答 |
| 专业知识不足 | 接入专业知识库 |
| 无法引用来源 | 可以标注信息出处 |
2025年主流技术栈
向量数据库
- Pinecone:托管服务,企业级首选
- Milvus:开源,高性能,支持百亿级向量
- Chroma:轻量级,适合快速原型
- Weaviate:功能丰富,支持混合搜索
- Qdrant:Rust编写,性能优异
Embedding模型
- OpenAI text-embedding-3-large:效果最好,1536/3072维
- Voyage AI:专为RAG优化
- BAAI/bge-m3:开源多语言,效果接近商业模型
- Jina Embeddings v3:支持8192 tokens
开发框架
- LlamaIndex:专注数据连接,RAG首选
- LangChain:通用LLM框架,生态丰富
- Haystack:企业级解决方案
进阶RAG技术(2025)
1. 混合检索(Hybrid Search)
结合关键词搜索(BM25)和向量搜索,提高召回率。
# 示例:混合检索
results = vector_search(query) + keyword_search(query)
final_results = rerank(results)
2. 重排序(Reranking)
使用专门的重排序模型(如Cohere Rerank、BGE-Reranker)对初步检索结果再次排序。
3. 查询改写(Query Rewriting)
用LLM改写用户查询,生成多个变体进行检索:
- 原始问题:"Python怎么读文件"
- 改写1:"Python文件读取方法"
- 改写2:"Python open函数使用"
4. 自适应RAG(Adaptive RAG)
根据问题类型动态决定是否需要检索,简单问题直接回答。
5. Graph RAG
结合知识图谱,理解实体关系,提供更准确的答案。
实践代码示例
使用LlamaIndex构建RAG
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
# 1. 加载文档
documents = SimpleDirectoryReader("./data").load_data()
# 2. 创建索引
index = VectorStoreIndex.from_documents(documents)
# 3. 创建查询引擎
query_engine = index.as_query_engine()
# 4. 查询
response = query_engine.query("什么是RAG?")
print(response)
使用LangChain构建RAG
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.chains import RetrievalQA
# 1. 创建向量存储
vectorstore = Chroma.from_documents(documents, OpenAIEmbeddings())
# 2. 创建检索器
retriever = vectorstore.as_retriever(search_kwargs={"k": 4})
# 3. 创建QA链
qa_chain = RetrievalQA.from_chain_type(
llm=ChatOpenAI(model="gpt-4o"),
retriever=retriever
)
# 4. 查询
answer = qa_chain.invoke("什么是RAG?")
最佳实践建议
- 文档切分:根据内容特点选择合适的chunk大小(通常500-1000字符)
- 重叠设置:chunk之间保留10-20%重叠,保持上下文连贯
- 元数据:保存文档来源、时间等元数据,便于过滤和引用
- 评估优化:建立评估数据集,持续优化检索效果
- 缓存策略:对常见问题缓存结果,提高响应速度