本地部署Deepseek R1,并利用本地知识库创建RAG

大家好,本本将使用 Ollama 在 8GB 内存笔记本上部署 Deepseek R1 模型,再结合 LlamaIndex 和 Flask,构建 RAG 聊天机器人。跟着文章操作,可以用最少的资源在本地打造 RAG 聊天机器人。它能稳定运行,随时给出精准答案和深刻见解,助力你轻松踏入 AI 应用开发的大门。

1.DeepSeek R1:推理模型新高度 

AI飞速发展,创新的脚步从未停歇,推理模型不断打破机器理解和处理复杂查询的极限。

其中,DeepSeek 研发的 DeepSeek R1 推理模型备受行业关注。

DeepSeek R1 创新性地将思维链(Chain of Thought,CoT)推理融入工作流程,旨在提升 AI 生成回复的准确性与透明度。

1.1 DeepSeek R1是什么

DeepSeek R1,也称为deepseek-reasoner,是一款利用思维链(CoT)来提高回复质量的推理模型。

与直接生成答案的传统模型不同,DeepSeek R1在给出最终输出之前,会先生成详细的推理过程(CoT)。这个中间步骤让模型能够“思考”问题,从而得出更准确、更可靠的答案。

该模型在需要逻辑推理、解决问题或多步分析的任务中特别有用。通过让用户能够查看思维链内容,DeepSeek R1还具备了透明度,开发者和用户可以借此了解模型是如何得出结论的。

1.2 DeepSeek R1主要特性

  • 思维链(CoT)推理:DeepSeek R1在生成最终答案之前,会生成一个逐步的推理过程。这个思维链内容可以通过API访问,用户能够查看和分析模型的思考过程。

  • 高上下文长度支持:API支持最大64K令牌的上下文长度,这使得它适合处理冗长复杂的查询。值得注意的是,思维链输出(最长32K令牌)不计入这64K的限制内。

  • 多轮对话:在多轮对话中,DeepSeek R1在每一轮都会输出思维链和最终答案。不过,前一轮的思维链不会延续到下一轮,以确保上下文保持聚焦且易于管理。

    图片

  • API集成:DeepSeek R1可通过API访问,便于集成到现有应用程序中。API支持聊天补全和聊天前缀补全(测试版)等功能,但函数调用和JSON输出等功能暂不支持。

    图片

1.3 DeepSeek R1工作原理

当你与DeepSeek R1交互时,模型会遵循以下两步流程:

  • 生成思维链(CoT):模型首先会生成一个详细的推理过程(CoT),将问题分解为更小的逻辑步骤。这个中间输出会存储在reasoning_content字段中。

  • 生成最终答案:基于思维链,模型生成最终答案,并存储在content字段中。这确保了回复是经过充分推理且准确的。

例如,如果你向模型提出一个复杂的数学问题,它会先列出解题步骤(思维链),然后再给出最终答案。

1.4 DeepSeek R1 API:参数与用法全解析

要使用DeepSeek R1,需要与其API进行交互。下面为大家简要梳理其关键参数与使用要点:

  • 输入参数

    • max_tokens:控制最终回复的最大长度。默认值为4K令牌,最大值为8K令牌。注意,思维链输出最长可达32K令牌。

    • reasoning_effort(即将推出):这个参数将允许用户控制思维链输出的长度。

  • 输出参数

    • reasoning_content:模型生成的逐步推理过程。

    • content:模型生成的最终答案。

  • 重要注意事项

    • API不支持temperaturetop_ppresence_penaltyfrequency_penalty等参数。设置这些参数不会触发错误,但对输出没有任何影响。

    • 输入消息中不应包含reasoning_content字段,否则会导致400错误。

1.5 功能支持清单

  • 支持的功能:聊天补全、聊天前缀补全(测试版)

  • 不支持的功能:函数调用、JSON输出、FIM(中间填充,测试版)

2.使用Ollama部署DeepSeek R1 

在本地机器上部署像DeepSeek R1这样的大语言模型(LLMs)可能会让人望而却步,尤其是在硬件资源有限情况下。不过,借助 Ollama 这样的工具,即便是 8GB 内存的普通 Windows 笔记本,也能轻松运行 DeepSeek R1。接下来,就为你详细介绍具体部署步骤。

Ollama是一款轻量级且高效的工具,专为在消费级硬件上运行大语言模型而设计。它简化了大语言模型的部署和管理流程,让那些想要试用人工智能模型,却又无需高端基础设施的开发者和爱好者也能轻松上手。

在开始之前,请确保系统满足以下要求:

  • 操作系统:Windows 10或更高版本。

  • 内存:至少8GB(建议16GB,以获得更流畅的性能)。

  • 存储空间:有足够的磁盘空间来存储模型(通常为5 - 10GB)。

  • Python:已安装在你的机器上(最好是Python 3.8或更高版本)。

  • Git:已安装,用于克隆存储库。

