LLM大语言模型私有化部署-使用Dify与Qwen2.5打造专属知识库
背景
Dify
是一款开源的大语言模型(LLM) 应用开发平台。其直观的界面结合了 AI
工作流、 RAG
管道、 Agent
、模型管理、可观测性功能等,让您可以快速从原型到生产。相比 LangChain
这类有着锤子、钉子的工具箱开发库, Dify
提供了更接近生产需要的完整方案,而且,可以作为 Coze
的开源平替。
Dify一词源自Define + Modify,意指定义并且持续的改进你的AI应用,它是为你而做的(Do it for you)。
上一篇我们使用 Ollama
私有化部署了一个2G大小的模型: llama3.2
(3B),本篇文章先用 Ollama
私有化部署 Qwen2.5
(7B)模型,方便后续使用 Dify
进行中文知识库的理解;接着进行私有化部署 Dify
社区版,快速搭建一个聊天助手;最后结合本地知识库作为 Dify
上下文实现真正的个人助手。
虚机资源
共用到了1台虚机,纯CPU运行,较慢😢
主机名 | IP | 说明 |
---|---|---|
llm | 192.168.44.170 | llm节点 |
基本选用当前最新版本:
- Ollama版本:v0.4.7
- Qwen版本:2.5
系统环境
[root@llm ~]# uname -a
Linux llm 5.10.0-182.0.0.95.oe2203sp3.x86_64 #1 SMP Sat Dec 30 13:10:36 CST 2023 x86_64 x86_64 x86_64 GNU/Linux
[root@llm ~]# cat /proc/version
Linux version 5.10.0-182.0.0.95.oe2203sp3.x86_64 (root@dc-64g.compass-ci) (gcc_old (GCC) 10.3.1, GNU ld (GNU Binutils) 2.37) #1 SMP Sat Dec 30 13:10:36 CST 2023
Docker镜像加速
为了确保可以成功下载到镜像,以下配置了国内目前可以使用的 Docker
镜像源地址: vi /etc/docker/daemon.json
。
{"registry-mirrors": ["https://docker.hpcloud.cloud","https://docker.m.daocloud.io","https://docker.unsee.tech","https://docker.1panel.live","http://mirrors.ustc.edu.cn","https://docker.chenby.cn","http://mirror.azure.cn","https://dockerpull.org","https://dockerhub.icu","https://hub.rat.dev","https://dockerpull.com","https://docker.hpcloud.cloud","https://docker.m.daocloud.io"]
}
修改保存之后,记得重启 docker
服务。
systemctl daemon-reload
systemctl restart docker
私有化部署Qwen2.5模型
通过 Ollama
直接拉取部署 Qwen2.5
(7B)模型。
容器化部署Qwen2.5
# 拉取qwen2.5:7b
[root@llm ~]# docker exec -it ollama ollama run qwen2.5:7b
pulling manifest
pulling 2bada8a74506... 100% ▕███████████████████████████████████████████████████████████████████████████████████████████▏ 4.7 GB
pulling 66b9ea09bd5b... 100% ▕███████████████████████████████████████████████████████████████████████████████████████████▏ 68 B
pulling eb4402837c78... 100% ▕███████████████████████████████████████████████████████████████████████████████████████████▏ 1.5 KB
pulling 832dd9e00a68... 100% ▕███████████████████████████████████████████████████████████████████████████████████████████▏ 11 KB
pulling 2f15b3218f05... 100% ▕███████████████████████████████████████████████████████████████████████████████████████████▏ 487 B
verifying sha256 digest
writing manifest
success
>>> who r u?
I\'m Qwen, an AI assistant created by Alibaba Cloud. I exist to provide information, answer questions, and assist with various tasks. How can I help
you today?
[root@llm ollama]# docker exec -it ollama ollama list
NAME ID SIZE MODIFIED
qwen2.5:7b 845dbda0ea48 4.7 GB 16 minutes ago
llama3.2:latest a80c4f17acd5 2.0 GB 8 days ago
ollama常用命令
[root@llm docker]# docker exec -it ollama ollama -h
Large language model runnerUsage:ollama [flags]ollama [command]Available Commands:serve Start ollamacreate Create a model from a Modelfileshow Show information for a modelrun Run a modelstop Stop a running modelpull Pull a model from a registrypush Push a model to a registrylist List modelsps List running modelscp Copy a modelrm Remove a modelhelp Help about any commandFlags:-h, --help help for ollama-v, --version Show version informationUse "ollama [command] --help" for more information about a command.
部署Dify
Dify
官方的体验地址提供了一定的免费额度,知识库支持上传50个文档, RAG
向量空间只有5MB。不过还是建议稍微折腾一下,进行本地部署,一方面不用付费,另外数据安全也有保障。
容器化部署Dify
从GitHub上 https://github.com/langgenius/dify
下载 Dify
社区版源码。进入 ./dify-main/docker
目录,直接执行 docker-compose up -d
命令一键启动 Dify
用到的所有容器。
Note:
- Dify默认要用到80和443端口,我这里是一台干净的新虚机,没有启动其他服务,所以直接启动了,如果你的80或者其他端口被占用,可通过.env环境变量进行更改。
- 如果没有镜像,第一次启动过程会很慢,因为要到远程拉取镜像,等等吧,实际共下载了8个镜像,9个容器。
# 启动服务
[root@llm docker]# docker-compose up -d
...
Creating docker_redis_1 ... done
Creating docker_ssrf_proxy_1 ... done
Creating docker_sandbox_1 ... done
Creating docker_web_1 ... done
Creating docker_db_1 ... done
Creating docker_weaviate_1 ... done
Creating docker_worker_1 ... done
Creating docker_api_1 ... done
Creating docker_nginx_1 ... done# 查看镜像
[root@llm docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ghcr.io/open-webui/open-webui main 065a36698c69 12 days ago 4.22GB
ollama/ollama latest a8316b7b7fcd 13 days ago 4.65GB
nginx latest 66f8bdd3810c 2 weeks ago 192MB
postgres 15-alpine 933581caa3e7 3 weeks ago 248MB
langgenius/dify-web 0.11.2 c26e830052b6 3 weeks ago 348MB
langgenius/dify-api 0.11.2 de697455d474 3 weeks ago 2.93GB
langgenius/dify-sandbox 0.2.10 4328059557e8 8 weeks ago 567MB
redis 6-alpine 4100b5bd1743 2 months ago 35.5MB
ubuntu/squid latest 87507c4542d0 3 months ago 242MB
semitechnologies/weaviate 1.19.0 8ec9f084ab23 19 months ago 52.5MB
验证Dify安装
浏览器访问: http://192.168.44.170
打开 Dify
页面。
- 首先需要设置用户账号信息创建管理员账号
- 登录成功后,进入首页
构建聊天助手
- 创建应用
类型选择最简单的聊天助手,基础编排。
- 添加大模型
支持主流的模型托管服务商,OpenAI、Anthropic以及Ollama等;这里选择我们刚下载的Qwen2.5模型。
Note:在输入模型名称,点击保存时,会有一个调用远程模型API是否可用的校验过程,稍微会卡顿一下;如果添加失败,说明无法访问到模型的API。
- 选择模型
- 测试模型
- 对话交互
构建个人知识库
大语言模型的训练数据一般基于公开的数据,且每一次训练需要消耗大量算力,这意味着模型的知识一般不会包含私有领域的知识,同时在公开知识领域存在一定的滞后性。为了解决这一问题,目前通用的方案是采用 RAG
(检索增强生成)技术,使用用户问题来匹配最相关的外部数据,将检索到的相关内容召回后作为模型提示词的上下文来重新组织回复。
这里我选择之前写的关于数据集成工具 ETLCloud
的系列文章( PDF
格式)作为知识库素材。
Note: 当前 Dify
的知识库支持以下格式的文件:
- 长文本内容(TXT、Markdown、DOCX、HTML、JSONL 甚至是 PDF 文件)
- 结构化数据(CSV、Excel 等)
- 选择数据源
- 文本分段与清洗
- 处理并完成
- 添加知识库作为聊天助手的上下文
- 询问知识库相关内容
Note:
- 打完收工,个人知识库小助手成功上线啦!
- 每次的回答输出还提供了参考文档,贴心~
离线部署
实际生产环境,有时候没有互联网环境,需要进行离线部署。
导出/导入镜像tar包
先将前面在可以连接互联网的主机上下载的镜像保存导出为tar包。
docker save langgenius/dify-web:0.11.2 -o dify-web.tar
docker save langgenius/dify-api:0.11.2 -o dify-api.tar
docker save langgenius/dify-sandbox:0.2.10 -o dify-sandbox.tar
docker save nginx:latest -o nginx.tar
docker save postgres:15-alpine -o postgres.tar
docker save redis:6-alpine -o redis.tar
docker save ubuntu/squid:latest -o squid.tar
docker save semitechnologies/weaviate:1.19.0 -o weaviate.tar
然后在需要进行离线部署的主机上执行以下命令加载镜像。
docker load -i dify-web.tar
docker load -i dify-api.tar
docker load -i dify-sandbox.tar
docker load -i nginx.tar
docker load -i postgres.tar
docker load -i redis.tar
docker load -i squid.tar
docker load -i weaviate.tar
模型迁移
比如将我们已下载的 llama3.2
、 Qwen2.5
模型迁移到离线主机上:将模型文件目录 models
(这里是 /opt/ollama/models
)拷贝到目标离线主机的对应目录即可。
小总结
文章主要介绍了如何使用 Ollama
和 Dify
搭建个人 AI
助手。首先通过 Ollama
私有化部署了 Qwen2.5 (7B)
模型,然后使用 Docker Compose
一键部署了 Dify
社区版平台。在 Dify
平台上,创建了基于 Qwen2.5
模型的聊天助手,并添加了个人知识库作为上下文,实现了真正的个人助手功能。文章最后还介绍了离线部署方案,包括如何导出/导入 Docker
镜像和迁移模型文件,方便在无互联网环境下部署使用。整个过程展示了从模型部署到应用构建的完整流程,为搭建私有化 AI
助手提供了实践指导。
Reference
- http://difyai.com/
- https://github.com/langgenius/dify
- https://docs.dify.ai/zh-hans
If you have any questions or any bugs are found, please feel free to contact me.
Your comments and suggestions are welcome!
相关文章:

LLM大语言模型私有化部署-使用Dify与Qwen2.5打造专属知识库
背景 Dify 是一款开源的大语言模型(LLM) 应用开发平台。其直观的界面结合了 AI 工作流、 RAG 管道、 Agent 、模型管理、可观测性功能等,让您可以快速从原型到生产。相比 LangChain 这类有着锤子、钉子的工具箱开发库, Dify 提供了更接近生产需要的完整…...

使用C语言连接MySQL
在C语言中连接MySQL数据库,通常需要使用MySQL提供的C API。以下是使用C语言连接MySQL数据库的基本步骤和示例代码: 步骤 1: 安装MySQL C API 首先,确保你的系统上安装了MySQL数据库,并且安装了MySQL C API库。在大多数Linux发行版…...

PyTorch 2.0 以下版本中设置默认使用 GPU 的方法
PyTorch 2.0 以下版本中设置默认使用 GPU 的方法 在 PyTorch 2.0以下版本中,默认情况下仍然是使用 CPU 进行计算,除非明确指定使用 GPU。在 PyTorch 2.0 以下版本中,虽然没有 torch.set_default_device 的便捷方法,但可以通过显式…...

信号槽【QT】
文章目录 对象树字符集信号槽QT坐标系信号与槽connect自定义槽自定义信号disconnect 对象树 #ifndef MYLABEL_H #define MYLABEL_H#include<QLabel> class MyLabel : public QLabel { public:// 构造函数使用带 QWidget* 版本的.// 确保对象能够加到对象树上MyLabel(QWi…...

【UE5 C++课程系列笔记】10——动态单播/多播的基本使用
目录 概念 申明动态委托 一、DECLARE_DYNAMIC_DELEGATE 二、DECLARE_DYNAMIC_MULTICAST_DELEGATE 绑定动态委托 一、BindDynamic 二、AddDynamic 三、RemoveDynamic 执行动态委托 一、Execute 二、ExecuteIfBound 三、IsBound 四、Broadcast 动态单播使用示…...

点击展示大图预览
原文链接在table表格里能够实现,点击里面的图片实现大图预览的效果; 一、先安装viewer — 使用npm安装 npm install v-viewer --save二、在main.js中引入 import Viewer from v-viewer //点击图片大图预览 import viewerjs/dist/viewer.css Vue.use(…...

【C++】分书问题:深入解析、回溯法高级应用与理论拓展
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述💯思路与算法回溯法理论基础 💯代码实现与解析完整代码代码关键步骤解析 💯时间复杂度与空间复杂度分析💯理论拓展&…...

java开发入门学习五-流程控制
流程控制语句 if, if...else, if..else if..else 与前端相同 略 switch case 与前端不同的是case不能使用表达式,使用表达式会报错 class TestSwitch {public static void main(String[] args) {// switch 表达式只能是特定的数据类型…...

【FFmpeg 教程 一】截图
本章使用 ffmpeg 实现观影中经常会用到的功能,截图。 以下给出两种方式。 课程需具备的基础能力:Python 1. 使用 subprocess 调用 FFmpeg 命令 import subprocess def extract_frame(video_path, output_image_path, timestamp"00:00:05")&qu…...

北邮,成电计算机考研怎么选?
#总结结论: 基于当前提供的24考研复录数据,从报考性价比角度,建议25考研的同学优先选择北邮计算机学硕。主要原因是:相比成电,北邮计算机学硕的目标分数更低,录取率更高,而且北邮的地理位置优势明显。对于…...

深入了解京东API接口:如何高效获取商品详情与SKU信息
在当今数字化时代,电商平台的数据接口成为了连接商家与消费者的桥梁。京东作为国内领先的电商平台,其API接口为开发者提供了丰富的商品信息获取途径。本文将深入探讨如何使用京东API接口高效获取商品详情与SKU信息,并附上简短而实用的代码示例…...

C++常见内存泄漏案例分析以及解决方案
C 常见内存泄漏案例分析以及解决方案 1. 分配与释放不匹配 在动态内存管理中,使用new操作符分配的内存必须通过delete操作符显式释放。若未遵循这一规则,将导致内存泄漏。例如: int *p new int; p new int; // 错误:未释放先…...

[LeetCode-Python版]206. 反转链表(迭代+递归两种解法)
题目 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2: 输入:head [1,2] 输出:[2,1] 示例 3࿱…...

70 mysql 中事务的隔离级别
前言 mysql 隔离级别有四种 未提交读, 已提交读, 可重复度, 序列化执行 然后不同的隔离级别存在不同的问题 未提交读存在 脏读, 不可重复度, 幻觉读 等问题 已提交读存在 不可重复度, 幻觉读 等问题 可重复读存在 幻觉读 等问题 序列化执行 没有以上问题 然后 我们这里…...

C语言二叉树
1.思维导图 树 二叉树 2.将链式队列重新实现一遍 linkqueue.c #include"linkqueue.h" linkqueuePtr create() {linkqueuePtr L(linkqueuePtr)malloc(sizeof(linkqueue));if(NULLL){printf("队列创建失败\n");return NULL;}L->head(nodePtr)malloc(si…...

智能工厂的设计软件 三种处理单元(NPU/GPU/CPU)及其在深度学习框架中的作用 之1
本文要点 深度学习:认知系统架构的处理层 在认知系统架构的设计和代码实现上 需要考虑多个层次,包括感知层、处理层、决策层和执行层。其中 深度学习主要用来解决处理层上的认知问题。 感知层:负责收集外部环境的信息。 处理层:…...

iOS swift开发系列--如何给swiftui内容视图添加背景图片显示
我需要在swiftui项目中显示背景图,有两种方式,一种是把图片拖入asset资源中,另外一种是直接把图片放在源码目录下。采用第一种方式,直接把图片拖到资源目录,但是swiftui项目没有弹出, “Copy items if need…...

jmeter后端监视器
一、概述 JMeter 后端监听器(Backend Listener)是 JMeter 提供的一个功能强大的插件,用于将测试执行期间收集的性能数据发送到外部系统进行监控和分析。通过后端监听器,您可以实时地将 JMeter 测试执行期间收集的数据发送到外部系统,如图形化展示、数据库、数据分析工具等…...

服务器数据恢复—RAIDZ离线硬盘数超过热备盘数导致阵列崩溃的数据恢复案例
服务器存储数据恢复环境: ZFS Storage 7320存储阵列中有32块硬盘。32块硬盘分为4组,每组8块硬盘,共组建了3组RAIDZ,每组raid都配置了热备盘。 服务器存储故障: 服务器存储运行过程中突然崩溃,排除人为误操…...

面试题整理4----lvs,nginx,haproxy区别和使用场景
LVS、Nginx、HAProxy:区别与使用场景 1. LVS(Linux Virtual Server)1.1 介绍1.2 特点1.3 使用场景 2. Nginx2.1 介绍2.2 特点2.3 使用场景 3. HAProxy3.1 介绍3.2 特点3.3 使用场景 4. 总结对比 在构建高可用、高性能的网络服务时,…...

iOS - 超好用的隐私清单修复脚本(持续更新)
文章目录 前言开发环境项目地址下载安装隐私访问报告隐私清单模板最后 前言 在早些时候,提交应用到App Store审核,大家应该都收到过类似这样的邮件: Although submission for App Store review was successful, you may want to correct th…...

html <a>设置发送邮件链接、打电话链接 <a href=“mailto:></a> <a href=“tel:></a>
1.代码 <ul><li>电话:<a href"tel:18888888888">188-8888-8888</a></li><li>邮箱:<a href"mailto:10000qq.com">10000qq.com</a></li><li>邮箱:<a hre…...

clickhouse-副本和分片
1、副本 1.1、概述 集群是副本和分片的基础,它将ClickHouse的服务拓扑由单节点延伸到多个节点,但它并不像Hadoop生态的某些系统那样,要求所有节点组成一个单一的大集群。ClickHouse的集群配置非常灵活,用户既可以将所有节点组成…...

2009 ~ 2019 年 408【计算机网络】大题解析
2009 年 路由算法(9’) 讲解视频推荐:【BOK408真题讲解-2009年(催更就退网版)】 某网络拓扑如下图所示,路由器 R1 通过接口 E1 、E2 分别连接局域网 1 、局域网 2 ,通过接口 L0 连接路由器 R2 &…...

vue2使用render,js中写html
1、js部分table.js export default {name: "dadeT",data() {return {dades: 6666};},render(h) {return h(div, [h(span, 组件数据:${this.dades}), // 利用data里的dades数据,展示在页面上h(span, 89855545)]);} };2、vue部分 <templat…...

如何有效划分服务器磁盘空间?具体的步骤和流程
有效划分服务器磁盘空间对于提升系统性能、管理方便性和数据安全性至关重要。合理的磁盘分区不仅有助于提高服务器的运行效率,还能在数据恢复、系统故障修复和存储管理方面提供更高的灵活性。以下是如何有效划分服务器磁盘空间的几个关键步骤和注意事项。 磁盘分区的…...

labelme标签批量转换数据集json_to_dataset
文章目录 labelme标签批量转换数据集json_to_dataset转换原理单张图片转换多张图片批量转换bat脚本循环法 标注图片提取标注图片转单通道 labelme标签批量转换数据集json_to_dataset 转自labelme批量制作数据集教程。 转换原理 在安装了labelme的虚拟环境中有一个labelme_js…...

Fisco-Bcos-java-SDK 利用java与fisco-Bcos区块链上的智能合约交互(以HelloWorld为例)
Fisco-Bcos-java-SDK 利用java与fisco-Bcos区块链上的智能合约交互(以HelloWorld为例) 一、部署智能合约 1、编写智能合约 此处用最简单的HelloWorld合约作为例子 包含两个方法和一个构造函数 构造函数:当合约部署的时候 执行构造函数 将…...

OpenHarmony-3.HDF Display子系统(6)
Display 子系统 1.Display驱动模型介绍 当前操作系统和 SOC 种类繁多,各厂商的显示屏器件也各有不同,随之针对器件的驱动代码也不尽相同,往往是某一款器件驱动,只适用于某单一内核系统或 SOC,如果要迁移到其他内核或者…...

Nginx中Server块配置的详细解析
Nginx中Server块配置的详细解析 一、Server块简介 在Nginx配置文件中,server块是非常关键的部分。它用于定义虚拟主机,一个server块就代表一个虚拟主机。这使得我们可以在一台Nginx服务器上通过不同的配置来处理多个域名或者基于不同端口的服务请求。 …...