新闻资讯

掌握最新资讯,了解关于我们的最新动态!
您当前位置首页 > 新闻资讯 > AI大模型

基于开源大模型的RAG知识库系统搭建完整教程

更新时间:2026-06-02 00:42

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进行容器化部署,支持自动扩缩容以应对流量波动。

安全合格的云服务,让您的业务轻松上云!

立即选购