保姆级教程搭建企业级智能体+私有知识库,Dify+ollama,Linux版
介绍
目前,AI Agent智能体已经被许多公司广泛应用,同时智能体借助私有知识库的加成,使原来知识面并不特别充分的大模型更聪明。如今特别是在医疗,医药,政企等数据保密程度高的行业,部署自己的私有知识库更是不可或缺的。下面,就一起来动手搭建属于你的企业级别的私有知识库AI Agent。
特别说明
1:本教程区别于其他教程全篇复制相关服务的官方教程,导致中途有卡点
2:本教程在搭建过程中会解决卡点问题并给出解决方案
3:按照本教程一步步搭建,可以百分百保证运行起来
4:本教程是纯实践,不做无脑搬运。
方案说明
1:利用Dify构建模型中间层
2:配置三方LLM模型
3:私有知识库使用ollama服务加nomic-embed-text模型,进行知识库文档的向量数据转化
疑问:
问:既然都自己搭建ollama了,为什么不自己搭建LLM模型,还要使用三方的api呢?其他教程都是自己搭建LLM
答:
①:硬件成本高
②:你所能找到的开源模型,除了deepseek,其他的模型使用起来跟个大傻子差不多
③:就算你要搭建deepseek模型,除了满血版的,其实也是个大傻子
④:企业级应用,起码上百人使用,就得要求token吞吐量不能太低,并发访问也不能太低,这些自己搭建部署,需要解决一大堆问题
⑤:现在三方token已经很便宜了
⑥:其他教程是教你搭建LLM了,我其他教程也有呀,deepseek-32b的,使用过就知道了,跟个大傻子差不多。其他教程教的,都是什么1.5b,7b,32b,70b,这些用于学习还行,不适合进行企业级应用或者商用
⑥:你要是非要自己折腾部署LLM,就当我上面没说哈,可以参考我另一篇教程助你折腾 ====手把手教你部署DeepSeek-32b
环境物料准备
| 要求 | 说明 |
|---|---|
| ubuntu 系统服务器(服务器A) | 有公网IP,4核8G配置 |
| ubuntu 系统服务器,有GPU显卡,且已装好cuda环境(服务器B) | (具体可参考我另一篇介绍Linux下安装conda的详细教程) |
| Dify的源码 | github地址 |
| ollama | 官网地址 |
注:如果手上有带显卡的服务器,也可以直接在一台服务器上安装,由于我这里业务层和算力层是分开的服务器,这里用2台作为演示
教程开始
一:搭建部署Dify应用
1:链接自己的服务器A,进入服务器,切换到root(如果是非root用户的话)

2:更新apt包
apt update
3:清理有可能安装的旧版本docker以及相关的包
sudo apt-get autoremove docker docker-ce docker-engine docker.io containerd runc
4:添加docker官方GPG密钥
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
5:添加Docker软件源
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
6:安装docker,docker-compose
apt install docker.io docker-compose
7:启动docker
systemctl start docker
8:安装git,并克隆Dify项目
apt install gitgit clone https://github.com/langgenius/dify.git
中途可能会遇到克隆错误的2个问题,
①:提示克隆的过大,可以修改git的整体buffer配置
②:提示网络环境不支持 HTTP/2,可以修改为http1.1
git config --global http.postBuffer 524288000git config --global http.version HTTP/1.1
9:克隆完毕,进入dify文件夹下的docker文件夹下,并把全局配置文件复制一下
cd dify/dockercp .env.example .env
10:开始构建docker容器,这时需要看下你安装的docker-compose是什么版本的,运行如下命令查看
docker-compose version

如果是1.xx版本的,需要运行
docker-compose up -d
如果是2.xx版本的,需要运行
docker compose up -d
注:这里我们是以apt直接进行安装的,理论上是1.xx版本的,如果你安装的是最新的docker,估计就是2.xx的版本了
11:由于我们是1.xx的版本,所以直接运行
docker-compose up -d
此时遇到了如下错误

