摘要: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.loadst.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#
来源:软件架构