使用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多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。