RAG 技术深度解析:检索增强生成的原理与实践 什么是 RAG? RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合信息检索和生成式 AI 的技术,通过从外部知识库检索相关信息来增强大模型的回答能力。 核心架构 为什么需要 RAG? 大模型的局限性 知识截止:训练数据有时间限制 幻觉问题:可能生成错误信息 领域知识不足:通用模型缺乏专业知识 RAG 的优势 实时知识:可以访问最新信息 准确性提升:基于事实回答,减少幻觉 可解释性:可以溯源引用来源 成本效益:无需微调模型 技术实现 文档切分(Chunking) 最佳实践: Chunk size: 500-1500 tokens Overlap: 10-20% 保持语义完整性(段落、章节)
RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合信息检索和生成式 AI 的技术,通过从外部知识库检索相关信息来增强大模型的回答能力。
用户查询 ↓ [检索器] → 向量数据库 ↓ 相关文档片段 ↓ [提示词模板 + 查询 + 检索内容] ↓ [大语言模型] ↓ 增强的回答
from langchain.text_splitter import RecursiveCharacterTextSplitter text_splitter = RecursiveCharacterTextSplitter( chunk_size=1000, # 每块大小 chunk_overlap=200, # 重叠部分 length_function=len, ) chunks = text_splitter.split_documents(documents)
最佳实践:
from sentence_transformers import SentenceTransformer # 加载模型 model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2') # 生成向量 embeddings = model.encode(["你的文本"])
主流模型:
| 数据库 | 特点 | 适用场景 |
|---|---|---|
| Chroma | 轻量级,易用 | 小型项目,快速原型 |
| Pinecone | 全托管,性能好 | 生产环境,大规模 |
| Weaviate | 多模态,灵活 | 复杂查询 |
| Milvus | 开源,高性能 | 私有化部署 |
| Qdrant | Rust 实现,快速 | 高性能需求 |
import chromadb # 创建客户端 client = chromadb.Client() # 创建集合 collection = client.create_collection("documents") # 添加文档 collection.add( documents=["文档1", "文档2", "文档3"], ids=["doc1", "doc2", "doc3"], embeddings=[[...], [...], [...]] # 可选,自动生成 ) # 查询 results = collection.query( query_texts=["用户问题"], n_results=3 )
# 基于向量相似度 results = vector_store.similarity_search(query, k=5)
# 结合关键词和语义 from langchain.retrievers import BM25Retriever, EnsembleRetriever bm25_retriever = BM25Retriever.from_documents(docs) vector_retriever = vector_store.as_retriever() ensemble_retriever = EnsembleRetriever( retrievers=[bm25_retriever, vector_retriever], weights=[0.5, 0.5] )
from sentence_transformers import CrossEncoderReranker reranker = CrossEncoderReranker( model="cross-encoder/ms-marco-MiniLM-L-6-v2", top_k=5 ) # 先检索 top 50,再重排序到 top 5 docs = vector_store.similarity_search(query, k=50) reranked_docs = reranker.rerank(query, docs)
prompt_template = """ 你是一个专业的助手。请根据以下参考信息回答用户的问题。 参考信息: {context} 用户问题: {question} 回答: """
你是一位有10年经验的资深技术顾问,擅长用清晰易懂的语言解释复杂概念。
请按以下步骤思考: 1. 理解问题的核心 2. 从参考信息中提取相关内容 3. 组织完整的回答 4. 指出信息来源
在回答中,请使用 [文档X] 的格式标注信息来源。 例如:根据 [文档1],RAG 技术由...
from langchain.chains import ConversationalRetrievalChain from langchain.memory import ConversationBufferMemory memory = ConversationBufferMemory( memory_key="chat_history", return_messages=True ) qa_chain = ConversationalRetrievalChain.from_llm( llm=llm, retriever=retriever, memory=memory )
from langchain.chains import LLMChain from langchain.prompts import PromptTemplate query_template = PromptTemplate( input_variables=["question"], template="请将以下问题改写为更适合检索的形式:{question}" ) query_chain = LLMChain(llm=llm, prompt=query_template) rewritten_query = query_chain.run(question)
# 添加元数据 collection.add( documents=["...\], metadatas=[{"source": "doc1", "category": "tech"}], ids=["doc1"] ) # 带过滤的查询 results = collection.query( query_texts=["问题"], where={"category": "tech"}, n_results=5 )
from ragas import evaluate from ragas.metrics import faithfulness, answer_relevancy result = evaluate( dataset=dataset, metrics=[faithfulness, answer_relevancy] )
RAG 技术通过检索增强生成,有效解决了大模型的幻觉和知识滞后问题。关键在于:
建议从简单场景开始,逐步积累经验,根据实际需求优化各个环节。