使用DeepSeek-R1和Ollama构建RAG系统以进行本地部署

我们将探讨如何使用DeepSeek R1(一种针对结构化任务优化的开源推理模型)和Ollama(一种用于在本地运行LLM的框架)构建功能齐全的RAG系统。在本教程结束时,您将拥有一个部署的RAG系统,该系统能够从矢量数据库中检索相关信息,并根据该数据生成智能、真实的响应。


📖阅读时长:25分钟

🕙发布时间:2025-02-06

近日热文:全网最全的神经网络数学原理(代码和公式)直观解释
欢迎关注知乎和公众号的专栏内容
LLM架构专栏
知乎LLM专栏
知乎【柏企
公众号【柏企科技说】【柏企阅文

为什么使用RAG系统?

传统的LLM仅依赖于其预先训练的知识,这可能会导致过时或不准确的响应。RAG系统通过在生成响应之前动态检索相关文档来解决此问题,确保AI输出:

  • 最新:获取最新的可用信息。
  • 事实准确:减少AI生成内容中的幻觉。
  • 上下文相关:提供基于检索到的文档的准确答案。

这使得RAG系统成为以下应用的理想选择:

  • 法律研究:检索案例、法律法规
  • 学术研究:获取相关期刊论文
  • 企业知识库:根据公司内部数据回答查询

您需要的内容

在我们深入构建RAG系统之前,请确保您拥有以下工具和依赖项:

核心组件

  • DeepSeek R1:一个强大的开源AI模型,用于逻辑和结构化推理。
  • Ollama:用于运行本地LLM的轻量级可扩展框架。

开发环境

  • Python 3.11+版
  • pip:Python包管理器
  • Streamlit:用于创建简单的用户界面
  • FastAPI:用于构建API端点
  • FAISS:用于快速检索的矢量数据库
  • LangChain:用于连接检索和生成组件

硬件和依赖性

  • 具有足够RAM和CPU的系统(建议使用GPU以获得最佳性能)
  • Internet连接(用于下载模型和依赖项)

第1步:设置您的环境

安装Python和依赖项

确保您已安装Python 3.11+:

python3 --version

如果未安装,请从Python的官方网站下载。

接下来,创建一个虚拟环境并安装所需的依赖项:

python3 -m venv rag_env
source rag_env/bin/activate
pip install fastapi uvicorn langchain faiss streamlit ollama pdfplumber faiss-cpu

第2步:安装DeepSeek R1和Ollama

安装Ollama

Ollama允许您在本地运行DeepSeek R1等模型。使用以下方式进行安装:

curl -fsSL https://ollama.com/install.sh | sh

验证安装:

ollama -v

提取DeepSeek R1模型

要下载和使用DeepSeek R1:

ollama pull deepseek-r1:8b

启动Ollama服务器:

ollama serve

第3步:设置用于检索的Vector数据库

对于文档检索,我们将使用FAISS,这是一个轻量级矢量数据库。

安装FAISS

pip install faiss

加载文档并创建矢量嵌入

from langchain.document_loaders import PDFPlumberLoader
from langchain_experimental.text_splitter import SemanticChunker
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS

loader = PDFPlumberLoader("temp.pdf")
docs = loader.load()
text_splitter = SemanticChunker(HuggingFaceEmbeddings())
documents = text_splitter.split_documents(docs)
embeddings = HuggingFaceEmbeddings()
vector_store = FAISS.from_documents(documents, embeddings)
retriever = vector_store.as_retriever(search_kwargs={"k": 3})

第4步:将DeepSeek R1与Retrieval集成

现在,我们将DeepSeek R1与我们的向量数据库连接起来,以使用检索到的上下文生成响应。

创建Ollama模型界面

from langchain.llms import Ollama
from langchain.prompts import PromptTemplate
from langchain.chains import RetrievalQA

llm = Ollama(model="deepseek-r1:8b")
prompt = PromptTemplate(template="""
Use ONLY the following retrieved context to answer the query:
Context: {context}
Question: {question}
Answer:
""", input_variables=["context", "question"])
qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=retriever, prompt=prompt)

第5步:使用Streamlit部署Web界面

import streamlit as st

st.title("Build a RAG System with DeepSeek R1 & Ollama")
uploaded_file = st.file_uploader("Upload a PDF file", type="pdf")
if uploaded_file is not None:
    with open("temp.pdf", "wb") as f:
        f.write(uploaded_file.getvalue())
    st.success("File uploaded successfully!")
user_query = st.text_input("Ask your PDF a question:")
if user_query:
    with st.spinner("Processing..."):
        response = qa_chain.run(user_query)
    st.write("Response:")
    st.write(response)

使用以下命令运行Streamlit应用程序:

streamlit run app.py

最后的思考和最佳实践

优化您的RAG系统

  • 改进检索:优化向量数据库以提高搜索准确性。
  • 减少延迟:对频繁查询的数据实施缓存。
  • 提高准确性:针对特定领域的任务微调DeepSeek R1。

安全和扩展考虑

  • 数据验证:通过清理用户输入来防止注入攻击。
  • 监控和记录:跟踪API性能和用户交互。
  • 可扩展性:使用FAISS或Milvus等分布式矢量数据库来处理大型数据集。

本文由mdnice多平台发布


柏企科技圈
1 声望0 粉丝

时间差不多了,快上车!~