此错误,可以进行修改docker的镜像地址进行解决,方案如下:
①: vim /etc/docker/daemon.json填入以下json内容:{"registry-mirrors": ["https://docker.registry.cyou","https://docker-cf.registry.cyou","https://dockercf.jsdelivr.fyi","https://docker.jsdelivr.fyi","https://dockertest.jsdelivr.fyi","https://mirror.aliyuncs.com","https://dockerproxy.com","https://mirror.baidubce.com","https://docker.m.daocloud.io","https://docker.nju.edu.cn","https://docker.mirrors.sjtug.sjtu.edu.cn","https://docker.mirrors.ustc.edu.cn","https://mirror.iscas.ac.cn","https://docker.rainbond.cc"]}②:然后重启docker服务:systemctl daemon-reloadsystemctl restart docker③:重新运行 docker-compose up -d 进行构建容器
12:随后,docker会自动根据编译文件.yaml自动拉取相关服务,成功后的画面如下所示,启动了10个服务:

或者通过命令查看每个服务的运行状态,由下图所示,有个nginx服务,并从容器中透了80端口,所以,可以直接通过访问你的ip地址进行访问链接
docker-compose ps

二:搭建ollama服务
1:租用GPU型服务器,我这里还是以AutoDL为例(这个平台便宜,且还有点余额,省事儿了。这里有现成的N卡环境,可以免去不会安装cuda环境的烦恼,如果有其他平台的GPU租用也是一样的)
这里我租用的是西北企业区,尽量不要北京地区的,北京地区的外网访问需要挂ssh,比较麻烦
镜像这里选择如下图所示

2:进入到新开的GPU服务器里,运行初始化
apt updateconda init
然后关闭当前窗口,重新进入或者单开一个窗口,进入到服务器里,此时进入到conda 环境里的默认 base 环境,下面为ollama单独新建一个conda 环境,用来运行环境隔离,比较干净
conda create -n ollama python=3.10
等待安装完毕,并进入ollama环境,如图所示

3:下载并安装ollama Linux版本下载地址

复制命令在你的GPU服务器里进行下载安装,等待一会儿,进度条走完就完事儿了,默认安装在/usr/local下,所以可以使用全局命令 ollama进行相关操作

如果出现下图所示,说明没有自动检测到GPU卡,可以通过安装两个插件解决

sudo apt install pciutilssudo apt install lshw
4:启动ollama服务(这里我以简单方式启动,也可以直接加入到系统服务里并配置自动重启)
nohup ollama serve &

5:运行并下载embedding模型,如下图所示
ollama pull nomic-embed-text

也可通过命令查看ollama的模型列表
ollama list

