AI 的发展史

这几年 AI 的发展十分迅猛,

  • 2022 年年末的 ChatGPT 3.5,大模型对话(起初国内普遍看衰)。
  • 2023 年上半年,ChatGPT4 发布,国内各种大模型也随之蹦了出来,都声称对标 GPT-4,但体验 dddd。
  • 2023 年年末 Copilot 插件和 Cursor 编程,后续的 cursor 接入 claude 让大模型大大提升了生产力。
  • 2024 年,各大厂商逐渐意识到在使用 AI 时数据隐私的重要性,私有化部署浮出水面。
  • 年末的 DeepSeek 横空出世,突然爆火。

新技术的出现,人们往往会展现出担忧和恐惧,其根源在于人们对未知的恐惧以及可能带来的负面影响的担忧。

目前 AI 使用的几种方式:

  • AI 对话(你问我答)
  • AI 应用(生成图片、语音和视频等)
  • 嵌入工作流(生成 PPT、AI 智能代码编辑器)
  • 构建 AI 私有知识库
  • 使用 Agent 自动化

大部分人使用 AI,大概都跟我一样,平时常用 AI 对话和生成代码,偶尔用一些现成的服务,例如生成图片、PPT 和翻译文章等,今天来探索一下本地部署模型。

部署 OpenWebUI + Ollama

基于 Ollama + Open-WebUI 实现局域网内分享以及知识库构建。

OLLAMA 部署

以前离线运行 LLM 模型,对显卡的显存大小要求很高,还需要手动下载和管理 LLM 模型,推理环境也需要十分繁杂的安装配置,例如安装驱动和依赖,有些还需要自己执行编译,十分耗时耗力。Ollama 的出现让这一切都变得更简单,只需要一条命令即可在本地运行模型:

1
ollama run 模型名称

正因为它的操作如此简便,将复杂的安装和准备环节封装成简单的命令,Ollama 可以称为 LLM 模型版本的 Docker。它可以大幅度简化 LLM 的安装、运行、环境配置,只需要选择一个合适的本地模型,再配合 OpenWebUI 这个前台服务可以达到低配版 ChatGPT 的效果。可以生成图片、可使用 RAG 来索引本地的文件、还可以生成类似 GPT 的针对特定任务的模型配置,并且 Ollama 还提供了简洁的跟 OpenAI 一致的 API 调用方式,方便开发者在此基础上做拓展,同时其他的兼容 OpenAI 接口的套壳客户端,也可以直接使用 Ollama 作为 AI 提供方。

Ollama 支持多平台部署,并且提供了 Windows 的程序,为了方便使用到 GPU,选择直接安装 Windows 的程序;在官网或 Github 下载速度很慢,开了魔法也很很慢(具体原因不详)。

[!tips]
使用迅雷打开下载链接进行下载,速度很快哦。


安装完成后,在命令提示符窗口中输入 ollama --version,若显示版本号,则表示安装成功。
接着可以在官网搜索你想要部署的模型(需要根据自身电脑性能)。

这里我先采用了 tinyllama,在命令提示符窗口中输入一行命令,即可开始拉取模型到本地,拉取完成后会自动运行。

[!tips]
拉取的速度刚开始的时间很快,后面会慢慢掉下去,可以 Ctrl+C 取消拉取再重新拉取(Ollama 支持断点重传,会保留下载进度)
为啥ollama下载模型前面挺块的,下着下着就慢了

1
ollama run tinyllama

运行成功后,可以开启对话:

也可以使用 Ollama 自带的界面进行对话:
但这个界面程序十分简单,只能调用模型进行简单的对话,不能上传文件等高级的操作,所以我们需要一个更优雅的界面来调用模型,具体后面会讲到。

修改 Ollama 的配置

为了后面的 OpenWebUI 可以访问该模型,这里先对 Ollama 的配置进行修改。

  • Ollama 默认允许本机跨域访问,修改系统变量 OLLAMA_ORIGINS,设置为通配符“*”即可解决非本机跨域问题。
  • 修改系统变量 OLLAMA_HOST 为 0.0.0.0 可以让 Ollama 接受来自局域网中任何网络接口的连接请求。
  • Ollama 的默认端口是 11434,为了局域网的其他主机能够访问该端口,需要手动开放端口。

在命令提示符窗口执行命令:

