本地部署DeepSeek-R1并打通知识库
Ollama 介绍
为什么不直接部署deepSeek?
俩字:麻烦
为什么选择Ollama
- 开源免费:Ollama 及其支持的模型完全开源且免费,用户可以随时访问和使用这些资源,而无需支付任何费用。
- 简单易用:Ollama 无需复杂的配置和安装过程,只需几条简单的命令即可启动和运行,为用户节省了大量时间和精力。
- 支持多平台:Ollama 提供了多种安装方式,支持 Mac、Linux 和 Windows 平台,并提供 Docker 镜像,满足不同用户的需求。
- 模型丰富:Ollama 支持包括 DeepSeek-R1、 Llama3.3、Gemma2、Qwen2 在内的众多热门开源 LLM,用户可以轻松一键下载和切换模型,享受丰富的选择。
- 功能齐全:Ollama 将模型权重、配置和数据捆绑成一个包,定义为 Modelfile,使得模型管理更加简便和高效。
- 支持工具调用:Ollama 支持使用 Llama 3.1 等模型进行工具调用。这使模型能够使用它所知道的工具来响应给定的提示,从而使模型能够执行更复杂的任务。
- 资源占用低:Ollama 优化了设置和配置细节,包括 GPU 使用情况,从而提高了模型运行的效率,确保在资源有限的环境下也能顺畅运行。
- 隐私保护:Ollama 所有数据处理都在本地机器上完成,可以保护用户的隐私。
- 社区活跃:Ollama 拥有一个庞大且活跃的社区,用户可以轻松获取帮助、分享经验,并积极参与到模型的开发和改进中,共同推动项目的发展。
Ollama 安装和使用
Ollama 的下载和安装非常简单,尤其是对于 MAC 用户:
打开浏览器,访问 Ollama 官方网站:https://ollama.com/download,下载适用于 Mac 的安装包。
下载完成后,直接双击安装包并按照提示完成安装。
安装完成后,我们直接打开命令行执行 ollama --version 判断是否安装成功:
ollama 会在我们本地服务监听 11434 端口:http://localhost:11434/
Ollama 支持的模型
ollama 支持的模型列表,我们可以到Ollama Search查看:
可以看到deepseek已经有了三千九百万次下载,ollama 还支持下面这些主流模型:
模型名称 | 简介 |
---|---|
Llama | 由Meta开发的通用语言模型,擅长多种语言任务,如文本生成、问答等。Llama 3.1(8B参数)是其较受欢迎的版本之一,文件大小约4.7GB。 |
Qwen | 阿里云推出的模型,具备强大的语言理解和生成能力。Qwen 2(7B参数)文件大小约4.4GB,适合多种应用场景。 |
Gemma | 谷歌推出的模型,注重语言的准确性和逻辑性。Gemma 2(9B参数)文件大小约5.5GB,适合需要高精度的语言任务。 |
Mistral | 以高效和性能平衡著称,适合资源有限的设备。Mistral(7B参数)文件大小约4.1GB。 |
Phi | 专注于生成高质量文本,适合创意写作等任务。Phi 3(3.8B参数)文件大小约2.3GB。 |
GLM | 智谱推出的模型,适合中文处理任务。GLM 4(9B参数)文件大小约5.5GB。 |
CodeLlama | 专为代码生成和理解优化的模型,适合编程辅助等场景。CodeLlama(7B参数)文件大小约3.8GB。 |
LLaVA | 结合视觉和语言能力的模型,适合多模态任务。LLaVA(7B参数)文件大小约4.5GB。 |
模型选择:性能对比和所需空间
编程和软件工程的区别(Codeforces和SWE-bench Verified):
Codeforces:用于评估模型的编程能力,包括理解问题规格、设计算法、编写功能性代码以及处理逻辑错误的能力。
SWE-bench Verified:用于评估模型在软件工程相关任务上的能力,包括编程技能、软件设计能力、需求理解能力等。
满血版(671b)虽然只需要 404GB 的磁盘空间,对内存、显卡、CPU 等其他硬件也有极高要求。
下载和启动模型
然后,直接在控制台使用 ollama run 模型名称 来下载我们想要的模型就可以了:
下载完成后可以直接在命令行运行:
ollama命令
- 删除模型
ollama rm deepseek-r1:7b
- 显示模型信息
ollama show deepseek-r1:8b
- 列出计算机上的模型
ollama list
- 列出当前加载的模型
ollama ps
- 停止当前正在运行的模型
ollama stop deepseek-r1:8b
- 启动 Ollama
ollama serve
http://localhost:11434/
7. 其他命令
Java使用ollama
jdk版本17、springboot ai
http://localhost:8080/ai/ollama?msg=“嘿,光头”
@RestController
public class OllamaController {@Resourceprivate OllamaChatModel ollamaChatModel;@RequestMapping(value = "/ai/ollama")public Object ollama(@RequestParam(value = "msg")String msg){ChatResponse chatResponse = ollamaChatModel.call(new Prompt(msg, OllamaOptions.builder().model("deepseek-r1:7b")//越高越随机.temperature(0.5D).build()));return JSON.toJSONString(chatResponse.getResult().getOutput().getText());}
}
pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4.4</version><relativePath/></parent><groupId>org.example</groupId><artifactId>ollama_test</artifactId><version>0.0.1-SNAPSHOT</version><name>ollama_test</name><description>ollama_test</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version><spring-ai.version>1.0.0-M7</spring-ai.version></properties><repositories><repository><id>jitpack.io</id><url>https://jitpack.io</url></repository></repositories><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-ollama</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.0-M7</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
注意事项:
- 运行 7B 模型至少需要 8GB 内存,运行 13B 模型至少需要 16GB 内存,运行 33B 模型至少需要 32GB 内存。
- Ollama 进程会一直运行,如果需要终止 Ollama 所有相关进程,可以使用以下命令:
Get-Process | Where-Object {$_.ProcessName -like '*ollama*'} | Stop-Process
Anything LLM + Ollama
Anything LLM
是一款基于 RAG架构的本地知识库工具,能够将文档、网页等数据源与本地运行的大语言模型(LLM)相结合,构建个性化的知识库问答系统。它支持多种主流模型的 API 接入方式,如 OpenAI、DeepSeek 等。
安装
安装使用的方式也比较简单,我们直接访问 Anything LLM
的官方网站
下载完成后,运行安装包并按照提示完成安装,安装完成后,打开 Anything LLM
应用,第一步就是选择大模型,这里我们看到 Anything LLM
同样支持大部分的主流模型提供商,我们选择 Ollama
,工具会自动读取我们本地已经安装的模型:
然后下一步应该是选择Embedding
(嵌入模型)和 Vector Database
(向量数据库)
然后他让我们输入一个 Workspace(工作区)的名字,我们可以在不同的工作区里设置不同的知识库:
其他设置
上传知识库
本地文件版
上传知识库前
上传知识库以后
网页链接版本
https://cn.vuejs.org/api/application#createapp
链接场景在测试时候不太好展示,实时变更的网站都有反爬,非实时变更的他都知道
联网搜索
DeepSeek R1 是没办法联网的,想要让本地模型联网我们需要开启一个代理
其中DuckDuckGo是免费的,效果肯定没有其他付费的效果好。此时我们就可以顺利访问网络了
设置完不生效
重启客户端、不行就再建个工作区
API调用
在客户端下使用还是太局限了,Anything LLM 还提供了 API 调用的能力,这样我们就可以通过代码来灵活定制我们的使用场景,可以做很多事情,比如:私人知识管理工具、企业内部智能客服等等。
基本概念
在开始 API 调用之前,我们先要明确 Anything LLM 的两个核心概念:
Workspace:一个独立的环境,用于存储和管理与特定主题或项目相关的文件和数据。用户可以在工作区中上传文件、配置参数,并与模型进行交互。每个工作区的数据是独立的,互不干扰,方便用户对不同主题或项目进行分类管理。
Thread:工作区中的一次具体对话记录,代表用户与模型之间的一系列交互。它会记录用户的问题和模型的回答,保持对话的连贯性。用户可以在一个工作区中创建多个线程,分别处理不同的问题或任务,方便管理和追溯每次对话的内容。
获取密钥
获取Header
private HttpHeaders getHeaders() {HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);headers.set("Accept", "application/json");headers.set("Authorization", "Bearer 1JHANDS-8ZP4Z83-Q83JHB5-SWT8A6Y");return headers;
}
获取工作空间信息
@GetMapping("/getWorkspaceBySlug")
public String getWorkspaceBySlug(String slug) {HttpEntity<String> entity = new HttpEntity<>("parameters", getHeaders());// 发送 GET 请求ResponseEntity<String> response = restTemplate.exchange("http://localhost:3001/api/v1/workspace/" + slug,org.springframework.http.HttpMethod.GET,entity,String.class);return response.getBody();
}
获取历史对话记录
@GetMapping("/getChats")
public String getChats(String slug, String threadSlug) {HttpEntity<String> entity = new HttpEntity<>("parameters", getHeaders());// 发送 GET 请求ResponseEntity<String> response = restTemplate.exchange("http://localhost:3001/api/v1/workspace/" + slug + "/thread/" + threadSlug + "/chats",org.springframework.http.HttpMethod.GET,entity,String.class);return response.getBody();
}
提问
@GetMapping("/sendMessage")
public String sendMessage(String slug, String threadSlug, String message) {// 拼接消息体String request = "{\n" +" \"message\": \"@agent ".concat(message).concat("\",")+" \"mode\": \"chat\",\n" +" \"userId\": 1,\n" +" \"reset\": false\n" +"}";// 创建请求体HttpEntity<String> entity = new HttpEntity<>(request, getHeaders());// 发送 POST 请求并获取响应return restTemplate.postForObject("http://localhost:3001/api/v1/workspace/" + slug + "/thread/" + threadSlug + "/chat",entity,String.class);
}
注意
api调用智能用英文
提问,否则会被识别为???
补充文档:
Nnything llm学习
Ollama 学习