6:到此,ollama服务,embedding模型算是已经搭建部署完毕,但是为了让dify能访问到,还需要做一些其他配置。
由于AutoDL对外只支持6006端口开放,ollama的api接口呢又是绑定在了 11434端口,所以,在这里就要做一层访问转发。
这里访问转发以nginx web服务为例
①:安装nginx
apt install nginx
②:编辑nginx默认配置文件
vim /etc/nginx/sites-available/default
server块修改成如下内容:
server {listen 6006 default_server;listen [::]:6006 default_server;root /var/www/html;index index.html index.htm index.nginx-debian.html;server_name _;location / {proxy_pass http://127.0.0.1:11434;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_read_timeout 86440s;proxy_send_timeout 86440s;}}
然后校验配置文件并加载nginx 的配置进行重启
nginx -tnginx -s reload
7:由上可知,由于ollama是运行在本地 127.0.0.1:11434上,默认只允许本地访问,所以,还要设置ollama 允许远程访问,不然,我们的Dify 服务是链接不上。可以设置允许全部,也可以定向设置只允许某个域名或IP
vim ~/.bashrc
在文件末尾添加下面两行
export OLLAMA_HOST=0.0.0.0export OLLAMA_ORIGINS=*
重新加载 ~/.bashrc
source ~/.bashrc
然后再重启ollama服务
此时访问AutoDL的对外地址,可以看到ollama运行的标志。AutoDL的外网访问URL在这里看:


此时访问这个URL,可以看到 ollama is running 字样,这时候整个配置算是没问题了

8:到此,ollama服务,embedding模型,所有的服务配置已经完事儿
三:利用Dify创建你的第一个智能体
1:访问Dify服务并注册账号
1:地址:你的IP地址
首次进入会让你注册账号

2:注册完毕后,登录进入主页面,点击右上角的插件,进入插件页面,首先安装所需的模型插件

2. 下载模型插件(这里以Ollama和DeepSeek为例)
1:进入插件广场,找到【模型】选项,下面列出的都是支持的模型厂商。此次我们需要安装ollama,LLM用DeepSeeK,点击模型,进行安装。如果在线模式安装不上,也可以在模型详情页里下载下来,再点击右上角【插件】进行从本地安装包安装。


3. 配置模型
1:点击个人中心选项,找到【设置】,再点击【模型供应商】


1. 配置Ollama模型
由于我们是用ollama的embedding模型功能,所以配置时选择Text-Embedding选项。这里会让填写基础URL地址,由于我们是从AutoDL部署的embedding模型,所以需要再AutoDL上找到相关访问URL地址填写到配置里。



随后点击保存,如果保存时有报错,说明你的ollama访问地址还是不通,可以再查看上面有关ollama配置的教程重来一遍
2. 配置DeepSeek模型
首先你需要登录 DeepSeeK开放平台,并注册账号创建应用key,然后复制出key值

进入dify模型配置里,配置deepseek的模型

4. 创建智能体



例如:

OK,到这里一个基本的智能体就完成了,你可以点击右上角的进行发布,也可以进行嵌入你的应用里,嵌入方式如下:

5. 创建私有知识库

这里有三种方式,这里以简单的文档类为例,其余的两个需要各自注册相关平台的账号进行关联

然后,进入数据分块与清洗界面,这里我们是以embedding模型为基础,使用混合检索模式

保存处理后,进入下一步,开始数据的嵌入操作,这里进程走完后就可以使用了

进程走完后,也可以单独点击你的知识库,查看内容分块后的结果,或者进行召回测试,数据标注,添加新的分块等操作

在你创建的个人助手agent里的编排页面,点击知识库,进行关联操作,就可以关联你的知识库内容了

至此,整个所有的流程彻底走完了。
结语
纯手动一步步搭建操作,按照流程来,极小几率会出错,如果有出错或者不明白的地方,欢迎提问,共同学习。
相关文章:
保姆级教程搭建企业级智能体+私有知识库,Dify+ollama,Linux版
介绍 目前,AI Agent智能体已经被许多公司广泛应用,同时智能体借助私有知识库的加成,使原来知识面并不特别充分的大模型更聪明。如今特别是在医疗,医药,政企等数据保密程度高的行业,部署自己的私有知识库更…...
记一次线上程序宕机问题分析【写 GC 日志导致进程挂起】
1. 背景 运维侧持续反馈了几次线上业务程序 A 出现宕机告警的信息,重启后一段时间后又出现宕机,这里针对最后一次告警进行深入排查和分析。 首先这一次故障出现在 2024-03-14 04:18:23,和以往的宕机故障略有不同,以往的现象是切…...
position embedding
文章目录 1. 四种position embedding2. pytorch 源码[后续整理] 【因比较忙,后续整理】 1. 四种position embedding Position Embedding 1. Transformer 1.1 1d absolute 1.2 sin/cos constant 1.3 2. Vision Transformer 2.1 1d absolute 2.2 trainable 3. Swin T…...
【leetcode hot 100 739】每日温度
解法一:暴力解法 class Solution {public int[] dailyTemperatures(int[] temperatures) {int ntemperatures.length; // 指向要找下一个更高温度的地方int[] result new int[n];for(int left0;left<n;left){int rightleft1; // 指向正在找最高温度的地方wh…...
netplan是如何操控systemd-networkd的? 笔记250324
netplan是如何操控systemd-networkd的? netplan通过以下方式操控systemd-networkd: 工作原理:netplan读取位于/etc/netplan/目录下的YAML格式的配置文件,这些配置文件描述了网络接口的配置。netplan会将这些配置文件解析并转换为systemd-ne…...
Cookie、Session 与 Token:核心区别与应用场景解析
目录 引言 基础概念解析:三大身份验证技术详解 Cookie:浏览器中的"身份证" Session:服务器记忆的"对话" Token:加密的"通行证" 三种技术的深度对比分析 存储位置与数据流向 安全性全面对比…...
结合DrRacket学习《如何设计程序,第二版》
如何设计程序语言 DrRacket用于学习程序语言和设计程序语言,如何设计程序手册:How to Design Programs 如何设计程序,第二版:How to Design Programs, Second Edition 系统程序设计 设计师需遵循一系列严谨且系统的步骤&#…...
状态空间模型解析 (State-Space Model, SS)
一、文章摘要 状态空间模型(State-Space Model, SS)是一种广泛应用于控制系统、信号处理和系统建模的数学表示方式。MATLAB 提供的 ss 类用于描述线性时不变(LTI)系统的状态空间表示。本类实现了 LTI 系统的构造、属性设置、变换…...
zabbix添加IIS网站计数器(并发连接数)
0. Zabbix Agent 配置 PerfCounter = iis_Current_Connections,"\Web Service(_Total)\Current Connections",30 1.在被监控主机,powershell输入perfmon.msc 2.点击添加按钮 3.在下拉菜单中点击小箭头...
uniapp处理流式请求
在uniapp里面处理流式请求相对于web端来说有点麻烦,下面我将讲述几种处理流式请求的方式。 1.websocket WebSocket 是处理实时数据流的最佳选择之一,UniApp 提供了原生的 WebSocket 支持: <template><view class"container&…...
代码随想录算法训练营第四十一天|买卖股票专题:121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III
动规五部曲牢记于心 1、确定好dp[j]数组,以及下标含义 2、推导出dp[j]公式 3、初始化,关键dp[0][0]、dp[0][1],第i天,后面的01表示状态:持有、不持有 4、确定遍历顺序: 如果求组合问题,不考虑排…...
AI小白的第七天:必要的数学知识(概率)
概率 Probability 1. 概率的定义 概率是一个介于 0 和 1 之间的数,表示某个事件发生的可能性: 0:事件不可能发生。1:事件必然发生。0 到 1 之间:事件发生的可能性大小。 例如,掷一枚公平的硬币…...
[Windows] 图吧工具箱
[Windows] 图吧工具箱 链接:https://pan.xunlei.com/s/VOMCXYDix3pvwdkU7w7bfVsDA1?pwdk8v5# DIY爱好者的必备工具...
Docker镜像迁移方案
Docker镜像迁移方案 文章目录 Docker镜像迁移方案一:背景二:操作方式三:异常原因参考: 一:背景 比如机器上已经有先有的容器,但是docker pull的时候是失败的二:操作方式 1、停止正在运行的容器…...
1264. 动态求连续区间和-acwing -树状数组
原题链接:1264. 动态求连续区间和 - AcWing题库 给定 n 个数组成的一个数列,规定有两种操作,一是修改某个元素,二是求子数列 [a,b] 的连续和。 输入格式 第一行包含两个整数 n 和m,分别表示数的个数和操作次数。 第…...
三分钟读懂微服务
一、什么是微服务 微服务,简单来说,就是把一个庞大复杂的软件系统,拆分成一个个小型的、独立的服务模块。打个比方,一个大型商场就如同传统的单体架构软件系统,里面所有的店铺、设施都紧密关联在一起。而微服务架构下…...
【AIGC】图片变视频 - SD ComfyUI视频生成
效果图 完整过程 SD ComfyUI 下载 下载 https://pan.quark.cn/s/64b808baa960 解压密码:bilibili-秋葉aaaki 完整 https://www.bilibili.com/video/BV1Ew411776J/ SD ComfyUI 安装 1.解压 2.将controlnet内部文件复制到 ComfyUI-aki-v1.6\ComfyUI\models\control…...
JVM详解(包括JVM内存模型与GC垃圾回收)
📖前言: 学会使用Java对于一个程序员是远远不够的。Java语法的掌握只是一部分,另一部分就是需要掌握Java内部的工作原理,从编译到运行,到底是谁在帮我们完成工作的? 接下来着重对Java虚拟机,也就…...
cocos creator 笔记-路边花草
版本:3.8.5 实现目标:给3d道路生成路边景观花草 在场景下创建一个节点,我这里种植两种花草模型,兰花和菊花,所以分别在节点下另创建两个节点,为了静态合批。 1.将花草模型分别拖入场景中,制作…...
在shell脚本内部获取该脚本所在目录的绝对路径
目录 需求描述 方法一:使用 dirname 和 readlink 命令 方法二:使用 BASH_SOURCE 变量 方法三:仅使用纯 Bash 实现 需求描述 工作中经常有这样情况,需要在脚本内部获取该脚本自己所在目录的绝对路径。 假如有一个脚本/a/b/c/…...
Qt 线程类
线程类 这些类与线程应用程序相关。 Concurrent Filter and Filter-Reduce 并行地从序列中选择值并组合它们 Concurrent Map and Map-Reduce 并行地从序列中转换值并组合它们 Concurrent Run 在单独线程中运行任务的简单方法 Concurrent Task 在独立线程中运行任务的可…...
Langchain中的表格解析:RAG 和表格的爱恨情仇
实现 RAG(Retrieval-Augmented Generation)是一个挑战,尤其是在有效解析和理解非结构化文档中的表格时。这在处理扫描文档或图像格式的文档时尤为困难。这些挑战至少包括以下三个方面: 1.表格的“叛逆期”:不准确的解析可能会破坏表格结构: 表格在文档里就像个叛逆的青少…...
神奇的闹钟(算法题)
神奇的闹钟 题目 原题 小蓝发现了一个神奇的闹钟,从纪元时间(19701970 年 11 月 11 日 00:00:0000:00:00)开始,每经过 xx 分钟,这个闹钟便会触发一次闹铃 (纪元时间也会…...
CAT1模块 EC800M HTTP 使用后续记录
记录一下 CAT1 模块EC800 HTTP 使用后续遇到的问题 by 矜辰所致目录 前言一、一些功能的完善1.1 新的交互指令添加1.2 连不上网络处理 二、问题出现三、分析及解决3.1 定位问题3.2 问题分析与解决3.2.1 查看变量在内存中的位置 3.3 数据类型说明3.3.1 常用格式化输出符号…...
Python 标准库与数据结构
Python的标准库提供了丰富的内置数据结构和函数,使用这些工具能为我们提供一套强有力的工具。 需要注意的是,相比C与Java,Python的一些特点: Python不需要显式声明变量类型Python没有模板(Template)的概念,因为Pytho…...
NIO入门
IO和NIO的区别: IO:通过流处理数据,仅支持阻塞IO。 核心组件:InputStream /OutputStream用于字节的读写,Reader / Writer:用于字符流的读写。读取过程中无法被中断,是阻塞式IO。 NIO:通过管道处…...
leetcode 用队列模拟栈
这个其实只需要一个队列就可以的,但是我这里用的是2个队列进行替换, 先转n-1个到空的队列, 然后在此基础上进行队列的互换,把剩下的那一个元素所在的队列进行poleft操作就可以了。 class MyStack:def __init__(self):self.q1_i…...
spring security 使用的过滤器还是拦截器
spring security 使用的过滤器还是拦截器 Spring Security 是一个强大的安全框架,用于保护 Java 应用程序。它主要使用过滤器(Filters)来实现安全功能,而不是拦截器(Interceptors)。不过,它也提…...
大疆上云api介绍
概述 目前对于 DJI 无人机接入第三方云平台,主要是基于 MSDK 开发定制 App,然后自己定义私有上云通信协议连接到云平台中。这样对于核心业务是开发云平台,无人机只是其中一个接入硬件设备的开发者来说,重新基于 MSDK 开发 App 工作量大、成本高,同时还需要花很多精力在无人…...
2025-03-25 Unity 网络基础4——TCP同步通信
文章目录 1 Socket1.1 Socket 类型1.2 构造 Socket1.3 常用属性1.4 常用方法 2 TCP 通信2.1 服务端配置2.2 客户端配置2.3 进行通信2.4 多设备通信 3 区分消息 1 Socket Socket 是 C# 提供的网络通信类(其它语言也有对应的 Socket 类),是…...