1
2
3
setx OLLAMA_HOST "0.0.0.0"
setx OLLAMA_ORIGINS "*"
netsh advfirewall firewall add rule name="Allow Port 11434" dir=in action=allow protocol=TCP localport=11434

执行以上命令之后,重启 Ollama,在浏览器中访问 本机IP:11434,若能看到 Ollama is running 则表示开启成功。

Ollama 常用命令

常用命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 创建模型  用于根据 Modelfile 创建自定义模型。
ollama create mymodel -f ./Modelfile

# 拉取模型 此命令也可用于更新本地模型,只会拉取差异部分。
ollama pull llama3.2

# 删除模型
ollama rm llama3.2

# 复制模型
ollama cp llama3.2 my-model

# 查看模型信息
ollama show llama3.2

# 列出本地所有模型
ollama list

# 查看当前已加载的模型
ollama ps

# 停止正在运行的模型
ollama stop llama3.2

# 启动 Ollama 服务
ollama serve

ollama ps 命令显示的 100% GPU 说明模型已完全加载到显卡,并不是占有率,一般用来检查是否 GPU 显存不够而去使用 CPU。

Ollama 提供了 --verbose 参数,用于实时监控模型运行时的资源消耗(如显存占用、推理速度等)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# ollama run <model_name> --verbose
C:\Users\Administrator>ollama run qwen:4b --verbose
>>> 1.8和1.11谁大
1.8 和 1.11 谁大取决于具体的情况。例如,如果这是在一个电子游戏的比赛中,那么 1.8 可能比 1.11 更好。但是,这完全取决
于比赛的具体规则和条件。

total duration: 4.4862922s
load duration: 29.005ms
prompt eval count: 152 token(s)
prompt eval duration: 699.6237ms
prompt eval rate: 217.26 tokens/s
eval count: 56 token(s)
eval duration: 3.7541631s
eval rate: 14.92 tokens/s
字段 含义 示例值解读
total duration 整次请求从开始到结束的总耗时 4.486 s → 从你按下回车到拿到完整回答,共 4.5 秒。
load duration 加载模型权重到显存/内存的耗时 29 ms → 如果模型已在内存中,这一项会很小;冷启动时才明显。
prompt eval count 输入 prompt 的 token 数量 152 tokens → 你的问题“1.8和1.11谁大”被拆成 152 个子词。
prompt eval duration 处理输入 prompt 的耗时 699 ms → 把 152 个 token 喂给模型的耗时。
prompt eval rate 输入处理速度 217.26 tokens/s → 平均每秒处理 217 个输入 token。
eval count 模型生成的 token 数量 56 tokens → 模型生成了 56 个 token 的回答。
eval duration 模型输出(生成)的耗时 3.754 s → 从第一个 token 到最后一个 token 的生成时间。
eval rate 输出生成速度 14.92 tokens/s → 平均每秒生成 14.9 个新 token。

局限性

本地模型的难点是数据和资源较少,开源模型可能很难有资金去持续不断地去优化模型,同时开源模型也更难以收集到真实用户的语料,同时能收集到的数据量也更少。但是另一方面,开源模型或许可以规避一些版权限制,从而利用一些特殊来源的语料来训练模型。

模型的问题是需要较大的参数量才能达到比较好的效果。而参数量大了则会带来更大的模型文件大小,要将其完全载入显存也就占用更多的显存容量。本地部署的效果最好实际上是指达到文本生成速度和生成质量的平衡,不至于慢得无法忍受,也不至于答非所问。

OpenWebUI 部署

OpenWebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台,旨在完全离线运行。它支持各种 LLM 运行器,如 Ollama 和兼容 OpenAI 的 API,并具有内置推理引擎用于 RAG,使其成为一个强大的 AI 部署解决方案。

  • 开源版的 AI Web 端
  • 支持私有模型和接入其他厂商的 API
  • RAG 知识库
  • 插件化应用商店

  • 答非所问:虽然引用了参考资料,但在胡说八道。
  • 延迟明显:对话新上传文档,需要等许久才能解析出结果。
  • 答案过期:拿了过时的数据。

部署

OpenWebUI 提供多种安装方式,包括通过 Python pip 安装、Docker 安装,平台的话支持多平台部署。

  • Windows
    • Docker Desktop:下载 docker 桌面版部署;需要安装开启 Hype-V 虚拟化平台。
  • Linux
    • docker 部署:正常情况下网络很慢,需要借助魔法。
    • pip 部署:可能出现各种库的依赖问题。

