当前位置: 首页 > article >正文

搭建自己的专属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.kler.cn/a/526812.html

相关文章:

  • 主流的AEB标准有哪些?
  • 【AI】Deepseek本地部署探索,尝试联网搜索
  • Leetcode 131 分割回文串(纯DFS)
  • JAVA(SpringBoot)集成Kafka实现消息发送和接收。
  • OpenCV 版本不兼容导致的问题
  • 利用飞书机器人进行 - ArXiv自动化检索推荐
  • 动态规划DP 最长上升子序列模型 拦截导弹(题目分析+C++完整代码)
  • 【C++语言】卡码网语言基础课系列----5. A+B问题VIII
  • MySQL(导入sql文件)
  • 蓝桥杯思维训练营(一)
  • sleep和wait
  • 基于遗传优化GRNN和Hog特征提取的交通标志识别算法matlab仿真
  • Android Studio 正式版 10 周年回顾,承载 Androider 的峥嵘十年
  • 1.27刷题记录
  • 【leetcode练习·二叉树】计算完全二叉树的节点数
  • Git进阶之旅:Git Hub注册创建仓库
  • 解决运行npm时报错
  • 面向对象编程(OOP)基础:类与对象
  • 线性回归简介:从理论到应用
  • 01. 计算机系统
  • C++ 中的引用(Reference)
  • 第十一章 F - H 开头的术语
  • 数据结构与算法之哈希表: LeetCode 1797. 设计一个验证系统 (Ts版)
  • 深入剖析 Docker 的镜像分层存储机制
  • jhat命令详解
  • 3.拼正方形python解法——2024年省赛蓝桥杯真题