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技术,您可以让大语言模型"学会"查阅资料,生成更可靠的答案! 🚀









results matching ""

    No results matching ""