一开始采用在 Windows 部署,但是一直解决不了 Hype-V 问题,后面尝试在云服务器使用 docker 部署,发现网络速度很慢,换国内镜像源也很慢(中间出现网络中断,拉取的一半的镜像文件都没了,需要重新拉取;后面发现 docker 可以实现中断拉取,暂未验证)。最终在云服务器中使用 pip 部署成功,但是我的云服务器配置太低了,只有 2+2 的配置,并且没有 GPU 后续受限比较大;于是开始尝试在本地虚拟机上进行部署。

我使用的是 Ubuntu18.04 版本,使用 docker 进行部署,部署时跟在云服务器部署时的情况一样,拉取速度很慢;通过修改国内镜像源和开启魔法,速度也没多大改善。后面经过朋友的指点,发现是使用到的镜像源过时了没有继续维护或者没有同步相对应的源导致加速失效

[!tips]
这是一个国内镜像源同步站:Docker 国内镜像源同步站
Docker Proxy 镜像加速

在网站上输入官方源的地址 ghcr.io/open-webui/open-webui:main,接着就能看到做好的国内镜像源地址:

接着换上国内镜像地址进行拉取,速度飞快!拉取完后需要修改一下 tag,把“本地已存在的镜像”再贴一个符合官方预期的标签,后续脚本才能直接使用,无需修改任何 YAML 或 Compose 文件。

1
2
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/open-webui/open-webui:main
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io/open-webui/open-webui:main ghcr.io/open-webui/open-webui:main

[!notes]
Compose 文件(通常叫 docker-compose.yml)是一份 YAML 格式的“部署说明书”,用来告诉 Docker ComposeDocker Swarm / Kubernetes(通过 kompose)

“我需要哪些容器、用什么镜像、端口怎么映射、卷怎么挂、环境变量怎么设、谁先启动谁后启动……”

拉取成功后,使用 run 命令开启运行,运行成功可以看到回显一串字符 ID。

1
docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main
  • docker run: 这是用于创建并运行一个新的容器的命令。
  • -d: 让容器在后台运行(“detached”模式)。
  • -p 3000:8080: 将主机的 3000 端口映射到容器的 8080 端口。这意味着你可以通过访问主机的 3000 端口来访问容器内的服务。
  • –add-host=host.docker.internal:host-gateway: 这条选项允许容器内的应用访问主机(宿主机)上的服务。它会将 host.docker.internal 指向 Docker 宿主机的 IP 地址。
  • -v open-webui:/app/backend/data: 创建一个名为 open-webui 的数据卷,将其挂载到容器的 /app/backend/data 路径。这允许你在容器重启或删除后仍能保留数据。
  • –name open-webui: 为容器指定一个名称(open-webui),方便后续管理。
  • –restart always: 设置容器的重启策略为“始终”。这意味着如果容器崩溃或宿主机重启,Docker 会自动重新启动该容器。
  • ghcr.io/open-webui/open-webui:main: 指定要运行的镜像及其标签(这里是 main)。

查看运行时的信息:

1
book@100ask:~$ sudo docker logs open-webui

打开网页进行访问,首次打开需要注册一下管理员账号密码,存储在本地数据库。
![](Pasted image 20250804225939.png)

打开设置填入宿主机部署的 Ollama 的地址 http://宿主机ip:11434,测试一下连接状态。

选择 Ollama 部署好的模型,尝试对话测试是否正常:

尝试使用 7b 模型,可以看到此时 GPU 不是 100% 了,说明 GPU 性能不够了,模型部分加载到 GPU 和系统内存中。

1
2
3
C:\Users\Administrator>ollama ps
NAME ID SIZE PROCESSOR CONTEXT UNTIL
deepseek-r1:7b 755ced02ce7b 6.0 GB 59%/41% CPU/GPU 4096 4 minutes from now

可以看到内存拉满了:

参考资料

ollama
基于Ollama + Open-Webui实现局域网内DeepSeek大模型分享以及知识库构建_厦大数据库实验室博客
在 Windows 上配置 Ollama 服务并开放局域网访问_如何限制ollama监听范围-CSDN博客
最适合使用 Ollama 本地运行的效果最好的 LLM 模型 | 乐的博客
Ubantu22.04系统docker部署Open WebUI+Ollama【教程】_openwebui docker部署-CSDN博客