RAG核心概念
概述
RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合信息检索和文本生成的AI技术架构。它通过从外部知识库检索相关信息,增强大模型的生成能力,有效解决大模型知识截止、幻觉问题以及领域知识不足等痛点。
什么是RAG
基本定义
RAG将信息检索系统与大语言模型相结合,在生成回答前先从知识库中检索相关文档片段,然后将这些片段作为上下文提供给LLM,从而生成更准确、更有依据的回答。
工作流程
用户查询 → 向量化 → 向量检索 → 获取相关文档 → 构建Prompt → LLM生成 → 返回答案核心组件
| 组件 | 功能 | 技术选型 |
|---|---|---|
| 文档处理 | 文本分块、清洗 | LangChain、LlamaIndex |
| 向量化 | 文本转向量 | OpenAI Embeddings、BGE |
| 向量存储 | 向量索引与检索 | Pinecone、Milvus、Chroma |
| 检索器 | 相似度搜索 | FAISS、HNSW |
| 生成器 | 文本生成 | GPT-4、Claude、通义千问 |
RAG vs Fine-tuning
对比分析
| 维度 | RAG | Fine-tuning |
|---|---|---|
| 知识更新 | 实时更新知识库 | 需要重新训练 |
| 成本 | 较低,按需检索 | 较高,训练费用大 |
| 适用场景 | 知识密集型任务 | 风格适配、特定任务 |
| 可解释性 | 高,可追溯来源 | 低,黑盒模型 |
| 数据隐私 | 数据不进入模型 | 数据用于训练 |
| 部署速度 | 快,即插即用 | 慢,需要训练时间 |
选择建议
适合RAG的场景:
- 知识频繁更新的场景(新闻、政策)
- 需要引用来源的场景(法律、医疗)
- 企业私有知识库问答
- 实时数据查询需求
适合Fine-tuning的场景:
- 特定风格或格式要求
- 领域专业术语理解
- 复杂推理任务
- 减少Prompt长度
混合方案:
- RAG + Fine-tuning 结合使用
- Fine-tuning优化模型能力,RAG提供知识支持
RAG架构模式
1. 简单RAG
最基础的RAG架构,直接检索并生成。
python
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.llms import OpenAI
from langchain.chains import RetrievalQA
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(documents, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
qa_chain = RetrievalQA.from_chain_type(
llm=OpenAI(),
chain_type="stuff",
retriever=retriever
)
answer = qa_chain.run("什么是RAG?")2. 高级RAG
增加预处理、重排序、后处理等环节。
python
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor
llm = OpenAI(temperature=0)
compressor = LLMChainExtractor.from_llm(llm)
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=retriever
)
docs = compression_retriever.get_relevant_documents("查询内容")3. 模块化RAG
灵活组合各个模块,支持复杂场景。
python
class ModularRAG:
def __init__(self):
self.query_transformer = QueryTransformer()
self.retriever = HybridRetriever()
self.reranker = Reranker()
self.generator = Generator()
def process(self, query):
expanded_queries = self.query_transformer.expand(query)
docs = self.retriever.retrieve(expanded_queries)
reranked_docs = self.reranker.rerank(docs, query)
return self.generator.generate(query, reranked_docs)关键技术点
向量嵌入
将文本转换为高维向量,捕捉语义信息。
python
from openai import OpenAI
client = OpenAI()
def get_embedding(text):
response = client.embeddings.create(
model="text-embedding-3-small",
input=text
)
return response.data[0].embedding
embedding = get_embedding("这是一段测试文本")
print(f"向量维度: {len(embedding)}")相似度计算
常用余弦相似度衡量向量相似程度。
python
import numpy as np
def cosine_similarity(vec1, vec2):
dot_product = np.dot(vec1, vec2)
norm1 = np.linalg.norm(vec1)
norm2 = np.linalg.norm(vec2)
return dot_product / (norm1 * norm2)
similarity = cosine_similarity(embedding1, embedding2)检索策略
| 策略 | 说明 | 适用场景 |
|---|---|---|
| 密集检索 | 向量相似度搜索 | 语义相似查询 |
| 稀疏检索 | 关键词匹配 | 精确匹配需求 |
| 混合检索 | 结合密集与稀疏 | 综合效果最好 |
| 多查询检索 | 扩展多个查询 | 提高召回率 |
RAG的优势与挑战
优势
- 知识可更新:无需重新训练,更新知识库即可
- 减少幻觉:基于检索事实生成,降低编造风险
- 可追溯性:提供信息来源,增强可信度
- 成本可控:避免频繁微调的高昂成本
- 数据安全:敏感数据不进入模型参数
挑战
- 检索质量:检索不准确影响生成效果
- 上下文长度:检索文档过多超出窗口限制
- 延迟问题:检索步骤增加响应时间
- 知识冲突:多个来源信息不一致
- 冷启动:知识库构建需要时间和成本
实际应用场景
企业知识库
python
from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
loader = DirectoryLoader('./docs', glob="**/*.pdf")
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
chunks = text_splitter.split_documents(documents)
vectorstore = Chroma.from_documents(chunks, embeddings)智能客服
结合企业FAQ和产品文档,提供精准客服支持。
法律咨询
检索相关法条和案例,辅助法律决策。
医疗问答
基于医学文献和临床指南,提供专业医疗建议。
小结
RAG技术通过检索增强生成,有效解决了大模型的知识局限性和幻觉问题。相比Fine-tuning,RAG在知识更新、成本控制和可解释性方面具有明显优势。掌握RAG的核心概念和架构模式,是构建企业级AI应用的重要基础。
下一章将深入讲解文档处理与分块策略,这是RAG系统的第一步关键环节。