当前位置: 首页 > article >正文

保姆级教程搭建企业级智能体+私有知识库,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】每日温度

解法一&#xff1a;暴力解法 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&#xff1a; 工作原理&#xff1a;netplan读取位于/etc/netplan/目录下的YAML格式的配置文件&#xff0c;这些配置文件描述了网络接口的配置。netplan会将这些配置文件解析并转换为systemd-ne…...

Cookie、Session 与 Token:核心区别与应用场景解析

目录 引言 基础概念解析&#xff1a;三大身份验证技术详解 Cookie&#xff1a;浏览器中的"身份证" Session&#xff1a;服务器记忆的"对话" Token&#xff1a;加密的"通行证" 三种技术的深度对比分析 存储位置与数据流向 安全性全面对比…...

结合DrRacket学习《如何设计程序,第二版》

如何设计程序语言 DrRacket用于学习程序语言和设计程序语言&#xff0c;如何设计程序手册&#xff1a;How to Design Programs 如何设计程序&#xff0c;第二版&#xff1a;How to Design Programs, Second Edition 系统程序设计 设计师需遵循一系列严谨且系统的步骤&#…...

状态空间模型解析 (State-Space Model, SS)

一、文章摘要 状态空间模型&#xff08;State-Space Model, SS&#xff09;是一种广泛应用于控制系统、信号处理和系统建模的数学表示方式。MATLAB 提供的 ss 类用于描述线性时不变&#xff08;LTI&#xff09;系统的状态空间表示。本类实现了 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端来说有点麻烦&#xff0c;下面我将讲述几种处理流式请求的方式。 1.websocket WebSocket 是处理实时数据流的最佳选择之一&#xff0c;UniApp 提供了原生的 WebSocket 支持&#xff1a; <template><view class"container&…...

代码随想录算法训练营第四十一天|买卖股票专题:121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

动规五部曲牢记于心 1、确定好dp[j]数组&#xff0c;以及下标含义 2、推导出dp[j]公式 3、初始化&#xff0c;关键dp[0][0]、dp[0][1]&#xff0c;第i天&#xff0c;后面的01表示状态&#xff1a;持有、不持有 4、确定遍历顺序&#xff1a; 如果求组合问题&#xff0c;不考虑排…...

AI小白的第七天:必要的数学知识(概率)

概率 Probability 1. 概率的定义 概率是一个介于 0 和 1 之间的数&#xff0c;表示某个事件发生的可能性&#xff1a; 0&#xff1a;事件不可能发生。1&#xff1a;事件必然发生。0 到 1 之间&#xff1a;事件发生的可能性大小。 例如&#xff0c;掷一枚公平的硬币&#xf…...

[Windows] 图吧工具箱

[Windows] 图吧工具箱 链接&#xff1a;https://pan.xunlei.com/s/VOMCXYDix3pvwdkU7w7bfVsDA1?pwdk8v5# DIY爱好者的必备工具...

Docker镜像迁移方案

Docker镜像迁移方案 文章目录 Docker镜像迁移方案一&#xff1a;背景二&#xff1a;操作方式三&#xff1a;异常原因参考&#xff1a; 一&#xff1a;背景 比如机器上已经有先有的容器&#xff0c;但是docker pull的时候是失败的二&#xff1a;操作方式 1、停止正在运行的容器…...

1264. 动态求连续区间和-acwing -树状数组

原题链接&#xff1a;1264. 动态求连续区间和 - AcWing题库 给定 n 个数组成的一个数列&#xff0c;规定有两种操作&#xff0c;一是修改某个元素&#xff0c;二是求子数列 [a,b] 的连续和。 输入格式 第一行包含两个整数 n 和m&#xff0c;分别表示数的个数和操作次数。 第…...

三分钟读懂微服务

一、什么是微服务 微服务&#xff0c;简单来说&#xff0c;就是把一个庞大复杂的软件系统&#xff0c;拆分成一个个小型的、独立的服务模块。打个比方&#xff0c;一个大型商场就如同传统的单体架构软件系统&#xff0c;里面所有的店铺、设施都紧密关联在一起。而微服务架构下…...

