搭建自己的专属AI——使用Ollama+AnythingLLM+Python实现DeepSeek本地部署

前言

最近DeepSeek模型非常火,其通过对大模型的蒸馏得到的小模型可以较轻松地在个人电脑上运行,这也使得我们有机会在本地构建一个专属于自己的AI,进而把AI“调教”为我们希望的样子。本篇文章中我将介绍如何使用Ollama+AnythingLLM+Python实现DeepSeek的本地部署,并训练一个自己的专属AI。

工具介绍

我选用Ollama+AnythingLLM来管理训练AI模型,先来介绍一下这两个工具是什么。

Ollama

Ollama是一个模型管理工具,其logo是一只羊驼:

通过Ollama,我们可以轻松下载它所支持的模型,包括llama,qwen以及最近很火的deepseek-r1,并把它作为一个本地的模型提供商以便被其他程序所调用。

AnythingLLM

AnythingLLM是一个训练AI的工具,其支持的模型数量很多,并且有方便的图形化界面来上传训练AI所需要的文档。在AnythingLLM中,可以指定各种LLM,向量数据库以及Embedder。此外,它还提供了丰富的RESTful风格的API以供其他程序调用,使得外部程序可以轻松调用AnythingLLM训练出的AI。

整体架构

整体架构图如下:

 我们首先通过Ollama下载DeepSeek模型,然后可以基于DeepSeek来创建自己的AI模型(指定系统提示词之类的微调);然后将其导入到AnythingLLM中,最后通过Python来调用AnythingLLM提供的API实现和AI进行交互。

安装Ollama

第一步我们先来安装Ollama。

我们打开Ollama官网地址:https://ollama.com,点击Download按钮,再根据自己的系统选择合适的安装包下载,这里以Windows为例。

在安装之前,我们可以通过设置系统环境变量来指定Ollama模型下载的路径,如图所示:

我们建立一个名为OLLAMA_MODELS的环境变量,值为Ollama模型下载的路径。

由于Ollama的奇葩设计,其会安装在C盘下的默认目录,如果我们不想让他安装在默认目录的话,就不要使用双击的方式打开刚刚下好的安装包,而是通过cmd输入以下命令:

OllamaSetup.exe /DIR="绝对路径名"

在安装完成后,打开cmd,输入ollama,如看到以下命令,说明安装成功:

然后我们进入ollama的deepseek-r1模型页面:https://ollama.com/library/deepseek-r1,可以看到有多种模型以供选择:

这里的1.5b,7b,8b的含义是模型中参数的数量,b即billion,参数越多的模型越“聪明”,但需要的配置也就越高。我的电脑是i7 8700K+4070,因此我选择了14b的模型;32b的模型需要4090或3090才能跑起来,大家可以根据自己的配置来选择。

选择好模型之后点击红圈中的按钮,复制命令到剪贴板中,然后将其粘贴到cmd中,ollama就会开始下载模型了(此处大概率需要梯子,大家自行解决)。

在下载完成后,我们的cmd窗口会变成下图:

此时我们就可以开始和AI对话了,输入信息后回车,等待一会(取决于模型大小以及系统配置)后AI就会回复:

此时打开浏览器,输入http://localhost:11434,可以看到“Ollama is running”的页面,说明Ollama的服务已经启动了。

我们已经成功地下载好了deepseek-r1的蒸馏模型,下面我们可以写一个Model文件,来基于deepseek-r1来创建属于我们自己的AI。

新建一个文件,命名为ModelFile(文件名自己随意取),输入以下内容:

FROM deepseek-r1:14b
PARAMETER temperature 1
PARAMETER num_ctx 1024
PARAMETER mirostat_eta 0.5
PARAMETER top_k 60
PARAMETER top_p 0.95
SYSTEM """
你是一个我的个人助手,在回答问题时尽量贴近人类语言来回答问题。
"""

FROM关键字的含义为,从哪个大模型来创建这个AI,这里选择的是14b模型;

PARAMETER,指定参数的值。

  • temperature:范围为0-1,0比较一板正经,1更接近于真人。
  • num_ctx:设置使用下一个token的上下文窗口大小。 
  • mirostat_eta:影响算法对生成文本的响应速度,默认值为0.1。
  • top_k:减少生成无意义内容的概率,值越高答案越多样,默认值为40。
  • top_p:较高的值会使得生成文本更丰富,默认值为0.9。

