大模型私有化部署小栗子
介绍其概念、分类及 “学会说话 - 理解意图 - 反馈择优” 核心机制,聚焦 DeepSeek 系列开源模型(尤指 deepseek-r1),明确核心目标是私有化部署构建聊天机器人。接着讲部署需求、架构(个人电脑用 Ollama,云平台用 LangChain,前端用 Streamlit)及 Ollama 特性,最后提供 Windows/Linux/WSL 多系统 Ollama 部署、ChatBox
01 大模型概念入门
大(语言)模型:通过深度学习技术,预训练后的模型,主要用于处理和生成人类语言。可以通过用户提供的prompt(提示语),生成相应的输出。
大模型的分类:
- 语言大模型
- 语音大模型
- 图像处理大模型
- 多模态大模型
02 大模型核心实现机制
预训练大(语言)模型实现的核心机制可以简化为三个步骤:
- 学会说话:通过海量数据训练,达到给出上文,能够接出下文
- 理解意图:识别用户的需求,并将用户需求作为上文,型接下文
- 反馈择优:模型的回答可以有多个,通过算法,选择最优进行回答
03 DeepSeek和蒸馏模型
DeepSeek是杭州深度求索公司,其研发并开源了十余款大模型,其中deepseek-v3和deepseek-r1,在当下十分流行。
- deepseek-r1模型的性能在全球范围内属于第一梯队,有性能高、训练成本低、技术完全开源、纯国产等特点
- deepseek v3和r1模型全部开源,任何人都可以下载使用
- 模型的蒸馏:对模型进行简化,在尽量保证模型性能的前提下,尽可能减少对硬件资源的需求
- 课程主要基于deepseek-r1,7b参数(约6GB显存需求)的模型进行开发和应用。可以根据自己的硬件条件去调整模型版本。
- 模型本身就是普通的文件,无法直接使用,需要特定的手段对模型进行部署,这也是我们本套课程的主要学习目标:私有化部署大模型构建聊天机器人
04 私有化部署需求介绍
什么是聊天机器人?
聊天机器人是一种基于人工智能的自然语言处理技术开发的软件程序,能够通过文本或语音与用户进行交互。它可以根据用户输入的问题或指令,生成相应的回答或执行特定的操作。
我们要学什么?
- 在自己的电脑上,部署属于自己的聊天机器人(Windows、MacOS、Linux)
- 在云平台服务器上(Linux),部署属于自己的聊天机器人
05 项目架构分析
因为模型下载后就是有个文件,要用Ollama等工具托管起来,让模型去工作,托管后,模型就可以相应用户请求了,但Ollama提供的功能是命令行操作,和API接口,对用户不友好。不方便,所有我们可以用前端和Ollama进行配合,方面我们的使用。
不管是个人电脑还是云平台,搭建聊天机器人的步骤为:
- 后端和模型部署。
个人电脑,后端使用Ollama框架搭配deepseek-r1、qwen模型
云平台,后端使用LangChain框架搭配阿里云百炼平台、通义千问 - 前端部署,个人电脑或云平台均可使用Streamlit
06 Ollama简介
ollama:是一款旨在简化大型语言模型本地部署和运行过程的开源软件。
ollama提供了一个轻量级、易于扩展的框架,让开发者能够在本地机器上轻松构建和管理LLMs(大型语言模型)
通过ollama,开发者可以导入和定制自己的模型,无需关注复杂的底层实现细节。
网址:https://ollama.com
ollama 支持多种开源模型,涵盖文本生成、代码生成、多模态推理等场景。用户可以根据需求选择合适的模型,并通过简单的命令行操作在本地运行。
ollama 官方模型库: https://ollama.com/library
Ollama提供了两种使用模型的方式
- 通过命令行进行使用大模型
- 通过访问Restful API接口进行使用大模型
07 Window系统Ollama私有化模型部署
- 首先下载Ollama
-
运行安装包,安装Ollama
-
然后可以在命令行中执行
ollama -v
查看是否成功。 -
通过https://ollama.com/library查找要使用的模型
-
找到适合的模型后,复制命令,在命令行中执行即可
模型下载到哪里了?
默认安装路径: C:\Users\Lenovo.ollama\models -
然后就好啦~
08 基于ChatBox部署大模型前端
基于Chatbox软件,开箱即用,立刻即可构建出私有化聊天机器人,此外前端还可以用Stremlit,需要编程实现,后面再介绍。
Chatbox 是一款基于 OpenAI API的开源跨平台智能对话工具,支持 Windows、macOs 和Linux 系统。它旨在为用户提供便捷的 A1 对话体验,同时具备强大的功能扩展性和灵活性。
官网: https://chatboxai.app/zh
-
下载安装
访问 Chatbox官网,下载并安装适合您操作系统的安装包(Windows、macOS 或 Linux)。 -
配置 API
打开 Chatbox,进入设置菜单
选择ollama中本地部署的模型,并保存配置。然后选择好提供方,域名默认即可。模型选择已有的【记得启动Ollama,可以在状态栏查看】,最后点击保存。
-
.开始对话
主界面,创建对话窗口,在输入框中输入问题或指令。 -
保存和退出
聊天记录会自动保存到本地,
09 Linux部署Ollama并使用CUDA加速
CUDA简介
CUDA是英伟达(NVIDIA)推出的一种并行计算平台和编程模型。
它允许开发者利用英伟达 GPU(图形处理单元)的强大计算能力来加速计算密集型任务,而不仅仅是用于图形渲染。
验证CUDA是否可用
如果用的是WSL,一般WSL在安装好Ubuntu后,自动安装了显卡驱动以及CUDA,可以通过命令:nvidia-smi
验证。
当然如果显示没有的话,我们也可以手动下载
udo apt update # 更新软件源
sudo apt install nvidia-utils-550 # 安装最新版本的工具包
Linux系统安装一键部署ollama
打开Ollama官网,https://ollama.com/download/linux
可以看到,只需要一行命令,即可在Linux系统中部署Ollama
手动安装Ollama
因为一键直接安装很容易失败(网络)
可以采用手动安装的模式
当然手动安装的指南也可以Ollama也有提供
-
获取安装包
下载Ollama Linux系统安装包:https://ollama.com/download/ollama-linux-amd64.tgz
tisp:WSL可以直接访问Windows文件系统
Windows系统的C、D等盘符映射在:
/mnt/c /mnt/d 路径
如ollama安装包存放在D盘下,可以:
cp /mnt/d/ollama-linux-amd64.tgz ~
复制到Ubuntu的用户HOME内,然后执行解压命令 -
解压Ollama到/usr文件夹,
sudo tar -xvf ollama-linux-amd64.tgz -C /usr
注意:这是一定要解压到/usr文件夹下。/usr/bin本身是系统执行命令的搜索命令,所有把Ollama放到这不用配置环境变量就可以找到了
警告没有实例,是还没有启动
-
启动ollama,执行命令
ollama serve
这个启动是前台启动,可以Ctrl+c或者关闭终端进行关闭。如果要想Ollama在后台静默的稳定运行,可以接着按下面步骤【4-8】进行,如果就像前台启动的方式,直接另开一个命令行窗口,从9开始即可。
可以在图中看到cuda启动情况,有没有识别出GPU【下图是没有识别成功的】。
-
创建Ollama运行所用用户和用户组
sudo useradd -r -s /bin/false -U -m -d /usr/share/ollama ollama sudo usermod -a -G ollama $(whoami)
-
配置Ollama为系统服务,方便启动、停止
创建新文件:
sudo vim /etc/systemd/system/ollama.service
将下方内容保存到上述文件内,[Unit] Description=Ollama Service After=network-online.target [Service] ExecStart=/usr/bin/ollama serve User=ollama Group=ollama Restart=always RestartSec=3 Environment="PATH=$PATH" [Install] WantedBy=multi-user.target
-
执行如下命令生效
sudo systemctl daemon-reload
-
命令使用
这些只不过是systemctl的控制命令,ollama是服务名
sudo systemctl enable ollama #开启ollama开机自启 sudo systemctl disable ollama #关闭ollama开机自启 sudo systemctl start ollama #启动ollma sudo systemctl status ollama #查看ollama运行状态 sudo systemctl stop ollama #停止ollama
-
启动Ollama查看运行状态
sudo systemctl start ollama sudo systemctl status ollama
-
下载模型文件(或第一次启动模型的时候,也会自动下载)
ollama pull deepseek-r1:7b ollama pull qwen2:7b
-
在命令启动模型使用
ollama run deepseek-r1:7b
10 WSL Python开发环境部署
ChatBox集成度已经很高了,所以要使用Stremlit定制化的话,需要有python
Python所需库的安装
WSL(Ubuntu)内置了Python(版本3.8),所以无需部署Python,但如果需要编写代码调用Ollama,需要安装Ollama库。
可以在系统中执行命令检查是否用python和版本
python --version #使用 python 命令检查
python3 --version #使用 python3 命令检查
-
安装pip工具
sudo apt install python3-pip
-
验证pip的使用
pip -V #注意V是大写字母
-
安装ollama库(用于Python调用Ollama)
pip install ollama
-
安装Streamlit库(用于Python开发对话页面)
pip install streamlit
连接IDE
然后可以选在一个顺手的IDE就要可以编程了
这里可以用VScode,在VScode中下载WSL插件
然后再Linux中想要编码的文件夹执行如下命令既可以自动打开VScode
code .
当然如果没有python插件的话,要下插件,也会自动提示。
注意:除了VScode,其他IDE工具也是可以的,比如Pycharm【专业版】等
然后就可以写代码喽
import ollama
import streamlit
print(f"Ollama当前可用的模型有:{ollama.list()}")
print(f"streamlit库的版本是:{streamlit.__version__}")
如果有报错的话可以看看ollama服务有没有开。“Ollama 的 Python 库只是个‘连接器’,真正干活的是它的服务端进程”,所以没启动服务才会报连接错误。
11 Ollama库的基础API使用
首先确认Ollama已经启动(sudo systemctl start ollama)
使用Python操作Ollama,最主要的一步是获得Ollama客户端对象,使用如下代码
import ollama
client = ollama.Client(host='http://localhost:11434')
当有了client对象后,可以使用client对象提供的方法,完成对Ollama的操作
client对象提供的操作API有
-
list方法,列出可用模型
clent.list()
-
show 方法,显示指定模型的详细信息
client.show('deepseek-r1:7b')
-
ps方法,显示当前正在运行的模型
client.ps()
-
chat方法,与模型进行对话,示例代码
response = client.chat(model='deepseek-r1:7b', messages=[{'role': 'user', 'content': '你是谁'}]) print(response['message']['content'])
对话代码示例
import ollama
# 获得ollama的客户端对象
client = ollama.Client(host="http://localhost:11434")
# list,列出有哪些可用模型
print(client.list())
# show,展示模型的详细信息
print(client.show('deepseek-r1:1.5b'))
# ps,列出有哪些模型在运行中
print(client.ps())
while True:
prompt = input("请输入问题:")
# chat,和模型进行对话
response = client.chat(
model='deepseek-r1:1.5b',
messages=[{"role": "user", "content": prompt}]
)
print(response['message']['content'])
12 Streamlit开发入门
Streamlit介绍
Streamlit 是一个开源 Python 库。它旨在让数据科学家和工程师能够以最少的代码和配置,将他们的数据分析和模型展示转化为交互式的 Web 应用。Streamlit 的设计目标是简单易用,同时保持高度的灵活性和可定制性。
官网地址: https://streamlit.io
Streamlit自带了一个示例程序,我们可以执行:streamlit hello 启动
执行后输入一个Email地址即可,会自动打开浏览器,如下
简单使用
我们使用少量的Streamlit API即可开发出聊天WEB页面。
导包:import streamlit as st
构建交互网页常用API有:
- title,显示标题
- write,显示段落文本
- diviler,显示分割线
- chat_input,聊天输入框
- spinner,等待提示
- chat_message,消息容器
- chat_message.markdown,以markdown形式展示内容
Streamlit代码运行:streamlit run xxx.py【手动执行,不能直接通过编译器运行】,ctrl+c终止
Streamlit运行后自动打开网页,自动无限循环执行用户代码【可以看作整个代码是while(1)中运行的】
示例
import time
import streamlit as st
# 获得一个标题
st.title("测试标题")
# write方法,可以在网页中渲染你提供的内容
st.write("你好小智")
# 分隔符
st.divider()
# 聊天输入框
name = st.chat_input("请输入你的名字")
if name:
st.write(f"你好:{name}")
# 等待提示框
with st.spinner("思考中"):
time.sleep(5)
st.write("思考完成")
# 消息容器
# 角色支持:user、assistant、ai、human
st.chat_message('user').markdown("你是谁")
st.chat_message('assistant').markdown("我是小智机器人")
13 Streamlit开发对话网页
掌握了基础API后,现在可以开发一个基础的对话网页了
页面要展示对话历史记录的话要用到Streamlit session_state。
Streamlit本质是无限循环执行用户代码,可以看到上述代码的count永远是1,同时历史会话被清除。
如果要保存上下文状态,可以使用Streamlit的session_state
session_state是一个字典,基于Key-Value形式,可以保存任意用户所需的内容
示例代码
import time
import streamlit as st
if "count" not in st.session_state:
st.session_state["count"] = 1
if "message" not in st.session_state:
st.session_state["message"] = []
# 给与一个标题
st.title("测试标题")
# 分割线
st.divider()
# 消息输入框
prompt = st.chat_input("请输入你的问题:")
# 1. 角色 2. 消息 [{"role": "user/assistant", "content": "xxx"}, {"role": "user/assistant", "content": "xxx"}]
if prompt:
st.session_state['message'].append({"role": "user", "content": prompt})
for message in st.session_state['message']:
st.chat_message(message['role']).markdown(message['content'])
with st.spinner("思考中..."):
time.sleep(1)
response = f"我不会:{st.session_state['count']}"
# 把AI回答记录到历史记录中
st.session_state['message'].append({"role": "assistant", "content": response})
# count += 1
st.session_state['count'] = st.session_state['count'] + 1
# 把AI回答渲染到界面中
st.chat_message("assistant").markdown(response)
14 Ollama+Streamlit
import ollama
import streamlit as st
# ollama 需要获取客户端
client = ollama.Client(host="http://localhost:11434")
# 初始化消息记录
if 'message' not in st.session_state:
st.session_state['message'] = []
# 添加标题
st.title("小智聊天机器人")
# 添加分割线
st.divider()
# 用户输入问题
prompt = st.chat_input("请输入你的问题")
# 判断,如果用户输入了内容,则开始工作
if prompt:
# 将用户提问添加到历史记录中
st.session_state['message'].append({"role": "user", "content": prompt})
# for循环将历史消息全部输出到消息容器内
for message in st.session_state['message']:
st.chat_message(message['role']).markdown(message['content'])
with st.spinner("AI思考中."):
response = client.chat(
model="deepseek-r1:1.5b",
messages=[{"role": "user", "content": prompt}]
)
# 从response里面取出来message和content两个key
st.session_state['message'].append({"role": "assistant", "content": response['message']['content']})
# 在页面中渲染AI的回答
st.chat_message("assistant").markdown(response['message']['content'])
更多推荐
所有评论(0)