【AIGC】图片变视频 - SD ComfyUI视频生成

效果图 完整过程 SD ComfyUI 下载 下载 https://pan.quark.cn/s/64b808baa960 解压密码&#xff1a;bilibili-秋葉aaaki 完整 https://www.bilibili.com/video/BV1Ew411776J/ SD ComfyUI 安装 1.解压 2.将controlnet内部文件复制到 ComfyUI-aki-v1.6\ComfyUI\models\control…...

JVM详解(包括JVM内存模型与GC垃圾回收)

&#x1f4d6;前言&#xff1a; 学会使用Java对于一个程序员是远远不够的。Java语法的掌握只是一部分&#xff0c;另一部分就是需要掌握Java内部的工作原理&#xff0c;从编译到运行&#xff0c;到底是谁在帮我们完成工作的&#xff1f; 接下来着重对Java虚拟机&#xff0c;也就…...

cocos creator 笔记-路边花草

版本&#xff1a;3.8.5 实现目标&#xff1a;给3d道路生成路边景观花草 在场景下创建一个节点&#xff0c;我这里种植两种花草模型&#xff0c;兰花和菊花&#xff0c;所以分别在节点下另创建两个节点&#xff0c;为了静态合批。 1.将花草模型分别拖入场景中&#xff0c;制作…...

在shell脚本内部获取该脚本所在目录的绝对路径

目录 需求描述 方法一&#xff1a;使用 dirname 和 readlink 命令 方法二&#xff1a;使用 BASH_SOURCE 变量 方法三&#xff1a;仅使用纯 Bash 实现 需求描述 工作中经常有这样情况&#xff0c;需要在脚本内部获取该脚本自己所在目录的绝对路径。 假如有一个脚本/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.表格的“叛逆期”:不准确的解析可能会破坏表格结构: 表格在文档里就像个叛逆的青少…...

神奇的闹钟(算法题)

神奇的闹钟 题目 原题 小蓝发现了一个神奇的闹钟&#xff0c;从纪元时间&#xff08;19701970 年 11 月 11 日 00&#xff1a;00&#xff1a;0000&#xff1a;00&#xff1a;00&#xff09;开始&#xff0c;每经过 xx 分钟&#xff0c;这个闹钟便会触发一次闹铃 (纪元时间也会…...

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的标准库提供了丰富的内置数据结构和函数&#xff0c;使用这些工具能为我们提供一套强有力的工具。 需要注意的是&#xff0c;相比C与Java&#xff0c;Python的一些特点&#xff1a; Python不需要显式声明变量类型Python没有模板(Template)的概念&#xff0c;因为Pytho…...

NIO入门

IO和NIO的区别&#xff1a; IO&#xff1a;通过流处理数据&#xff0c;仅支持阻塞IO。 核心组件&#xff1a;InputStream /OutputStream用于字节的读写&#xff0c;Reader / Writer&#xff1a;用于字符流的读写。读取过程中无法被中断&#xff0c;是阻塞式IO。 NIO:通过管道处…...

leetcode 用队列模拟栈

这个其实只需要一个队列就可以的&#xff0c;但是我这里用的是2个队列进行替换&#xff0c; 先转n-1个到空的队列&#xff0c; 然后在此基础上进行队列的互换&#xff0c;把剩下的那一个元素所在的队列进行poleft操作就可以了。 class MyStack:def __init__(self):self.q1_i…...

spring security 使用的过滤器还是拦截器

spring security 使用的过滤器还是拦截器 Spring Security 是一个强大的安全框架&#xff0c;用于保护 Java 应用程序。它主要使用过滤器&#xff08;Filters&#xff09;来实现安全功能&#xff0c;而不是拦截器&#xff08;Interceptors&#xff09;。不过&#xff0c;它也提…...

大疆上云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# 提供的网络通信类&#xff08;其它语言也有对应的 Socket 类&#xff09;&#xff0c;是…...