完整的参数说明可以参考官方文档:https://github.com/ollama/ollama/blob/main/docs/modelfile.md

SYSTEM,系统提示词,我们可以在这里加一些对AI风格的描述,不需要花里胡哨的提示词,直接说人话就行。 

在写完这个文件后,我们运行以下命令,使用刚写好的ModelFile来创建自己的模型:

ollama create <模型名> -f <ModelFile全路径>

然后输入ollama list,可以看到我们新建的模型。 

安装AnythingLLM

我们刚才已经创建了本地的模型,但还没有对它进行自己独特的训练,这就需要我们安装AnythingLLM了。

打开AnythingLLM官网:https://anythingllm.com,点击Download for desktop按钮,根据自己的系统选择安装包下载,下载好后正常双击安装就好。

安装完成后运行AnythingLLM,在AnythingLLM Preference中进行相关配置,由于我已经配置过了,因此这里没有图了,口述一下:

LLM Provider选Ollama,Ollama Base URL输入http://127.0.0.1:11434,Chat Model Selection选我们刚才建好的模型,这个会作为默认模型;

Embedding Preference中,Provider默认就可以,如果你有别的选择也可以用自己的。

Vector Database中,Provider选LanceDB即可

然后我们就可以在左侧边栏新建工作区,开始对话了。

这里介绍一下AnythingLLM工作区的概念。在AnythingLLM中,一个工作区可以算为是一个独立的AI,使用相同的向量数据库;不同的工作区可以使用不同的模型,这样可以确保不同的AI相互独立,不会互相污染。每个工作区可以建立不同的Thread,这里的Thread为对话列表,而并非线程,相当于你可以和这个AI同时发起不同的对话。

下面我们来看看要如何训练这个AI。我们可以注意到,左边边栏的工作区右侧有个上传图标,点击它:

会弹出一个UI让我们选择训练的内容 

 我们可以选择上传文件,或者可以在下面的Fetch Website中输入网址。

我们新建一个文本文件,写这么一句话:

(这里不用张三的原因是之前我告诉AI张三是只猫) 

(温馨提示:你可以把李四换成你身边的任何人) 

点击上传,再选中这个文件,点击Move to Workspace,然后再点击右下方的Save and Embed按钮,AnythingLLM就会用这个文件来训练AI。 

 然后我们来问一声AI:李四是谁?

可以看出AI已经知道了李四是条狗:)

 我们也可以点击工作区右边的齿轮图标,在右边的向量数据库页签中查看向量数量:

训练的内容越多,这个值就越大。

 我们已经初步知道了如何在AnythingLLM客户端中训练AI以及和AI对话,下面我们来看一下如何用python来调用AnythingLLM的API。

我们在AnythingLLM左边栏下方点击扳手图标,进入设置界面,然后选择API密钥项:

然后点击右边的生成新的API密钥按钮,在弹出的画面中点击Create API key按钮,AnythingLLM就会生成一个新的密钥以供后续python调用使用。

 

编写Python代码

我们新建一个python工程,输入以下代码:

# main.py
import requests
import json
if __name__ == '__main__':while True:print('Send message >>>')message = input()json_data = {'message': message,'mode':'chat',}headers = {'Content-Type':'application/json','Authorization': 'Bearer <刚才生成的API Key>','accept':'application/json'}response = requests.post('http://localhost:3001/api/v1/workspace/<小写的工作区名称>/chat', headers=headers ,json=json_data)answer_dict = json.loads(response.content)# answer_dict已经拿到了AI返回的结果了,以下两行是去除掉输出的思考过程answer = answer_dict['textResponse'].__str__()final_answer = answer[answer.index('</think>')+len('</think>')+1:]# 打印AI的结果print(final_answer)

 这里要注意的是,headers里Authorization的值为‘Bearer <API Key>’的值,Bearer是固定不变的;json_data的mode的值有两种:chat和query。query只会根据你上传的文件来回答内容,你不告诉它的东西它是不会回答的,适合做特定领域内的AI;chat则既会根据已训练好的内容来回答,同时也会根据你上传的内容来回答,更适合通用AI。