2.1 安装Ollama

  • 下载Ollama:访问Ollama的官方GitHub存储库,下载适用于Windows的最新版本。

  • 安装Ollama:运行安装程序,并按照屏幕上的说明完成安装。

  • 验证安装:打开终端(命令提示符或PowerShell),运行以下命令来验证Ollama是否安装正确:

ollama --version

如果安装成功,你应该能看到Ollama的版本号。

2.2 下载DeepSeek R1模型

Ollama支持多种模型,包括DeepSeek R1(15亿参数)。要下载该模型,使用以下命令:

ollama pull deepseek-r1:1.5b

图片

这条命令会将DeepSeek R1模型下载并存储在本地的机器上。下载完成后,可以通过列出所有可用模型来验证是否下载成功:

ollama list

2.3 在本地运行DeepSeek R1

要启动DeepSeek R1模型,使用以下命令:

ollama run deepseek-r1

图片

这会启动模型并打开交互式会话,可以在其中开始与模型进行交互。模型运行起来后,可以通过提问或输入提示来测试它。例如:

> 法国的首都是哪里?

2.4 使用DeepSeek R1和LlamaIndex的RAG构建聊天机器人

from flask import Flask, request, render_template, jsonify
import os
from llama_index.core import ServiceContext, VectorStoreIndex, StorageContext
from llama_index.core.node_parser import SentenceWindowNodeParser
from llama_index.core.indices.postprocessor import MetadataReplacementPostProcessor
from llama_index.core.indices.postprocessor import SentenceTransformerRerank
from llama_index.core import load_index_from_storage
#from gpt4all import GPT4All
#from langchain.llms import GPT4All
from llama_index.llms.ollama import Ollama
from llama_index.core import Settings
# 句子嵌入模型
from llama_index.embeddings.openai import OpenAIEmbedding

embed_model = OpenAIEmbedding()

app = Flask(__name__)

# 设置LLM和嵌入模型
llm = Ollama(model="deepseek-r1", request_timeout=120.0)


def build_sentence_window_index(documents,llm, embed_model=OpenAIEmbedding(),sentence_window_size=3,
                                save_dir="sentence_index",):
    # 创建句子窗口节点解析器,默认设置
    node_parser = SentenceWindowNodeParser.from_defaults(
        window_size=sentence_window_size,
        window_metadata_key="window",
        original_text_metadata_key="original_text",
    )    
    Settings.llm = llm
    Settings.embed_model = embed_model
    Settings.node_parser = node_parser
    
    ifnot os.path.exists(save_dir):
        sentence_index = VectorStoreIndex.from_documents(
            documents, embed_model = embed_model
        )
        sentence_index.storage_context.persist(persist_dir=save_dir)
    else:
        sentence_index = load_index_from_storage(
            StorageContext.from_defaults(persist_dir=save_dir),
            embed_model = embed_model
        )
    
    return sentence_index


def get_sentence_window_query_engine(sentence_index, similarity_top_k=6, rerank_top_n=2):
    # 定义后处理程序
    postproc = MetadataReplacementPostProcessor(target_metadata_key="window")
    rerank = SentenceTransformerRerank(
        top_n=rerank_top_n, model="BAAI/bge-reranker-base"
    )
    
    sentence_window_engine = sentence_index.as_query_engine(
        similarity_top_k=similarity_top_k, node_postprocessors=[postproc, rerank]
    )
    return sentence_window_engine


from llama_index.llms.openai import OpenAI
from data.dataprovider import key
from llama_index.core import SimpleDirectoryReader
#OpenAI.api_key =  key

documents = SimpleDirectoryReader(
    input_files=[r"data/eBook-How-to-Build-a-Career-in-AI.pdf"]
).load_data()

from llama_index.core import Document

document = Document(text="\n\n".join([doc.text for doc in documents]))

index = build_sentence_window_index(
    [document],
    #llm=OpenAI(model="gpt-3.5-turbo", temperature=0.1,api_key=key),    
    llm = llm, #替换为你的模型路径
    save_dir="./sentence_index",
)

query_engine = get_sentence_window_query_engine(index, similarity_top_k=6)


def chat_bot_rag(query):
    window_response = query_engine.query(
        query
    )
    
    return window_response


# 定义Flask路由
@app.route('/')
def home():
    return render_template('bot_1.html')

@app.route('/chat', methods=['POST'])
def chat():
    user_message = request.form['user_input']    
    bot_message = chat_bot_rag(user_message)    
    return jsonify({'response': str(bot_message)})

if __name__ == '__main__':
    app.run()

2.5 代码解释

这段 Python 代码基于 Flask 框架搭建网络应用,核心是创建聊天机器人。该聊天机器人使用llama_index库中的多个组件来执行信息检索和文本生成任务。以下是对代码的详细解释:

  • 配置

embed_model = OpenAIEmbedding()初始化OpenAI嵌入模型,用于将文本转换为向量表示。

app = Flask(__name__)设置Flask应用程序。

llm = Ollama(…)初始化名为Ollama的语言模型,大概基于DeepSeek R1架构。这将用于语言任务,并设置了请求超时时间。

  • 函数定义

