RAG 知识库搭建实战:从零打造企业级 AI 智能问答系统
什么是 RAG?为什么你需要它?
RAG(Retrieval-Augmented Generation,检索增强生成)是当前最火的 AI 应用架构之一。简单说,就是让 AI 在回答问题前,先从你的私有知识库中检索相关信息,再结合检索结果生成准确的答案。
为什么需要 RAG?
- 大模型知识有截止日期,无法回答最新信息
- 企业有大量私有数据,大模型无法直接访问
- 直接训练或微调成本太高,RAG 是性价比最高的方案
- 可以引用来源,答案更可信
RAG 核心架构解析
一个完整的 RAG 系统包含三个核心模块:
用户问题 → 向量检索 → 上下文组装 → LLM 生成 → 最终答案
↓ ↓
文档入库 → 向量化存储
关键技术点:
1. 文档处理:PDF/Word/网页 → 纯文本 → 分块 2. 向量化:文本 → Embedding 模型 → 向量 3. 向量数据库:存储、索引、检索 4. Prompt 工程:将检索结果和问题组合成提示词
实战:搭建一个最小可用 RAG 系统
环境准备
# 安装依赖 pip install langchain chromadb openai sentence-transformers pypdf
第一步:文档加载与分块
from langchain.document_loaders import PyPDFLoader, TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter# 加载 PDF 文档 loader = PyPDFLoader("your_document.pdf") documents = loader.load()
# 智能分块(推荐 500-1000 字符,重叠 100-200) text_splitter = RecursiveCharacterTextSplitter( chunk_size=800, chunk_overlap=150, separators=["\n\n", "\n", "。", "!", "?", ";", " ", ""] ) chunks = text_splitter.split_documents(documents)
print(f"文档分块完成:{len(chunks)} 个文本块")
第二步:向量化存储
from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import Chroma# 使用本地模型(免费,隐私安全) embeddings = HuggingFaceEmbeddings( model_name="BAAI/bge-small-zh-v1.5", # 中文向量模型 model_kwargs={"device": "cpu"}, encode_kwargs={"normalize_embeddings": True} )
# 存入向量数据库 vectorstore = Chroma.from_documents( documents=chunks, embedding=embeddings, persist_directory="./chroma_db" ) vectorstore.persist() print("向量库构建完成!")
第三步:检索与生成
from langchain.chains import RetrievalQA from langchain.llms import OpenAI# 创建检索器 retriever = vectorstore.as_retriever( search_type="similarity", search_kwargs={"k": 4} # 返回 top 4 相关文档 )
# 创建问答链 qa_chain = RetrievalQA.from_chain_type( llm=OpenAI(temperature=0, model="gpt-3.5-turbo"), chain_type="stuff", retriever=retriever, return_source_documents=True # 返回来源 )
# 提问 question = "公司的年假制度是什么?" result = qa_chain({"query": question})
print(f"回答:{result['result']}") print(f"\n参考来源:") for doc in result['source_documents']: print(f"- {doc.metadata.get('source', '未知')} 第{doc.metadata.get('page', '?')}页")
进阶技巧:让 RAG 更智能
1. 混合检索
from langchain.retrievers import EnsembleRetriever from langchain.retrievers import BM25Retriever# 向量检索(语义相似) vector_retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
# 关键词检索(精确匹配) bm25_retriever = BM25Retriever.from_documents(chunks) bm25_retriever.k = 5
# 混合检索(效果更好) ensemble_retriever = EnsembleRetriever( retrievers=[vector_retriever, bm25_retriever], weights=[0.6, 0.4] )
2. 重排序提升精度
from langchain.retrievers import ContextualCompressionRetriever from langchain.retrievers.document_compressors import CrossEncoderReranker# 使用 Cross-Encoder 重排序 compressor = CrossEncoderReranker( model_name="BAAI/bge-reranker-base", top_n=4 ) compression_retriever = ContextualCompressionRetriever( base_compressor=compressor, base_retriever=vector_retriever )
3. 流式输出提升体验
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandlerqa_chain = RetrievalQA.from_chain_type( llm=OpenAI( temperature=0, streaming=True, callbacks=[StreamingStdOutCallbackHandler()] ), retriever=retriever )
常见问题与解决方案
| 问题 | 解决方案 |
|---|---|
| 检索结果不相关 | 调整 chunk_size,使用混合检索,添加重排序 |
| 回答产生幻觉 | 设置 temperature=0,要求引用原文,添加验证步骤 |
| 处理速度慢 | 使用更小的向量模型,批量处理,缓存常见问题 |
| 答案不完整 | 增加 retrieve 数量,使用 map_reduce chain |
生产环境部署建议
1. 向量数据库选型 - 小规模:Chroma / FAISS(本地部署) - 中规模:Milvus / Weaviate(集群部署) - 大规模:Pinecone / Zilliz Cloud(云服务)
2. API 网关
from fastapi import FastAPI from pydantic import BaseModelapp = FastAPI()
class Query(BaseModel): question: str
@app.post("/ask") async def ask(query: Query): result = qa_chain({"query": query.question}) return { "answer": result["result"], "sources": [doc.metadata for doc in result["source_documents"]] }
3. 监控与优化 - 记录用户问题和答案质量评分 - 定期更新知识库 - A/B 测试不同参数效果
总结
RAG 是企业落地 AI 的最佳切入点。核心流程并不复杂:文档分块 → 向量化 → 检索 → 生成。但要做出好用的系统,需要在检索精度、回答质量、性能优化上持续打磨。
建议从最小可用版本开始,逐步迭代优化。先跑通流程,再追求效果。
下一步行动:
- 用自己的文档跑通上面的代码
- 调整分块参数,对比效果
- 尝试混合检索和重排序
- 封装成 API 服务
有问题欢迎评论区交流!
本文链接:https://www.kkkliao.cn/?id=686 转载需授权!
版权声明:本文由廖万里的博客发布,如需转载请注明出处。



手机流量卡
免费领卡
号卡合伙人
产品服务
关于本站