在post的url中,workspace/后的参数是工作区内部名称,为小写的工作区名称,但如果你不清楚工作区的内部名称是什么,可以发送如下请求来在响应中查看所有的工作区信息:

response = requests.get('http://localhost:3001/api/v1/workspaces', headers=headers)

可以在如下地址查看所有的AnythingLLM的API文档:http://localhost:3001/api/docs/#/Workspaces/get_v1_workspaces 

然后我们可以在powershell中运行我们这个main.py,问出我们刚才的那个问题:李四是谁?

 AI回答正确!

结语

在此篇博客中,我们实现了基于Ollama+AnythingLLM+Python的deepseek本地部署,并对它进行了初步的训练,让它知道了李四是条狗。我们可以在此基础上进一步扩展我们想要的功能,如自制个webUI之类的,或者让它成为某个领域的UI,或者让它只是纯粹和我们逗闷子,希望大家都能通过此方法来训练出自己想要的AI。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/68738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang 并发机制-1:Golang并发特性概述

并发是现代软件开发中的一个基本概念&#xff0c;它使程序能够同时执行多个任务&#xff0c;从而提高效率和响应能力。在本文中&#xff0c;我们将探讨并发性在现代软件开发中的重要性&#xff0c;并深入研究Go处理并发任务的独特方法。 并发的重要性 增强性能 并发在提高软…

【算法应用】基于鲸鱼优化算法求解OTSU多阈值图像分割问题

目录 1.鲸鱼优化算法WOA 原理2.OTSU多阈值图像分割模型3.结果展示4.参考文献5.代码获取 1.鲸鱼优化算法WOA 原理 SCI二区|鲸鱼优化算法&#xff08;WOA&#xff09;原理及实现 2.OTSU多阈值图像分割模型 Otsu 算法&#xff08;最大类间方差法&#xff09;设灰度图像有 L L …

项目升级Sass版本或升级Element Plus版本遇到的问题

项目升级Sass版本或升级Element Plus版本遇到的问题 如果项目有需求需要用到高版本的Element Plus组件&#xff0c;则需要升级相对应的sass版本&#xff0c;Element 文档中有提示&#xff0c;2.8.5及以后得版本&#xff0c;sass最低支持的版本为1.79.0&#xff0c;所升级sass、…

数据结构 树1

目录 前言 一&#xff0c;树的引论 二&#xff0c;二叉树 三&#xff0c;二叉树的详细理解 四&#xff0c;二叉搜索树 五&#xff0c;二分法与二叉搜索树的效率 六&#xff0c;二叉搜索树的实现 七&#xff0c;查找最大值和最小值 指针传递 vs 传引用 为什么指针按值传递不会修…

利用metaGPT多智能体框架实现智能体-1

1.metaGPT简介 MetaGPT 是一个基于大语言模型&#xff08;如 GPT-4&#xff09;的多智能体协作框架&#xff0c;旨在通过模拟人类团队的工作模式&#xff0c;让多个 AI 智能体分工合作&#xff0c;共同完成复杂的任务。它通过赋予不同智能体特定的角色&#xff08;如产品经理、…

嵌入式系统|DMA和SPI

文章目录 DMA&#xff08;直接内存访问&#xff09;DMA底层原理1. 关键组件2. 工作机制3. DMA传输模式 SPI&#xff08;串行外设接口&#xff09;SPI的基本原理SPI连接示例 DMA与SPI的共同作用 DMA&#xff08;直接内存访问&#xff09; 类型&#xff1a;DMA是一种数据传输接口…

【MySQL】--- 复合查询 内外连接

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; MySQL &#x1f3e0; 基本查询回顾 假设有以下表结构&#xff1a; 查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的姓名首字母为…

2 MapReduce

2 MapReduce 1. MapReduce 介绍1.1 MapReduce 设计构思 2. MapReduce 编程规范3. Mapper以及Reducer抽象类介绍1.Mapper抽象类的基本介绍2.Reducer抽象类基本介绍 4. WordCount示例编写5. MapReduce程序运行模式6. MapReduce的运行机制详解6.1 MapTask 工作机制6.2 ReduceTask …

【memgpt】letta 课程6: 多agent编排

Lab 6: Multi-Agent Orchestration 多代理协作 letta 是作为一个服务存在的,app通过restful api 通信 多智能体之间如何协调与沟通? 相互发送消息共享内存块,让代理同步到不同的服务的内存块