定义两个后处理器,根据索引创建查询引擎,并使用指定的相似度阈值和重新排序设置。返回配置好的查询引擎。

MetadataReplacementPostProcessor用于在查询结果处理过程中替换元数据。

SentenceTransformerRerank用于使用预训练的句子变压器模型对检索结果进行重新排序。

初始化SentenceWindowNodeParser,用于将文本解析为句子窗口(一种滑动窗口方法)。设置语言模型和嵌入模型的全局设置。

检查指定目录(save_dir)是否存在:如果不存在,则从文档创建一个新的VectorStoreIndex并保存索引;如果存在,则从存储中加载现有索引。返回构建或加载的索引。

build_sentence_window_index():此函数通过处理给定文档为聊天机器人创建索引。它:

get_sentence_window_query_engine():此函数为聊天机器人设置查询引擎:

  • 加载文档:代码使用SimpleDirectoryReader从位于data目录下的PDF文件加载数据。加载的文本被合并成一个Document对象,然后用于创建索引。

  • 构建索引和设置查询引擎:调用build_sentence_window_index()从文档构建索引,调用get_sentence_window_query_engine()设置用于查询索引的查询引擎。

  • 查询函数chat_bot_rag()函数使用查询引擎查询索引。它根据用户输入进行相似度搜索,并返回检索到的响应。

  • Flask路由:Flask应用程序有两条路由:’/’:渲染主聊天界(bot_1.html)。’/chat’:处理聊天请求。它从POST请求中获取用户输入,通过聊天机器人进行处理,并将机器人的响应以JSON格式返回。

  • 运行应用程序if __name__ == ‘__main__’: app.run()启动Flask开发服务器,允许通过Web浏览器访问应用程序。

对渴望试用强大语言模型,却受限于高端硬件的开发者和 AI 爱好者来说,通过 Ollama 在本地 Windows 机器部署 DeepSeek R1 是个好消息。按照分步指南,安装 Ollama、运行 DeepSeek R1,还能用 Ollama API 集成到应用,探索思维链(CoT)推理等特性。

### 使用 DeepSeek R1 构建本地RAG 知识库 #### 准备工作环境 为了构建基于 DeepSeek R1本地RAG 系统,需先安装必要的软件包配置开发环境。推荐使用 Python 虚拟环境来管理依赖项。 ```bash python3 -m venv rag_env source rag_env/bin/activate pip install deepseek-r1 langchain streamlit ``` #### 数据准备与预处理 创建一个结构化的数据集作为知识源,可以是 JSON 文件或其他易于解析的形式。对于每条记录,应至少包含唯一标识符、正文内容以及任何有助于后续检索的相关元数据字段。 ```json [ {"id": "doc_001", "content": "这是第一条文档的内容...", "metadata": {...}}, {"id": "doc_002", "content": "第二条文档的信息在这里.", "metadata": {...}} ] ``` #### 初始化索引数据库 利用 LangChain 或其他相似框架建立向量存储层,以便于之后进行高效的语义匹配查询操作。 ```python from langchain.indexes import VectorStoreIndexWrapper, Chroma documents = [...] # 加载之前准备的数据列表 vector_store = Chroma.from_documents(documents=documents) index_wrapper = VectorStoreIndexWrapper(store=vector_store) ``` #### 配置 DeepSeek R1 模型实例 加载预先训练好的 DeepSeek R1 模型,设置好运行参数以优化性能表现。 ```python import torch from transformers import AutoModelForSeq2SeqLM, AutoTokenizer device = 'cuda' if torch.cuda.is_available() else 'cpu' model_name_or_path = "path/to/deepseek-r1" tokenizer = AutoTokenizer.from_pretrained(model_name_or_path) model = AutoModelForSeq2SeqLM.from_pretrained(model_name_or_path).to(device) ``` #### 实现核心逻辑函数 编写用于接收用户输入、调用检索服务获取最相关的上下文片段、再经由生成模型合成最终回复的核心业务流程方法。 ```python def generate_response(query_string): retrieved_docs = index_wrapper.similarity_search(query=query_string)[:5] # 获取前五名相关度最高的文档 context_texts = "\n".join([d.page_content for d in retrieved_docs]) inputs = tokenizer(f"{query_string} [SEP] {context_texts}", return_tensors="pt").input_ids.to(device) outputs = model.generate(inputs) response_text = tokenizer.decode(outputs[0], skip_special_tokens=True) return response_text ``` #### 打造交互界面 最后一步就是设计图形用户接口 (GUI),让用户可以通过 Web 浏览器方便地访问这套系统所提供的问答能力。Streamlit 提供了一个简单易用的方式来部署此类应用程序。 ```python import streamlit as st st.title('DeepSeek R1 Localized Knowledge Base') user_input = st.text_area("Ask anything:") if user_input: answer = generate_response(user_input) st.write(answer) ``` 通过上述步骤,已经完成了一个完整的基于 DeepSeek R1本地RAG 知识库解决方案的设计[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

python慕遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值