RAG(检索增强生成)技术详解与使用指南
1. RAG 是什么?
RAG(Retrieval-Augmented Generation,检索增强生成) 是一种结合 信息检索 和 大语言模型(LLM) 的技术,用于提升生成式AI回答的准确性和事实性。其核心思想是:
先检索相关知识 → 再让LLM基于检索结果生成答案,从而解决传统LLM的"幻觉问题"(编造虚假信息)。
RAG 工作原理
mermaid
graph LR
A[用户问题] --> B[从知识库检索相关文档]
B --> C[将检索结果+问题输入LLM]
C --> D[生成基于事实的答案]
2. RAG 核心优势
✅ 减少幻觉:答案基于实际文档
✅ 动态更新知识:只需更新检索库,无需重新训练模型
✅ 可解释性强:可标注答案来源(如引用哪份文档)
✅ 低成本:比微调大模型更经济
3. RAG 核心组件
组件 | 说明 | 常用工具 |
---|---|---|
文档加载器 | 解析PDF/Word/网页等 | PyPDF、Unstructured |
文本分块 | 将长文档切分为片段 | LangChain TextSplitter |
向量数据库 | 存储和检索嵌入向量 | Milvus、FAISS、Pinecone |
嵌入模型 | 将文本转为向量 | OpenAI、BGE、Sentence-BERT |
大语言模型 | 生成最终答案 | GPT-4、LLaMA、Claude |
4. 快速实现 RAG(Python示例)
环境准备
pip install langchain openai faiss-cpu sentence-transformers pypdf
完整代码示例
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
# 1. 加载文档
loader = PyPDFLoader("企业年报.pdf")
pages = loader.load()
# 2. 文本分块
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
chunks = text_splitter.split_documents(pages)
# 3. 向量化存储
embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh")
vector_db = FAISS.from_documents(chunks, embeddings)
# 4. 检索增强生成
llm = ChatOpenAI(model="gpt-3.5-turbo")
qa_chain = RetrievalQA.from_chain_type(
llm,
retriever=vector_db.as_retriever(search_kwargs={"k": 3}),
return_source_documents=True
)
# 提问
question = "该公司2023年的营业收入是多少?"
result = qa_chain({"query": question})
print(f"答案:{result['result']}")
print("来源:", result['source_documents'][0].page_content[:100] + "...")
输出示例:
答案:2023年营业收入为15.6亿元,同比增长12%。
来源: 2023年度财务报告...营业收入15.6亿元,较上年增长12%...
5. RAG 高级优化技巧
(1) 分块策略优化
- 语义分块:使用
SemanticSplitter
避免切断完整句子 - 混合分块:结合固定长度和标题分割
(2) 检索增强
# 混合检索(关键词+向量)
from langchain.retrievers import BM25Retriever, EnsembleRetriever
bm25_retriever = BM25Retriever.from_documents(chunks)
ensemble_retriever = EnsembleRetriever(
retrievers=[vector_db.as_retriever(), bm25_retriever],
weights=[0.7, 0.3]
)
(3) 重排序(Rerank)
from sentence_transformers import CrossEncoder
reranker = CrossEncoder("BAAI/bge-reranker-large")
# 对检索结果重新排序
docs = vector_db.similarity_search(question)
reranked = sorted(
[(doc, reranker.predict([[question, doc.page_content]])) for doc in docs],
key=lambda x: x[1],
reverse=True
)
6. 企业级 RAG 架构
mermaid
graph TB
A[用户] --> B[API Gateway]
B --> C[RAG服务集群]
C --> D[向量数据库]
C --> E[缓存层]
D --> F[文档存储]
E --> G[LLM服务]
7. 典型应用场景
场景 | 解决方案 |
---|---|
企业知识库 | RAG + 内部Wiki/手册 |
法律咨询 | RAG + 法规库 |
医疗问答 | RAG + 医学文献 |
电商客服 | RAG + 产品数据库 |
8. 学习资源推荐
通过RAG技术,您可以让大语言模型"学会"查阅资料,生成更可靠的答案! 🚀