你是否曾经希望可以直接向PDF或技术手册提问问题?本指南将教你如何用开源推理工具DeepSeek R1 和轻量框架Ollama 来构建检索增强生成(Retrieval-Augmented Generation)系统。
小技巧:使用Apidog来优化API的测试想要简化你的API工作流程?Apidog 提供了一站式解决方案,用于创建、管理及运行测试和模拟服务器。使用Apidog,你可以:
- 自动化关键工作流,无需在多个工具间切换或编写繁杂的脚本。
- 保持 CI/CD 流水线顺畅。
- 识别瓶颈以确保 API 的稳定性和可靠性。
省时省力,把精力集中在完善您的产品上。准备试试看吗?试试手气 Apidog!
为什么是DeepSeek R1?DeepSeek R1,一个与OpenAI的o1相当但价格仅为OpenAI的o1的5%的模型,正在改变RAG系统。开发人员喜欢它因为它的以下特点:
- 聚焦检索:每次仅使用三个文档片段。
- 严格提示:通过回答“不知道”来避免虚构。
- 本地执行:消除云API的延迟。
Ollama 让你可以在本地运行类似的模型,比如 DeepSeek R1。
- 下载: Ollama
- 安装并运行: 在终端中运行以下命令。
ollama run deepseek-r1 # 运行7B模型(默认情况下)
DeepSeek R1 的参数范围为 1.5B 到 671B;从使用 1.5B 模型 开始,适用于轻量级 RAG 应用场景。
ollama run deepseek-r1:1.5b
请运行此命令来运行深度搜索版本1.5b的ollama命令。
小贴士: 比如70B这样的更大模型有更好的推理能力,但需要更多的内存(RAM)。
我们会用到:
# 导入streamlit库
import streamlit as st
# 导入PDF文档加载器
from langchain_community.document_loaders import PDFPlumberLoader
# 导入语义分块器
from langchain_experimental.text_splitter import SemanticChunker
# 导入HuggingFace嵌入
from langchain_community.embeddings import HuggingFaceEmbeddings
# 导入FAISS向量存储库
from langchain_community.vectorstores import FAISS
# 导入Ollama语言模型
from langchain_community.llms import Ollama
在 Streamlit 中使用文件上传功能选择一个本地的 PDF。使用 PDFPlumberLoader
提取文本,无需手动处理。
# 文件上传器
uploaded_file = st.file_uploader("请上传一个PDF文件", type="pdf")
if uploaded_file:
with open("temp.pdf", "wb") as f:
f.write(uploaded_file.getvalue())
# 加载PDF文本
loader = PDFPlumberLoader("temp.pdf")
docs = loader.load()
步骤 3:战略性分块文档
使用 Streamlit 的文件上传功能选择一个本地的 PDF。可以利用 PDFPlumberLoader
高效提取文本,无需手动解析。
# 将文本分割成语义块:
text_splitter = SemanticChunker(HuggingFaceEmbeddings())
documents = text_splitter.split_documents(docs)
生成每个片段的向量嵌入,并存入FAISS索引中。
- 嵌入允许快速、相关的上下文搜索。
# 生成嵌入向量
embeddings = HuggingFaceEmbeddings()
vector_store = FAISS.from_documents(documents, embeddings)
# 连接检索器:
retriever = vector_store.as_retriever(search_kwargs={"k": 3}) # 检索前3个片段
步骤 5:配置 DeepSeek R1 系统
搭建一个使用DeepSeek R1 1.5B模型的检索问答链。
这确保答案基于PDF中的内容,而不是基于模型的训练数据。
llm = Ollama(model="deepseek-r1:1.5b") # 我们的1.5B参数的模型
# 构造提示模板
prompt = """
1. 仅使用以下内容。
2. 如果不确定,请回答“我不知道”。
3. 请保持答案在4句话以内。
上下文:{context}
问题:{question}
回答:
"""
QA_CHAIN_PROMPT = PromptTemplate.from_template(prompt)
第六步:搭建“RAG链”
将上传、分块和检索集成为一体,形成一个流畅的流程。
这种方法让模型有了验证过的背景,从而提高了准确性。
# 链 1:生成答案
llm_chain = LLMChain(llm=llm, prompt=QA_CHAIN_PROMPT)
# 链 2:合并文档片段
document_prompt = PromptTemplate(
template="上下文:\n{page_content}\n出处:{source}",
input_variables=["page_content", "source"]
)
# 最终的 RAG 流水线
qa = RetrievalQA(
combine_documents_chain=StuffDocumentsChain(
llm_chain=llm_chain,
document_prompt=document_prompt
),
retriever=retriever
)
第七步:打开网页界面。
启动网页界面程序
Streamlit使用户能够打字提问并马上得到回复。
- 查询会检索匹配的片段内容,然后将这些片段输入模型,并实时显示结果。这样就可以实时看到结果了。
# Streamlit UI
user_input = st.text_input("在这里向你的PDF提问:")
if user_input:
with st.spinner("正在思考..."):
response = qa(user_input)["result"]
st.write(response)
你可以在这里找到源代码: https://gist.github.com/lisakim0/0204d7504d17cefceaf2d37261c1b7d5
RAG 与 DeepSeek 的未来这只是个开始。随着新功能,如自我验证和多跳推理,未来的RAG系统可以自主辩论并优化其逻辑。
今天就开始构建您自己的RAG系统,释放基于文档的AI的强大功能!
这篇文章的来源:如何在本地使用 Ollama 运行 Deepseek R1?
共同学习,写下你的评论
评论加载中...
作者其他优质文章