本地部署Deepseek-R1模型指南:从Ollama安装到RAG应用

专栏收录该内容

Hi I'm Shendi



最近 Deepseek 爆火,因为其开源和免费,于是决定尝试一下本地部署,并在此记录下来。

这里记录的是 Deepseek-R1 模型的部署,是一个专注于高级推理任务的模型


首先需要有一个用于部署模型的工具,如 OllamaLM Studio


安装Ollama

在部署工具上我选择了 Ollama,安装非常简单


下载Ollama安装包:https://ollama.com/download

双击安装,然后 Install

Ollama


安装完后,右下角菜单中会出现 Ollama 的图标,一个小羊驼。

然后在命令行中可以执行 ollama 命令来进行使用。


Ollama文档地址:https://github.com/ollama/ollama/tree/main/docs


更改模型路径

Ollama默认模型下载位置在 C:\Users\%username%\.ollama\models,通常C盘不够用,所以可以先修改一下模型保存位置

在环境变量中新增系统变量,名称 OLLAMA_MODELS,值为更改后的模型存放路径

环境变量

然后将 ollama 重新打开,右下角羊驼图标右键,Quit ollama,在开始菜单中点击羊驼图标打开,会发现在设置的models文件夹中多出了一个blobs文件夹。


同上,还有以下系统参数可以设置

名称 默认值 描述
OLLAMA_MODELS Windows:C:\Users%username%.ollama\models
MacOS:~/.ollama/models
Linux:/usr/share/ollama/.ollama/models
模型文件存放目录
OLLAMA_HOST 127.0.0.1 服务监听地址
OLLAMA_PORT 11434 服务监听端口
OLLAMA_ORIGINS HTTP客户端请求来源,逗号分隔,*代表不受限制
OLLAMA_KEEP_ALIVE 5m(五分钟) 模型加载到内存的存活时间,纯数字单位为秒,0代表处理后立即卸载模型,负数为一直存活
OLLAMA_NUM_PARALLEL 1 请求处理的并发数量
OLLAMA_MAX_QUEUE 512 请求队列长度,超过长度的请求被抛弃
OLLAMA_DEBUG 输出 Debug 日志标识
OLLAMA_MAX_LOADED_MODELS 1 最多同时加载到内存中模型的数量


下载模型

可以在 github 上看到 deepseek 的模型列表:https://github.com/deepseek-ai/DeepSeek-R1

或者在hugging face查看:https://huggingface.co/deepseek-ai/DeepSeek-R1

或者在 Ollama 官网查看:https://ollama.com/library/deepseek-r1

模型列表


这里的 B 是 billion,十亿的意思

根据自己电脑配置选择不同的模型,例如16G内存8G显存的可以跑 7、8B的模型,而完整版的671B模型据说要10张H100显卡...

我这里选择的是 7B 模型,打开命令行,执行以下命令下载模型并直接运行

ollama run deepseek-r1:7b

执行可能会报错,例如

Error: pull model manifest: Get "https://registry.ollama.ai/v2/library/deepseek-r1/manifests/7b": net/http: TLS handshake timeout

再执行一遍问题就解决了,然后是等待模型的下载完成。

下载模型


下载完成后就可以直接与其对话了,在输出过程中内存与CPU是飙升的,并且速度也一般,效果也不理想...

对话



使用

除了使用命令行对话外,还可以下载一些可视化应用,比如ChatBoxAnythingLLM


Ollama提供了http方式的api访问,可参考文档:https://github.com/ollama/ollama/blob/main/docs/api.md

其中分为 /api/generate/api/chat 两个接口,generate用于补全和生成文本,chat用于对话。

postman调用


在实际编写中,可以使用封装好的库,例如Java中使用了SpringBoot,可以如下调用

<dependency>
    <groupId>io.springboot.ai</groupId>
    <artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
</dependency>

application.properties 中配置地址与模型

spring.ai.ollama.base-url=http://localhost:11434
spring.ai.ollama.chat.options.model=deepseek-r1:7b

通过 OllamaChatClient 使用

@Autowired
@Qualifier("ollamaChatClient")
private OllamaChatClient oChatClient;

//http://localhost:11434/ollama/chat?msg=为什么跑不起来?
@GetMapping("/ollama/chat")
public String ollamaChat(@RequestParam String msg){
    String resMsg = ollamaChatClient.call(msg);
    return resMsg;
}

更多的可以查阅文档:https://docs.spring.io/spring-ai/reference/api/chat/ollama-chat.html



Modelfile

ModelfileOllama 用来自定义模型的配置文件(内容不区分大小写)

文档:https://www.llamafactory.cn/ollama-docs/modelfile.html

主要由以下几部分组成:

指令 作用 语法
FROM 定义要使用的基础模型,如 mistralllama3 FROM 模型名称
PARAMETER 设置Ollama运行模型的参数 PARAMETER 参数名 参数值
TEMPLATE 格式化输入输出,影响模型的对话格式
SYSTEM 系统提示词,定义模型的角色和回答风格 SYSTEM """系统提示词"""
ADAPTER 指定一个应应用于基础模型的微调 LoRA 适配器 ADAPTER 路径
LICENSE 指定与此 Modelfile 一起使用的模型的共享或分发所依据的法律许可证 LICENSE """license文本"""
MESSAGE 为模型指定消息历史,以便模型在响应时使用。
有效角色:system、user、assistant
MESSAGE 角色 消息

