什么是RAG?
RAG(Retrieval-Augmented Generation,检索增强生成)是一种将外部知识检索与大模型生成能力结合的技术框架。大模型训练数据有截止日期,也无法直接读取企业内部文档,RAG正是解决这一局限的核心方案。
RAG的工作原理
RAG的完整流程分为两个阶段:
离线阶段(知识库构建):
- 文档加载:读取PDF、Word、网页等各类格式文档
- 文本切片:将长文档切割为固定长度的文本块(Chunk),通常200-500 Token
- 向量嵌入:用Embedding模型将每个文本块转为高维向量
- 向量存储:将向量和原始文本存入向量数据库(如Chroma、Pinecone、Milvus)
在线阶段(问答检索):
- 问题嵌入:将用户问题也转为向量
- 相似度检索:在向量库中找出最相关的Top-K个文本块
- 提示词拼接:将检索到的文本块拼入系统提示,告知模型”根据以下资料回答”
- 模型生成:大模型基于上下文生成答案
关键组件详解
文本切片策略:切片太短会丢失上下文,切片太长会引入噪声。常用策略包括固定长度切片(简单直接)、按段落/章节切片(保留语义完整性)、滑动窗口切片(相邻块有重叠)。
Embedding模型选择:OpenAI的text-embedding-3-small性价比高;本地部署可选bge-m3(中英文效果好);sentence-transformers提供丰富的开源选择。
向量数据库:小规模场景用Chroma(轻量本地部署);大规模生产环境推荐Milvus或Qdrant;云端SaaS选Pinecone。
RAG的常见问题与优化
检索精度低:优化切片策略,增加元数据过滤(如按文档类型、日期过滤),使用混合检索(向量检索+关键词检索)。
答案与问题不相关:检查Embedding模型与查询语言是否匹配;适当增加检索Top-K数量;优化提示词模板,明确要求模型仅基于提供的资料回答。
知识库更新不及时:实现增量更新机制,新文档自动入库;定期重建索引清理过时数据。
快速上手:LangChain实现RAG
from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
# 加载文档
loader = DirectoryLoader('./docs', glob="**/*.txt")
docs = loader.load()
# 切片
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(docs)
# 向量化存储
vectorstore = Chroma.from_documents(chunks, OpenAIEmbeddings())
# 构建问答链
qa = RetrievalQA.from_chain_type(
llm=OpenAI(), retriever=vectorstore.as_retriever(search_kwargs={"k": 3})
)
print(qa.run("你的问题"))
RAG vs 微调:如何选择?
RAG适合知识频繁更新、需要引用来源、数据量大的场景;微调适合需要改变模型风格/格式、特定领域专业表达的场景。实际项目中两者可以结合使用——先微调模型的回答风格,再用RAG注入实时知识。