cmd命令行无法进入D:盘怎么办

我找到了一个方法就是 增加一个/d cd /d d: 如下图,我不仅可以进入d盘符下&#xff0c;还可以访问盘符下的文件夹

【机器学习】自定义数据集 ,使用朴素贝叶斯对其进行分类

一、贝叶斯原理 贝叶斯算法是基于贝叶斯公式的&#xff0c;其公式为&#xff1a; 其中叫做先验概率&#xff0c;叫做条件概率&#xff0c;叫做观察概率&#xff0c;叫做后验概率&#xff0c;也是我们求解的结果&#xff0c;通过比较后验概率的大小&#xff0c;将后验概率最大的…

2025年人工智能技术:Prompt与Agent的发展趋势与机遇

文章目录 一、Prompt与Agent的定义与区别(一)定义(二)区别二、2025年Prompt与Agent的应用场景(一)Prompt的应用场景(二)Agent的应用场景三、2025年Prompt与Agent的适合群体(一)Prompt适合的群体(二)Agent适合的群体四、2025年Prompt与Agent的发展机遇(一)Prompt的…

2025_1_31 C语言中关于数组和指针

1.数组作为指针传递 数组作为指针传递可以&#xff1a; 加一个数减一个数两个指针相减自增自减 int main() {int arr[] { 1,2,3,4,5,6,7,8,9 };printf("%d\n", arr[0] 2);printf("%d\n", arr[2] - 2);printf("%d\n", arr[0] arr[2]);int* …

Baklib推动企业知识管理创新与效率提升的全面探讨

内容概要 在当今数字化转型的背景下&#xff0c;有效的知识管理显得尤为重要。知识是企业的核心资产&#xff0c;而传统的管理方式往往无法充分发挥这些知识的价值。因此&#xff0c;企业亟需一种高效、灵活的解决方案来应对这一挑战。Baklib作为一款先进的企业级知识管理平台…

JAVA实战开源项目:网上购物商城(Vue+SpringBoot) 附源码

本文项目编号 T 041 &#xff0c;文末自助获取源码 \color{red}{T041&#xff0c;文末自助获取源码} T041&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

访问CMOS RAM

实验内容、程序清单及运行结果 访问CMOS RAM&#xff08;课本实验14&#xff09; 代码如下&#xff1a; assume cs:code data segment time db yy/mm/dd hh:mm:ss$ ;int 21h 显示字符串&#xff0c;要求以$结尾 table db 9,8,7,4,2,0 ;各时间量的存放单元 data ends cod…

Visual Studio使用GitHub Copilot提高.NET开发工作效率

GitHub Copilot介绍 GitHub Copilot 是一款 AI 编码助手&#xff0c;可帮助你更快、更省力地编写代码&#xff0c;从而将更多精力集中在问题解决和协作上。 GitHub Copilot Free包含哪些功能&#xff1f; 每月 2000 代码补全&#xff0c;帮助开发者快速完成代码编写。 每月 …

socket实现HTTP请求,参考HttpURLConnection源码解析

背景 有台服务器&#xff0c;网卡绑定有2个ip地址&#xff0c;分别为&#xff1a; A&#xff1a;192.168.111.201 B&#xff1a;192.168.111.202 在这台服务器请求目标地址 C&#xff1a;192.168.111.203 时必须使用B作为源地址才能访问目标地址C&#xff0c;在这台服务器默认…

Spring Boot 日志:项目的“行车记录仪”

一、什么是Spring Boot日志 &#xff08;一&#xff09;日志引入 在正式介绍日志之前&#xff0c;我们先来看看上篇文章中&#xff08;Spring Boot 配置文件&#xff09;中的验证码功能的一个代码片段&#xff1a; 这是一段校验用户输入的验证码是否正确的后端代码&#xff0c…

Go学习:Go语言中if、switch、for语句与其他编程语言中相应语句的格式区别

Go语言中的流程控制语句逻辑结构与其他编程语言类似&#xff0c;格式有些不同。Go语言的流程控制中&#xff0c;包括if、switch、for、range、goto等语句&#xff0c;没有while循环。 1. if 语句 语法格式&#xff1a; &#xff08;1&#xff09;单分支&#xff1a; if 条件语句…