从零开始构建强大 AI 对话系统:ollama + deepseek + open-webui 完整部署教程(Docker 版)
文章目录
- 前言
- 一、工具简介
- 二、前期准备
- 三、部署步骤
- 1. 安装并配置 ollama
- 2. 部署 open-webui
- 四、调试与验证
- 五、Docker Compose 简化部署
- 六、注意事项与常见问题
- 1. ollama run 500 报错
- 2. 硬件配置对性能的影响
- 3. **ollama** 启动与 **open-webui** 调用速度差异
- 4. 内存不足导致的性能问题
- 5. 家用部署方案的困难
- 六、总结
前言
在现代的人工智能应用中,基于模型的对话系统和开放式网络UI正逐渐成为越来越多企业和开发者的选择。本篇博文将为您详细讲解如何通过 Docker 部署 ollama、deepseek 和 open-webui,并结合使用 Docker Compose 实现更加高效、便捷的管理。
一、工具简介
在开始之前,我们先了解一下每个工具的功能和作用:
ollama
- ollama 是一个强大的对话生成模型,它支持多种自然语言处理任务,包括对话生成、问答、文本总结等。通过容器化部署,ollama 可以轻松地集成到开发环境中,提供一个灵活、可扩展的对话服务。
deepseek
- deepseek 是一个基于深度学习的语义理解模型,通常与对话系统一起使用。它能够根据用户的输入快速生成符合语义逻辑的回答,从而增强对话系统的准确性和响应速度。在本教程中,我们通过 ollama 运行 deepseek 模型,提供强大的对话能力。
open-webui
- open-webui 是一个开源的 Web 界面,用于与 AI 模型进行交互。通过它,用户可以通过浏览器与部署的 AI 模型进行实时对话,查看模型的输出结果。open-webui 提供了一个简洁、易用的 UI,方便用户快速集成和管理对话系统。
二、前期准备
在开始部署之前,首先确保系统中已安装好 Docker。若尚未安装,可以参考以下教程:
Windows 系统 Docker 安装教程(菜鸟教程)
Docker 是一个基于容器的轻量级虚拟化平台,能够帮助我们更轻松地部署和运行应用。
三、部署步骤
1. 安装并配置 ollama
可参考:
- ollama官网
- ollama 官方 docker 镜像
ollama 是一个强大的对话生成模型,支持多个版本的对话能力。在 Docker 中部署 ollama 是十分简单的。我们首先需要从 Docker Hub 上拉取 ollama 的镜像。
docker run -d -v D:/ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama
-d:后台运行容器
-v D:/ollama:/root/.ollama:将本地文件夹挂载到容器内
-p 11434:11434:映射端口,方便外部访问
--name ollama:容器名称
ollama/ollama:镜像名
部署完成后,执行以下命令启动 deepseek 模型:
docker exec -it ollama ollama run deepseek-r1:1.5b
此时,系统已启动,进入容器后,你可以看到一个 >>> 的提示符,表示可以开始与模型进行对话了。
2. 部署 open-webui
接下来,我们将部署 open-webui,它是一个用于与 AI 模型交互的 Web 界面。只需要执行以下命令即可启动:
docker run -d -p 3000:8080 -e OLLAMA_BASE_URL=http://192.168.x.x:11434 -v D:/open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main
-p 3000:8080:将容器的 8080 端口映射到宿主机的 3000 端口
-e OLLAMA_BASE_URL=http://192.168.x.x:11434:配置 ollama 服务的基础 URL 地址(此处 192.168.x.x 请替换为本机 IP 地址)
-v D:/open-webui:/app/backend/data:挂载本地目录到容器
--name open-webui:容器名称
--restart always:容器异常退出后自动重启
可使用 ip a (Linux)或 ipconfig (Windows)命令查看本机 ip 地址。
四、调试与验证
完成部署后,可以通过浏览器访问 http://localhost:3000 进入 open-webui。在这个 Web 界面上,你可以与 deepseek 模型进行交互。
登录进去后,左上角选择模型。
五、Docker Compose 简化部署
为了让部署过程更加自动化和易于管理,我们可以将以上命令封装到一个 docker-compose.yml 文件中。通过 Docker Compose,我们可以实现一次性启动整个应用栈。
以下是 docker-compose.yml 文件的示例:
version: '3'services:ollama:image: ollama/ollamacontainer_name: ollamaports:- "11434:11434"volumes:- ./ollama:/root/.ollamacommand: ollama run deepseek-r1:1.5brestart: alwaysopen-webui:image: ghcr.io/open-webui/open-webui:maincontainer_name: open-webuiports:- "3000:8080"environment:- OLLAMA_BASE_URL=http://ollama:11434volumes:- ./open-webui:/app/backend/datarestart: always
在文件夹中创建 docker-compose.yml,然后执行以下命令启动所有服务:
docker-compose up -d
Docker Compose 会根据 docker-compose.yml 文件自动拉取镜像、创建容器并启动服务。你只需要专注于应用的业务逻辑,无需手动管理每个容器。
六、注意事项与常见问题
在实际部署 ollama + deepseek + open-webui 的过程中,我遇到了一些问题和限制,特别是在硬件配置和性能方面。这里是我个人的一些使用经验和建议,供大家参考。
1. ollama run 500 报错
在 ollama run 在下载模型时出现 500 错误的情况。根据我的观察,这可能是因为 ollama 的官方网站或服务在某些时段遭遇了攻击或过载,导致无法正常处理请求。
虽然出现了 500 错误,但等待一段时间后问题会自动恢复。
2. 硬件配置对性能的影响
在使用 deepseek 时,我遇到了性能问题,特别是在硬件配置不达标的情况下,模型的表现会非常差。具体来说:
-
我尝试在一台
32 核 CPU、128GB 内存、机械硬盘的超融合集群的虚拟机上部署8B模型。结果,模型的表现极差,甚至出现了非常离谱的回答——比如问 7B 和 8B 模型的区别是什么,得到的答案居然是“这两台机器的区别”,完全是乱回答。 -
然后,在一台小米笔记本上部署测试,笔记本配置为
i5-7200U(4核),8GB 内存,SSD 硬盘。虽然这台笔记本的硬件配置远不如前述虚拟机,但 7B 模型 在这台机器上能正经回答关于 7B 和 8B 模型区别 这个问题,相比下效果好很多。
从中我得出结论,官方建议的硬件配置真的不容忽视,特别是对于 deepseek 这类计算量较大的模型。官方推荐的硬件配置和部署方案如果达不到,精度和准确度都会大打折扣。特别是硬盘方面,SSD 的作用显著,性能差距非常明显。
AI 模型分享、讨论、下载,开放社区 Hugging Face 里面可以找到很多建议
3. ollama 启动与 open-webui 调用速度差异
在测试过程中,我发现 直接使用 ollama 启动并与模型对话 的速度比通过 open-webui 调用 API 的速度要快得多。速度差距非常明显,直接启动 ollama 的响应时间更短,几乎可以立刻得到回复,而通过 open-webui 调用 API 时,响应时间则明显较慢。
至于为什么会有这种差异,我猜测是由于 open-webui 在前端和后端之间有额外的通信开销和数据处理,而直接启动 ollama 可以避免这些额外的延迟,直接与模型进行交互。但具体的原因可能还需要更深入的分析,涉及到 API 调用、网络请求等多个因素。
4. 内存不足导致的性能问题
由于笔记本的内存限制,1.5B 模型 + open-webui 的组合在使用过程中非常慢,尤其是在内存不足时,体验非常差。我曾在笔记本上运行 1.5B 模型,问一个简单的问题竟然等了 5 分钟,连续提问之后,甚至出现了 500 错误,导致 open-webui 服务挂掉(ollama 没挂)。
因为 open-webui 作为前端容器,它不仅需要处理用户的请求,还需要通过 API 与后端模型容器交互。这会导致以下几个因素:
- API 调用的额外开销:每次用户请求都需要通过网络与后端容器进行通信。如果系统内存不足,网络请求的延迟和处理时间会增加,容易出现超时、错误等问题,特别是在大量并发请求时,可能导致服务挂掉(如 500 错误)。
- 请求队列的积压:在内存不足的情况下,open-webui 可能会积压请求,导致响应变慢,最终无法及时处理所有请求,进而导致服务崩溃。
然而,ollama(和其中的 deepseek)容器在内存不够的情况下依旧能够稳定运行,不会像 open-webui 一样挂掉,并且单独提问也比在 open-webui 回答的速度快。这个现象可能与 open-webui 容器在处理大量 API 请求时的资源消耗有关,而 ollama 可能是通过更高效的资源管理,减少了对内存和 CPU 的依赖。
相比之下,ollama 容器直接运行模型,不依赖于外部的 API 调用,且可能具有以下优势:
- 内部资源管理更高效:ollama 在处理请求时,不需要通过复杂的前端请求-后端响应流程。它将整个流程封装在一个容器内,可能在内存和 CPU 使用上进行了更精简的优化。这使得即使在内存不足的情况下,它依旧能够较为稳定地运行。
- 直接与模型交互:当你直接与 ollama 容器进行交互时,数据传输的路径更短,计算更加集中,减少了外部请求和资源竞争的问题。
- 容错性较强:ollama 可能有更好的内存管理策略,比如缓存、分页加载或其他优化策略,能够在内存资源有限的情况下保持运行稳定。
5. 家用部署方案的困难
我原本的计划是把 deepseek 部署在家用环境中,以达到省电并保持高效的目标。然而,实际测试结果显示,这种方案在当前的硬件配置下似乎不可行。特别是在内存和硬盘的压力下,系统的响应速度和稳定性并没有达到预期效果。
所以,如果你计划在家用机器上运行类似的 AI 模型,尤其是 deepseek,建议你提前检查硬件配置,特别是 SSD 硬盘和充足的内存。
六、总结
通过以上步骤,我们已经成功地在 Docker 中部署了 ollama、deepseek 和 open-webui,并通过 Docker Compose 优化了整个部署过程。这一组合为开发者和 AI 研究人员提供了一个快速、高效的对话系统解决方案,可以方便地进行自定义开发与实验。
如果有任何问题,欢迎留言讨论!
相关文章:
从零开始构建强大 AI 对话系统:ollama + deepseek + open-webui 完整部署教程(Docker 版)
文章目录 前言一、工具简介二、前期准备三、部署步骤1. 安装并配置 ollama2. 部署 open-webui 四、调试与验证五、Docker Compose 简化部署六、注意事项与常见问题1. ollama run 500 报错2. 硬件配置对性能的影响3. **ollama** 启动与 **open-webui** 调用速度差异4. 内存不足导…...
unity学习29:摄像机camera相关skybox 和 Render Texture测试效果
目录 1 摄像机 1.1 每个Scene里都自带一个摄像机 camera 1.2 可以创建多个camera 1.3 下面先看backgroundtype: 2 backgroundtype: 天空盒 skybox 2.1 清除标志,清除:天空盒 自选天空盒 2.2 window /Asset Store 2.3 导入skybox 3 backgroundtype: 纯色…...
【Elasticsearch】Geo-distance聚合
geo_distance聚合的形状是圆形。它基于一个中心点(origin)和一系列距离范围来计算每个文档与中心点的距离,并将文档分配到相应的距离范围内。这种聚合方式本质上是以中心点为圆心,以指定的距离范围为半径的圆形区域来划分数据。 为…...
音频进阶学习十二——Z变换
文章目录 前言一、Z变换1.Z变换的作用2.Z变换公式3.Z的状态表示1) r 1 r1 r12) 0 < r < 1 0<r<1 0<r<13) r > 1 r>1 r>1 4.关于Z的解释 二、收敛域1.收敛域的定义2.收敛域的表示方式3.ROC的分析1)当 …...
easyxor
easyxor 一、查壳 无壳,64位 二、IDA分析 1.main 2.查看key与r(shifee提取) 三、脚本 r [0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, …...
通过多层混合MTL结构提升股票市场预测的准确性,R²最高为0.98
“Boosting the Accuracy of Stock Market Prediction via Multi-Layer Hybrid MTL Structure” 论文地址:https://arxiv.org/pdf/2501.09760 摘要 本研究引入了一种创新的多层次混合多任务学习架构,致力于提升股市预测的效能。此架构融…...
日本游戏机市场5年来首次陷入萎缩;特斯拉招人推进人形机器人量产;任天堂专利显示Switch2手柄可用作鼠标...| 游戏智眼日报
美团成立“算法顾问委员会” 美团宣布,近日,由外部专家学者组成的算法顾问委员会成立,为美团改进算法提供常态化咨询和指导。每个季度美团将举办算法恳谈会,持续邀请骑手、商家、用户、专家学者和媒体代表等共同参加。美团表示&a…...
114-机器学习分类算法
1、内容简介 略 matlab simulink 114-机器学习分类算法可以交流、咨询、答疑 2、内容说明 略 Elong_6.24。ROCAUC confusion newdata Unbalanced_LR.car 3、仿真分析 略 4、参考论文 略...
【论文阅读】On the Security of “VOSA“
On the Security of Verifiable and Oblivious Secure Aggregation for Privacy-Preserving Federated Learning -- 关于隐私保护联邦中可验证与遗忘的安全聚合的安全性 论文来源摘要Introduction回顾 VOSA 方案对VOSA不可伪造性的攻击对于类型 I 的攻击对于类型 II 的攻击 论文…...
12.6 LangChain检索器(Retrievers)全解析:构建高效RAG应用的核心引擎
LangChain检索器(Retrievers)全解析:构建高效RAG应用的核心引擎 一、检索器的核心价值 检索器是大模型应用的智能导航系统,通过将用户查询与知识库精准匹配,解决了传统搜索的三大痛点: 语义鸿沟:突破关键词匹配,理解用户真实意图多源整合:融合向量搜索、关键词搜索和…...
707设计链表(链表操作)
1、题目描述 你可以选择使用单链表或者双链表,设计并实现自己的链表。 单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。 如果是双向链表,则还需要属性 prev 以指示链表中…...
储能系统-系统架构
已更新系列文章包括104、61850、modbus 、单片机等,欢迎关注 IEC61850实现方案和测试-1-CSDN博客 快速了解104协议-CSDN博客 104调试工具2_104协议调试工具-CSDN博客 1 电池储能系统(BESS) 架构 电池储能系统主要包括、电池、pcs、本地控制…...
Spring Boot 需要独立的容器运行吗
Spring Boot 不需要独立的容器运行,它内置了一个嵌入式的Web服务器(如Tomcat、Jetty或Undertow),所以可以直接作为一个独立的应用程序运行,而不需要外部的Servlet容器。你只需要运行Spring Boot应用,它会自…...
Spring Security在java中的详细用处///为什么用了jwt之后就不能用session
Spring Security 是一个功能强大且高度可定制的认证和授权框架,主要用于基于 Spring 的应用程序中。它不仅处理 HTTP 请求的安全性(包括认证和授权),还提供了其他安全相关的特性如防止 CSRF 攻击、会话管理、安全头信息设置等。以…...
Ubuntu系统 Zabbix 7.2LTS一键部署脚本
为了在 Ubuntu 系统上快速部署 Zabbix 7.2 LTS 版本,您可以使用一个自动化 Bash 脚本来简化安装过程。以下是一个适用于 Ubuntu 系统的 Zabbix 7.2 LTS 一键部署脚本。此脚本将安装 Zabbix Server、Zabbix Web 界面(基于 Nginx 和 PHP)以及 Z…...
基于HTML、CSS 和 JavaScript 开发个人读书类网站
以下是一个使用 HTML、CSS 和 JavaScript 开发个人读书类网站的示例代码,包含基本功能和样式: 我的读书空间 我的书库 首页 添加新书 <div class="container"><!-- 首页内容 --><div id="home"><h2>当前阅读列表</h2><…...
Ollama python交互:chat+embedding实践
Ollama简介 Ollama 是一个开源的大型语言模型(LLM)平台,旨在让用户能够轻松地在本地运行、管理和与大型语言模型进行交互。 Ollama 提供了一个简单的方式来加载和使用各种预训练的语言模型,支持文本生成、翻译、代码编写、问答等…...
安卓路由与aop 以及 Router-api
安卓路由(Android Router)和AOP(面向切面编程)是两个在Android开发中常用的概念。下面我将详细讲解这两个概念及其在Android开发中的应用。 一、安卓路由 安卓路由主要用于在应用程序中管理不同组件之间的导航和通信。它可以简化…...
ip属地是手机号还是手机位置?一文理清
在数字化和网络化的今天,IP属地这一概念逐渐成为了人们关注的焦点。特别是在社交媒体和在线平台上,IP属地的显示往往让人联想到用户的地理位置。然而,关于IP属地到底与手机号还是手机位置有关,却存在着不少误解和混淆。本文将深入…...
迅为RK3568开发板篇OpenHarmony实操HDF驱动控制LED-编写应用APP
在应用代码中我们实现如下功能: 当应用程序启动后会获取命令行参数。如果命令行没有参数,LED 灯将循环闪烁;如果命令行带有参数,则根据传输的参数控制 LED 灯的开启或关闭。通过 HdfIoServiceBind 绑定 LED灯的 HDF 服务ÿ…...
Vue 鼠标事件合集,关于鼠标右键的处理方法(改写鼠标右键方法、自定义鼠标右键)
鼠标事件使用 mousedown"canvasDown($event)"按下事件合集 click 点击某个对象时触发 mousedown 鼠标按钮被按下时触发 mouseup 鼠标按钮被松开时触发 mouseleave 当鼠标指针移出元素时触发 dblclick 双击时触发 mousemove 鼠标移动时触发,…...
项目实操:windows批处理拉取git库和处理目录、文件
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
【Elasticsearch】terms聚合误差问题
Elasticsearch中的聚合查询在某些情况下确实可能存在误差,尤其是在处理分布式数据和大量唯一值时。这种误差主要来源于以下几个方面: 1.分片数据的局部性 Elasticsearch的索引通常被分成多个分片,每个分片独立地计算聚合结果。由于数据在分…...
PHP JSON操作指南
PHP JSON操作指南 概述 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。PHP作为一门流行的服务器端脚本语言,支持对JSON数据进行读取、编写和解析。本文将…...
在C#中,Array,List,ArrayList,Dictionary,Hashtable,SortList,Stack的区别
Array Array你可以理解为是所有数组的大哥 普通数组 : 特点是长度固定, 只能存储相同类型的数据 static void Main(string[] args){//声明int[] ints;string[] strings;People[] peoples;//默认值 //int 类型是 0//string 类型是 nullint[] ints1 { 1, 2, 3 };string[] …...
JavaScript的 switch 方法
• 1. 浅说JavaScript的 switch 方法 • 1.1. 语法 • 1.2. 关键点 • 1.3. 示例 • 1.4. 注意事项 1. 浅说JavaScript的 switch 方法 在JavaScript中,switch 语句是一种多分支选择结构,用于根据不同的条件执行不同的代码块。 它提供了一种比多个…...
OpenBMC:通过qemu-system-arm运行编译好的image
OpenBMC:编译_openbmc meson.build file-CSDN博客 讲述了如何编译生成openbmc的image 完成编译后可以通过qemu-system-arm进行模拟加载,以便在没有BMC硬件的情况下进行调试 1.下载qemu-system-arm 在openbmc的上级目录上执行 wget https://jenkins.op…...
算法9--链表
链表 原理经典例题[2. 两数相加](https://leetcode.cn/problems/add-two-numbers/description/)[24. 两两交换链表中的节点](https://leetcode.cn/problems/swap-nodes-in-pairs/)[143. 重排链表](https://leetcode.cn/problems/reorder-list/description/)[23. 合并 K 个升序链…...
Mac本地部署DeekSeek-R1下载太慢怎么办?
Ubuntu 24 本地安装DeekSeek-R1 在命令行先安装ollama curl -fsSL https://ollama.com/install.sh | sh 下载太慢,使用讯雷,mac版下载链接 https://ollama.com/download/Ollama-darwin.zip 进入网站 deepseek-r1:8b,看内存大小4G就8B模型 …...
[Java基础]函数式编程
Lambda函数 JDK8新增的语法形式, 使用Lambda函数替代某些匿名内部类对象,从而让程序代码更简洁,可读性更好。 基本使用 lambda表达式只能简化函数式接口的匿名内部类写法 // 1.定义抽象类 abstract class Animal {public abstract void crt(); }publi…...
