RAG(Retrieval-Augmented Generation,检索增强生成)是目前让大模型落地企业场景最实用的技术方案之一。本文将带你从零开始,构建一套生产级的 RAG 知识库问答系统。
为什么需要 RAG?
大模型虽然强大,但存在几个核心问题:
- 知识截止:训练数据有时间限制,无法获取最新信息
- 幻觉问题:模型可能"一本正经地胡说八道"
- 私有数据:企业内部知识不在模型训练集中
RAG 通过先检索、再生成的方式,让大模型基于真实文档来回答问题,有效解决以上问题。
整体架构
一个标准的 RAG 系统包含以下流程:
- 文档加载:读取 PDF、Word、网页等多种格式
- 文本分块:将长文档切分为合适大小的 Chunk
- 向量化:使用 Embedding 模型将文本转为向量
- 索引存储:存入向量数据库(ChromaDB / Milvus / Pinecone)
- 检索:根据用户 Query 检索最相关的 Chunk
- 生成:将检索结果作为上下文,交给 LLM 生成答案
代码实战
环境准备
pip install langchain chromadb openai tiktoken
文档加载与分块
from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 加载文档
loader = DirectoryLoader("./docs", glob="**/*.md")
documents = loader.load()
# 分块
splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
separators=["\n\n", "\n", "。", "!", "?", ".", " "]
)
chunks = splitter.split_documents(documents)
print(f"共生成 {len(chunks)} 个文本块")
向量化与存储
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
embedding = OpenAIEmbeddings(model="text-embedding-3-small")
vectordb = Chroma.from_documents(
documents=chunks,
embedding=embedding,
persist_directory="./chroma_db"
)
检索与问答
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
llm = ChatOpenAI(model="gpt-4o", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=vectordb.as_retriever(search_kwargs={"k": 4}),
return_source_documents=True
)
result = qa_chain({"query": "我们的退款政策是什么?"})
print(result["result"])
优化策略
基础 RAG 搭建完后,以下是几个关键优化方向:
- 混合检索:结合关键词检索(BM25)和向量检索
- 重排序:使用 Cross-Encoder 对检索结果二次排序
- Query 改写:用 LLM 对用户问题进行扩展和改写
- 分块策略:根据文档类型选择合适的分块大小和重叠
RAG 的效果 80% 取决于检索质量,而不是生成模型的能力。把精力花在检索优化上。
总结
RAG 是目前让大模型安全、准确落地企业场景的最佳路径之一。从简单的文档问答开始,逐步添加混合检索、重排序等优化,你就能构建出一套可靠的企业知识库系统。