背景
之前写了一些知识库的文章,最后试用了dify,想着前端dify+企业自己的向量数据,随时可以切换前端应用,觉的很香。有些朋友向我案例ragflow。
试用完以后我发现,我想复杂了,定制企业向量数据库,ragflow完全能够满足,简单调整下,成本最低。功能实在是太强大了.
🌟 主要功能
🍭 “Quality in, quality out”
- 基于 深度文档理解,能够从各类复杂格式的非结构化数据中提取真知灼见。
- 真正在无限上下文(token)的场景下快速完成大海捞针测试。
🍱 基于模板的文本切片
- 不仅仅是智能,更重要的是可控可解释。
- 多种文本模板可供选择
🌱 有理有据、最大程度降低幻觉(hallucination)
- 文本切片过程可视化,支持手动调整。
- 有理有据:答案提供关键引用的快照并支持追根溯源。
🍔 兼容各类异构数据源
- 支持丰富的文件类型,包括 Word 文档、PPT、excel 表格、txt 文件、图片、PDF、影印件、复印件、结构化数据、网页等。
🛀 全程无忧、自动化的 RAG 工作流
- 全面优化的 RAG 工作流可以支持从个人应用乃至超大型企业的各类生态系统。
- 大语言模型 LLM 以及向量模型均支持配置。
- 基于多路召回、融合重排序。
- 提供易用的 API,可以轻松集成到各类企业系统。
🔎 系统架构
安装
硬件要求
- CPU >= 4 核
- RAM >= 16 GB
- Disk >= 50 GB
- Docker >= 24.0.0 & Docker Compose >= v2.26.1
软件要求:
vm.max_map_count
不小于 262144,这个是针对linux
下载代码
我们看下docker目录中的文件,主要关注圈中的3块
.env
主要是docker部署的时候一些变量,service_conf.yaml.template
是服务启动使用的配置文件- 需要注意的是,在mac操作系统下,会引入
2
镜像tag | 镜像大小(GB) | 是否有向量模型? | 是否稳定版版? |
v0.16.0 | ≈9 | ✔️ | 稳定 |
v0.16.0-slim | ≈2 | ❌ | 稳定 |
nightly | ≈9 | ✔️ | 不稳定,每晚构建 |
nightly-slim | ≈2 | ❌ | 不稳定,每晚构建 |
关键参数
.env
文件
需要注意的是.env
文件修改后,对应的service_conf.yaml.template
配置中一些默认值也得改变。比如我们改了redis的端口,
拉取镜像
如果拉不到,网络不稳定,替换国内的镜像
启动
我们通过-p指定分组名称,或者在docker-compose.yaml
中添加name: 'ragflow'
等一会,安装过程只遇到了端口冲突的问题,修改下端口即可。
通过docker ps
或docker desktop 软件查看启动状态。
登录
点击docker desktop或者http://localhost:8002/
就进入了登录注册界面。
上来是没有账户的,我们先点击注册一个,然后登录。
基本设置
登录进来以后,我们先将右上角的1
设置为简体中文,然后点击2
我们主要关注1
模型供应商和3
团队即可。可以通过2
查看系统的资源概况,以及任务数。
点击1
我们开始添加模型
模型配置
官方默认推荐通义,应该是合作了,我们添加本地ollama
和刚充值的热乎的deepseek
.
本地Ollama 模型配置
在ragflow
中,ollama的模型类型可以选择4个,其实也就比dify多了一个reran模型,
通过ollama listt
查看模型列表,然后添加两个一个chat模型,一个embedding模型。
最大token我们通过ollama show deepseek-r1:32b
获取后填入。然后保存。
报错了了,一看cudaMalloc failed: out of memory
,一看内存81%了,空余12g的内存竟然不够用。赶紧关一些软件。
然后再保存。成功。然后点击添加向量模型。
添加DeepSeek
很简单,就填写一个api-key就行了。
系统模型配置
选择相应的模型即可。
团队
我点击右上角的邀请,填写用户邮箱,点击确定。提示用户不存在。
我猜测,应该是注册制,注册以后再邀请进团队。
然后角色是Invite
,时间也有问题。应该是数据库的时区的问题。在.env
中TIMEZONE配置的是shanghai时区。这个不太影响,下次再看下。
然后我就很好奇,另外一个用户里是什么?我登录了另外一个账户,原来邀请的用户还得同意。
同意以后,还可以退出。我再切换到原来的账户里,
发现角色变成了Normal
需要注意的是,团队共享了知识库,但是聊天助理并没有共享,模型也没有共享。
不过想想也对,创建的应用可以通过api分享,出来,共用的功能,设置都不需要邀请用户。知识反而是核心。我的理念和他好像。哈哈。
功能概述
从面板上看,就几个功能。还是很清晰,它的模板特别少,在创建agent的时候可以选择。
知识库
创建知识库
点击创建知识库,填写名称,点确定即可。
这个时间反而是准的。
知识库配置
配置
- 点击
1
的配置, - 我们可以指定文档语言
2
- 也可以设置这个知识库的权限
3
- 可以自定义解析方法
4
,而且每个解析方法后面都有对应的示例说明。是不是用它内置的向量模型会更好一些?
分段标识符,支持多字符作为分隔符,这对复杂格式的文档,也太友好了。还能有布局识别和OCR功能。
知识上传(数据集)
在ragflow
中上传的在数据集模块里。
ragflow
的知识库,只支持和上传文件或s3同步。同时可以一次上次多个知识。提示也很友好严禁上传公司数据或其他违禁文件
。
上传以后不会自动解析,需要手动点击。
可以通过1
单个解析,也可以通过勾选多个,批量解析。
默认规则下,解析速度还行,清华大学第一弹
一共104页,解析了110秒。
然后看了下分段效果。点开一看,太强大了
图片内容也解析出来了。《清华大学第四弹》的内容。
我没有使用ocr呀,这个后续再研究。
还有表格的识别。
检索测试
随便问一下,这检索效果,真棒。而且返回速度特别快。
文件管理
上传的文件在文件管理里面。
聊天
创建聊天
- 点击新建助手
- 显示引文
3
- 关键词分析
4
开启。应用 LLM 分析用户的问题,提取在相关性计算中要强调的关键词。 - 知识库可以选择多个
5
提示引擎默认即可,不用动。
在模型设置里,主要是最大token数,默认512太小了,最大设置为8192
使用
- 我们选择小助手
1
,点击2
- 直接在
3
输入问题,同时也可以再上传任何文件。回答效果,有些图片里的内容都找到并填了进去。
后记
简单的试用了下ragflow,突然感觉dify不香了。后续我得好好的深入研究下。
之前在聊一个问题,dify分享出去以后谁都可以用,如果在玩一些有趣的东西的时候,会…
前端方案: 修改前端接口调用
我在浏览器检查模式下查看接口调用的时候,发现接口http://10.1.0.65:8001/console/api/apps?page=1&limit=30&name=&is_created_by_me=false
发现有个一个参数 is_created_by_me。
从字面上看,就是是否只查询自己的,既然怀疑了,那就动手试一下,我在dify中新添加一个账户。
进去以后能看到全部。
在Edge浏览器下,我右键1
,编辑并重新发送2
,我把参数值改为true3
,通过4
我们可以看到请求值已经改变了,通过5
,可以看到返回的数据为空。
然后我又看了下其他的接口发现两个接口
-
console/api/workspaces/current
返回值有一个normal
的
-
console/api/account/profile
返回的是个人信息角色
同时,在dify的工作室,我们通过标签查询
那我们可以怎么做?
- 修改前端调用,非管理员的,只能调用自己的
- 定制前端界面,可以通过角色控制和标签控制,比如我们建一个公共的标签,前端完全可以控制。
后端方案
通过tags_ids
去查,总感觉别扭,数据少了还行,数据多了,在生产上就是找事。我就翻下dify的数据库。
连接dify的数据库
我们在部署dify的时候有个.env
文件,这里有pg数据库的
使用Navicat Premium Lite
连接数据库
在apps表中,我发有一个is_public和created_by
在dify的数据库里,我们可以很明显的看到一个apps
表,打开表以后,我们可以看到两列is_public
和created_by
。那代码里有没有使用呢?我们翻下代码。
不得不说dify
的代码结构还是很规范的,根据接口console/api/apps
,我们能很轻松的找到对应的接口实现,然后没有看到我关注的is_public
字段。
我再翻下更新接口的代码,
在代码里并没有对is_public
的操作。看来这个是商业版的功能或者是未来开放的功能。
前后端加上这个字段难度不大。
我们可以直接在这里根据用户的角色进行改造。在对应的表tenant_account_joins
可以设置新的角色,然后在代码里进行处理。
ChatFlow中添加权限
先画个简单的流程图。
新建一个Chatflow流程。
在chatFlow中有一个会话变量,用于存储会话中的上下文,也就是只要你一直在同一个会话,就可以保存着。
点击1
,然后点击2
,添加变量loginStatus
变量,1登录成功,0是未登录。
登录成功后我们进行变量赋值,把loginStatus
变量设置为1。整体流程如下:
- 我们可以把工作流发布成一个自定义工具
1
用户输入问题2
先校验用户的状态,如果已经登录直接到7
,未登录到3
3
校验用户有无填写密钥,填写则到4
4
通过http校验用户有无权限,有权限到5
,无权限,直接回复5
有权限流转到6
,6
设置变量loginStatus为1
,然后流转到工作流7
后记
- dify的代码很规范,对于经验丰富的开发者来说,没有文档也能快速入手
- dify是很灵活的,社区的资源也很丰富
- 我使用的是
2025-02-21
从github上拉下来的代码