➔
RAG(检索增强生成)是将大模型与企业私有知识库结合的主流方案。通过检索相关文档片段再让模型生成回答,既保证了回答的时效性,又解决了大模型知识截止和幻觉问题。本文使用DeepSeek-R1和Qwen2.5-MAX作为基座模型讲解搭建流程。
▶一、系统架构概览
一个完整的RAG系统包含以下核心组件:
- ●文档加载器:支持PDF、Word、HTML、Markdown等多种格式
- ●文本分割器:将长文档切分为语义完整的片段
- ●向量嵌入模型:将文本转化为向量表示
- ●向量数据库:存储和检索向量,如Milvus、Qdrant、Chroma
- ●大语言模型:根据检索结果生成最终回答
- ●重排序器:对检索结果进行精细排序,提升准确率
▶二、环境搭建与依赖安装
code
pip install langchain langchain-community chromadb
pip install sentence-transformers # 嵌入模型
pip install ollama # 本地推理
# 拉取嵌入模型
ollama pull nomic-embed-text
# 拉取DeepSeek-R1作为回答模型
ollama pull deepseek-r1:7b
▶三、核心代码实现
code
from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.llms import Ollama
from langchain_community.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import DirectoryLoader
from langchain.chains import RetrievalQA
# 1. 加载文档
loader = DirectoryLoader("./docs/", glob="**/*.md")
documents = loader.load()
# 2. 分割文档
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
separators=["
", "
", "。", "!", "?", " ", ""]
)
chunks = text_splitter.split_documents(documents)
# 3. 创建向量库
embeddings = OllamaEmbeddings(model="nomic-embed-text")
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db"
)
# 4. 创建RAG问答链
llm = Ollama(model="deepseek-r1:7b", temperature=0.3)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(search_kwargs={"k": 4})
)
# 5. 提问
result = qa_chain.run("DeepSeek-R1支持哪些量化版本?")
print(result)
▶四、优化技巧
- ●混合检索:结合向量相似度搜索和关键词BM25搜索,提升召回率
- ●HyDE:先让模型根据问题生成假设文档,再用假设文档检索,提高语义匹配度
- ●多轮对话:保存历史对话记录,支持追问和上下文理解
- ●引用溯源:在回答中标注信息来源,便于验证答案准确性
▶五、生产环境部署建议
对于生产环境,建议使用Milvus或Qdrant作为向量数据库(替代Chroma),使用FastAPI搭建API服务,并配置缓存层提升响应速度。非结构化数据量超过100万条时,推荐使用Elasticsearch的向量检索功能。
▶六、检索重排序优化
使用Cross-Encoder对初步检索结果进行精细重排序,提升检索质量:
code
from sentence_transformers import CrossEncoder
reranker = CrossEncoder('BAAI/bge-reranker-v2-m3')
scores = reranker.predict([[q, d] for d in docs])
top_k = [d for _, d in sorted(zip(scores, docs), reverse=True)][:3]
▶七、查询转换技术
通过多查询扩展、查询分解、回溯式检索等查询转换技术显著提升RAG回答质量。用户原始查询不够精确时尤为有效。
▶八、端到端评估体系
使用RAGAS框架建立评估指标体系,覆盖检索召回率、答案忠实度和相关性。自动化评估及时发现和定位系统瓶颈。
▶九、混合检索策略
结合稀疏检索(BM25)和稠密检索(向量相似度)的混合检索方案可以兼顾召回率和精确率。稀疏检索擅长关键词精确匹配,稠密检索擅长语义相似度匹配:
code
# 混合检索实现
from langchain.retrievers import EnsembleRetriever
sparse_retriever = BM25Retriever.from_documents(docs)
dense_retriever = VectorStoreRetriever(vectorstore=vs)
ensemble = EnsembleRetriever(
retrievers=[sparse_retriever, dense_retriever],
weights=[0.3, 0.7]
)
results = ensemble.get_relevant_documents(query)
▶十、多模态RAG
将检索范围从纯文本扩展到图像、表格和图表,构建多模态RAG系统。使用CLIP等多模态嵌入模型对图片和文本进行统一编码,使系统可以同时检索和理解图文混合内容。
▶十一、生产部署最佳实践
生产环境RAG系统需要注意:使用连接池管理数据库连接、设置合理的超时和重试策略、实现请求限流和降级、配置日志监控和告警。建议使用Kubernetes进行容器化部署,支持自动扩缩容以应对流量波动。