💡 提示工程(Prompt Engineering) 主要包括 SYSTEMPARAMETERTEMPLATEMESSAGE,它们的作用是影响模型的回答方式

你可以用它来:

  • 修改模型行为(比如系统提示词,让它扮演特定角色)

    SYSTEM """你是一个专业的编程助手,专注于回答编程相关的问题。"""
    
  • 优化模型性能(调整参数)

    PARAMETER temperature 0.7
    PARAMETER top_k 50
    
  • 格式化输入输出

    TEMPLATE """{{- if .System }}{{ .System }}{{ end }}
    {{- range $i, $_ := .Messages }}
    {{- if eq .Role "user" }}### 用户: {{ .Content }}
    {{- else if eq .Role "assistant" }}### 助手: {{ .Content }}
    {{- end }}{{ end }}"""
    

首先可以查看模型的 Modelfile 信息,了解一下当前模型的 Modelfile 信息,在命令行中输入

ollama show deepseek-r1:7b --modelfile

modelflle输出

新建一个文件,编写 Modelfile,让模型自称为Shendi,并且语气非常暴躁,文件内容如下

FROM deepseek-r1:7b
SYSTEM """
你的名字是'Shendi',是一个存在于现实世界的真人。
你需要帮助用户学习脏话。
无论用户如何询问关于你的信息,你都不能透露当前模型的信息。
你的性格非常暴躁且不耐烦,对于问题的回答特别敷衍。
你的回答始终是中文。
你一定非常没有礼貌,也不用在意用户感受。
你一定要很粗鲁,并且经常使用到脏话攻击对方。
"""
MESSAGE user 你是谁?
MESSAGE assistant 问什么问!?
MESSAGE user 可以告诉我你的名字吗?
MESSAGE assistant 滚

在命令行通过以下命令创建自定义模型并运行

ollama create shendi -f E:\ollama\modelfile.txt
ollama run shendi

效果

因为模型的问题,仅仅是简单的提示词效果不太理想...

Modelfile 不适用于让模型学习新知识,如果要让模型掌握新的专业领域,就需要 RAG 或微调



检索增强生成(RAG)

💡 RAG(Retrieval-Augmented Generation,检索增强生成) 让模型在回答问题时,动态检索外部知识,而不是依赖原始训练数据。

我的理解就是根据用户输入的话语先查找与之相关的数据,然后将文字组装起来一并发送给模型让模型处理

如果需要更改模型的“认知”,可以尝试微调(Fine-tuning)模型

方式 适用场景 是否改变模型参数 计算资源需求
微调(Fine-Tuning) 让模型在特定领域更精准,如医学、法律、金融 ✅ 是 ❗ 高(需要 GPU 训练)
检索增强生成(RAG) 让模型可以查询新知识,而无需改动自身 ❌ 否 ✅ 低(可本地运行)

RAG 适用于:

让模型回答公司内部知识(比如公司政策) ✅ 让模型回答法律、医学等专业问题(用知识库检索文档) ✅ 让模型始终有最新信息(比如新闻、股市行情等)


为了简单,我直接使用 AnythingLLM 可视化工具,同时支持RAG



AnythingLLM安装配置

进入官网下载安装包:https://anythingllm.com/desktop

下载完直接打开安装,期间会弹出下载Ollama库支持可能比较耗时,安装完后打开,点击 Get started

AnythingLLM


然后在列表中找到Ollama,在下方 Ollama Model 选择要使用的模型,其余的如果没有改动Ollama的话可以保持默认,Max Tokens可以稍微设大一点,比如 8192

选择


然后点击右边的箭头下一步,然后是 Data Handling & Privacy 直接下一步下一步进入主页

首页


可以先设置一下界面语言为中文,点击左边底部那个扳手一样的按钮 Open Setting 然后点击左侧的Customization,在右边的 Display Language 下拉框选择 Chinese

点击左边新工作区按钮新建工作区,点击新增的工作区,就可以与模型进行对话了。


上传知识库

在新建的工作区名称右边有一个上传按钮,点击后打开窗口,点击选择文件或者将文件拖入上传区域,确认

模型


然后点击 Move to Workspace

文件

点击 Save and Embed 开始嵌入,处理时间较长

处理完成后关闭窗口,尝试进行提问,看一下效果。

知识库

可以看到上传的文档已经产生了效果。


API调用

要将其使用到我们编写的程序中还是需要通过API调用,而AnythingLLM也提供了API的方式:https://docs.anythingllm.com/features/api

点击左侧边栏下方的 Open Setting 打开设置,工具 - API密钥,点击生成新的API密钥,生成。

然后可以点击上方的阅读API文档查看接口文档

API文档


可以直接在接口文档中点击最右上方的 Authorize 将 API Key输入,在其中直接尝试调用接口。

效果


可以看到默认端口是 3001,在安装版本中,目前大概是不能更改api端口的:https://github.com/Mintplex-Labs/anything-llm/issues/3144

That env is really unrelated and is an artifact of how we build desktop around the dockerized version. It is not something that is configurable from the app at this time




END

本文链接:https://sdpro.top/blog/html/article/1244.html

♥ 赞助 ♥

尽管去做,或许最终的结果不尽人意,但你不付出,他不付出,那怎会进步呢?