使用 DeepSeek R1 大模型和 Ollama 构建本地 RAG 系统-构建 RAG 流水线

B站影视 2025-02-02 11:57 2

摘要:DeepSeek R1 是第一代推理模型,在数学、代码和推理任务方面的性能可与 OpenAI o1 相媲美。在本地运行此类先进模型可以改变游戏规则,提供增强的隐私、定制和对人工智能应用程序的控制。

DeepSeek R1 是第一代推理模型,在数学、代码和推理任务方面的性能可与 OpenAI o1 相媲美。在本地运行此类先进模型可以改变游戏规则,提供增强的隐私、定制和对人工智能应用程序的控制。

接下来,我们将使用 Ollama(一种用于管理和运行 AI 模型的多功能工具)在本地计算机上设置和运行 DeepSeek R1。

创建示例应用文件,命名 DeepSeek_R1_RAG.py,实现如图所示的RAG应用。

注意:在开始运行示例应用时,需要启动 Ollama 服务。

或者命令行启动:ollama serve

默认情况下,Ollama绑定到127.0.0.1端口11434。

导入了必要的库,包括 LangChain 组件,用于文档加载、文本分割、嵌入、向量存储和链创建。

import streamlit as stfrom langchain_community.document_loaders import PDFPlumberLoaderfrom langchain_experimental.text_splitter import SemanticChunkerfrom langchain_community.embeddings import HuggingFaceEmbeddingsfrom langchain_community.vectorstores import FAISSfrom langchain_community.llms import Ollamafrom langchain.prompts import Prompttemplatefrom langchain.chains.llm import LLMChainfrom langchain.chains.combine_documents.stuff import StuffDocumentsChainfrom langchain.chains import RetrievalQA# Streamlit app titlest.title("DeepSeek-R1 + RAG")

这段代码是一个使用 Streamlit 和 LangChain 库的 Python 脚本,用于创建一个名为 "DeepSeek-R1 + RAG" 的 Web 应用。以下是代码的详细解释:

(1)导入必要的库

streamlit:用于创建 Web 应用的开源库。

PDFPlumberLoader:用于加载 PDF 文档的类。

SemanticChunker:用于将文档分割成语义块的类。

HuggingFaceEmbeddings:用于创建嵌入的类。

FAISS:用于存储向量的类。

Ollama:用于调用语言模型的类。

PromptTemplate:用于创建提示模板的类。

LLMChain:用于创建语言模型链的类。

StuffDocumentsChain:用于组合文档的类。

RetrievalQA:用于检索问答的类。

注意:

SemanticChunker 类是 langchain_experimental.text_splitter 模块的一部分,用于将文档分割成语义上有意义的块,这对于文本分析、信息检索和自然语言处理等任务非常有用。

pip install langchain_experimental

上述命令用于安装 langchain_experimental 包,这是一个用于实验性功能和组件的 LangChain 扩展包。通过这个包,开发者可以访问和使用一些尚未正式发布或仍在测试中的新功能。

(2)设置 Streamlit 应用的标题

使用 st.title 方法设置应用的标题为 "DeepSeek-R1 + RAG"。

运行 Streamlit 应用

在终端中导航到保存上述 DeepSeek_R1_RAG.py 文件的目录,然后运行以下命令启动 Streamlit 应用:

streamlit runDeepSeek_R1_RAG.py

运行上述命令后,Streamlit 会在本地服务器上启动应用。

我们可以在终端中看到一个 URL,通常是 http://localhost:8501。打开浏览器并访问该 URL,即可查看上述 Streamlit 应用。

在这个部分,我们使用 Streamlit 的文件上传器,允许用户选择本地的 PDF 文件。示例代码如下所示:

# 上传 PDF 文件uploaded_file = st.file_uploader("上传 PDF 文件", type="pdf")# 检查是否上传了文件if uploaded_file is not None: # 将上传的文件保存到临时位置,以写入二进制模式打开一个名为 temp.pdf 的文件 with open("temp.pdf", "wb") as f: # 将上传文件的内容写入到 temp.pdf 文件中 f.write(uploaded_file.getvalue) # 加载 PDF 文件 # 创建一个 PDFPlumberLoader 对象,并指定要加载的 PDF 文件路径为 temp.pdf loader = PDFPlumberLoader("temp.pdf") # 调用 load 方法读取 PDF 文件的内容,并将其存储在 docs 变量中 docs = loader.load

st.file_uploader 允许用户上传 PDF 文件。上传的文件会被临时保存为 temp.pdf。

上传后,PDFPlumberLoader 函数从 PDF 中提取文本,为流水线的下一个阶段做好准备。这种方法很方便,因为它负责读取文件内容,无需进行大量的手动解析。

可以使用 RecursiveCharacterTextSplitter 或 SemanticChunker 分割文档,代码将原始 PDF 文本分解为较小的段落(片段)。

在这里先解释良好的分块与不良分块的概念:

为什么使用语义分块(SemanticChunker)?

将相关句子分组(例如,“Milvus 如何存储数据”保持完整)避免分割表格或图表 # 使用 HuggingFace 的嵌入模型来创建嵌入向量 embedder = HuggingFaceEmbeddings print("默认的嵌入模型:", embedder.model_name) # 将文档分割为语义块 text_splitter = SemanticChunker(embedder) documents = text_splitter.split_documents(docs)

这一步通过使用语义分块(SemanticChunker)分割文档块,这有助于语言模型更准确地回答问题。小而明确定义的文档块也使搜索更高效、更相关。

注意:

第一次运行时,会下载 HuggingFaceEmbeddings 的默认模型,模型名称如下:

DEFAULT_MODEL_NAME = "sentence-transformers/all-mpnet-base-v2"

在命令行(Terminal)窗口,可以看到下载上述模型的进度,如图所示:

如果无法下载,可以设置代理(Proxy)服务器。

该嵌入模型的更详细信息,可以访问如下链接:

未完待续...

#一步一步构建RAG智能问答系统##langchain#

来源:软件架构

相关推荐