7.1 Dify介绍

Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务(Backend as Service) 的理念,使开发者可以快速搭建生产级的生成式 AI 应用。即使你是非技术人员,也能参与到 AI 应用的定义和数据运营过程中。

由于 Dify 内置了构建 LLM 应用所需的关键技术栈,包括对数百个模型的支持、直观的 Prompt 编排界面、高质量的 RAG 引擎、稳健的 Agent 框架、灵活的流程编排,并同时提供了一套易用的界面和 API。这为开发者节省了许多重复造轮子的时间,使其可以专注在创新和业务需求上。

1.大模型接入

在 Dify 中,我们按模型的使用场景将模型分为以下3类:

  1. 系统推理模型。 在创建的应用中,用的是该类型的模型。智聊、对话名称生成、下一步问题建议用的也是推理模型。
  2. Embedding 模型。在知识库中,将分段过的文档做 Embedding 用的是该类型的模型。在使用了知识库的应用中,将用户的提问做 Embedding 处理也是用的该类型的模型。
  3. 语音转文字模型。将对话型应用中,将语音转文字用的是该类型的模型。

在 Dify 的 设置 > 模型供应商 中设置要接入的模型。

模型使用:

2.应用类型

Dify 中提供了五种应用类型:

  • 聊天助手:基于 LLM 构建对话式交互的助手
  • 文本生成应用:面向文本生成类任务的助手,例如撰写故事、文本分类、翻译等
  • Agent:能够分解任务、推理思考、调用工具的对话式智能助手
  • 对话流:适用于定义等复杂流程的多轮对话场景,具有记忆功能的应用编排方式
  • 工作流:适用于自动化、批处理等单轮生成类任务的场景的应用编排方式

3.工作流

工作流通过将复杂的任务分解成较小的步骤(节点)降低系统复杂度,减少了对提示词技术和模型推理能力的依赖,提高了 LLM 应用面向复杂任务的性能,提升了系统的可解释性、稳定性和容错性。

Dify 工作流分为两种类型:

  • Chatflow:面向对话类情景,包括客户服务、语义搜索、以及其他需要在构建响应时进行多步逻辑的对话式应用程序。
  • Workflow:面向自动化和批处理情景,适合高质量翻译、数据分析、内容生成、电子邮件自动化等应用程序。

节点是工作流中的关键构成,通过连接不同功能的节点,执行工作流的一系列操作。

  • 开始(Start):定义一个 workflow 流程启动的初始参数。
  • 结束(End):定义一个 workflow 流程结束的最终输出内容。
  • 大语言模型(LLM):调用大语言模型回答问题或者对自然语言进行处理。
  • 知识检索(Knowledge Retrieval):从知识库中检索与用户问题相关的文本内容,可作为下游 LLM 节点的上下文。
  • 问题分类(Question Classifier):通过定义分类描述,LLM 能够根据用户输入选择与之相匹配的分类。
  • 条件分支(IF/ELSE):允许你根据 if/else 条件将 workflow 拆分成两个分支。
  • 代码执行(Code):运行 Python / NodeJS 代码以在工作流程中执行数据转换等自定义逻辑。
  • 变量聚合(Variable Aggregator):将多路分支的变量聚合为一个变量,以实现下游节点统一配置。
  • 循环(Loop):循环节点用于执行依赖前一轮结果的重复任务,直到满足退出条件或达到最大循环次数。

4. 知识库

知识库功能将 RAG 上的各环节可视化,提供了一套简单易用的用户界面来方便应用构建者管理个人或者团队的知识库,并能够快速集成至 AI 应用中。

开发者可以将企业内部文档、规范信息等内容上传至知识库进行结构化处理,供后续 LLM 查询。

  1. 创建知识库。通过上传本地文件、导入在线数据或创建一个空的知识库。
  2. 指定分段模式。该阶段是内容的预处理与数据结构化过程,长文本将会被划分为多个内容分段。你可以在此环节预览文本的分段效果。
  3. 设定索引方法和检索设置。知识库在接收到用户查询问题后,按照预设的检索方式在已有的文档内查找相关内容,提取出高度相关的信息片段供语言模型生成高质量答案。
  4. 完成上传,在应用内关联知识库并使用

5.dify的安装

在安装 Dify 之前,请确保您的机器满足以下最低系统要求:

  • CPU >= 2 Core
  • RAM >= 4 GiB

5.1 安装 WSL(Windows Subsystem for Linux)

参考learn.microsoft.com/zh-cn/windo…

  1. 启用 WSL 打开具有管理员权限的 PowerShell,运行以下命令以安装 WSL:
wsl --install

安装完成后,重启电脑以完成配置。

  1. 选择 Linux 发行版 如果直接运行 wsl.exe --install -d ubuntu 报错,可以通过 Microsoft Store 搜索 "Linux" 并选择合适的 Ubuntu 版本进行安装。安装完成后,系统会提示你设置用户名和密码。

5.2 安装 Docker Desktop

  1. 下载 Docker Desktop 前往 Docker 官方文档 下载适用于 Windows 的 Docker Desktop。
  2. 安装并配置 Docker 根据安装向导完成 Docker 的安装,并确保启用了 WSL 2 后端支持。这将允许 Docker 在 WSL 环境中无缝运行。

5.3 安装dify环境

1. 下载dify项目压缩包

可以克隆也可以直接下载

2、进入项目根目录找到docker文件夹

3、.env文件重命名

4、右键打开命令行

5、运行docker环境
docker compose up -d

5.4 启动dify

在浏览器地址栏输入即可安装:

http://127.0.0.1/install

首次登录需进行注册:

dify的主界面如下所示:

6.docker介绍【扩展】

6.1. Docker介绍

1.1 什么是虚拟化

在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如:服务器、网络、内存、存储等等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原来的组态更好的方式来应用这些资源,这些资源的核心虚拟部分是不受现有资源的架设方式,低于或者物理组态所限制,一般所指的虚拟化资源包括计算能力和资料存储。

在实际的生产过程中,虚拟化技术主要是用来解决高性能的物理硬件产能过剩和老的硬件产能过低的重用重组,透明化底层物理硬件,从而最大化的利用物理硬件,对资源充分利用

虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip),桌面虚拟化、服务虚拟化、虚拟机等等。

虚拟化简单讲,就是把一台物理计算机虚拟成多台逻辑计算机,每个逻辑计算机里面可以运行不同的操作系统,相互不受影响,这样就可以充分利用硬件资源

1.2 初识Docker

l Docker是一个开源的**应用容器引擎**

诞生于2013年初,基于Go语言实现,dotCloud公司出品(后改名为Docker Inc)

l Docker可以让开发者打包他们的应用以及依赖包到一个**轻量级,可移植的容器中**,然后发布到任何流行的linux服务器上

l 容器是完全使用沙箱机制,相互隔离

l 容器性能开销极低

Docker是一种容器技术,解决软件跨环境迁移的问题

1.3 容器与虚拟机的比较

什么是虚拟机

虚拟机是一个计算机系统的仿真,简单来说,虚拟机可以实现在一台物理计算机上模拟多台计算机运行任务。 操作系统和应用共享一台或多台主机(集群)的硬件资源,每台VM有自己的OS,硬件资源是虚拟化的。管理程序(hypervisor)负责创建和运行VM,它连接了硬件资源和虚拟机,完成server的虚拟化。 由于虚拟化技术和云服务的出现,IT部门通过部署VM可以可减少cost提高效率。

VMs也消耗大量系统资源,每个VM不仅运行一个OS的完整copy并且需要所有硬件的虚拟化copy,这消耗大量RAM和CPU。相比单独计算机,VM是比较经济的,但对于一些应用VM是过度浪费的,需要容器。

什么是容器

容器是将操作系统虚拟化,这与VM虚拟化一个完整的计算机有所不同。 容器是在操作系统之上,每个容器共享OS内核,执行文件和库等。共享的组件是**只读**的,通过共享OS资源能够减少复现OS的代码,意味着一台server仅安装一个OS可以运行多个任务。容器是非常轻量的,仅仅**MB**水平并且几秒即可启动。相比容器,VM需要几分钟启动,并且大小也大很多。 与VM相比,容器仅需OS、支撑程序和库文件便可运行应用,这意味你可以在同一个server上相比VM运行2-3倍多的应用,并且,容器能帮助创建一个可移植的,一致的开发测试部署环境。

小结:

特性虚拟机容器
隔离级别操作系统级进程级
隔离策略运行于Hypervisor上直接运行在宿主机内核中
系统资源5-15%0-5%
启动速度慢,分钟级快,秒级
占用磁盘空间非常大,GB-TB级小,KB-MB甚至KB级
并发性一台宿主机十几个,最多几十个上百个,甚至上百上千个
高可用策略备份、容灾、迁移弹性、负载、动态

结论:

与传统的虚拟化相比,Docker优势体现在启动速度快,占用体积小

6.2. Docker与虚拟机的形象比喻

2.1 什么是物理机

2.2 什么是虚拟机

2.3 什么是docker

6.3. Docker组件

3.1 Docker服务端和客户端

Docker****是一个客户端-服务端(C/S)架构程序,Docker客户端只需要向Docker服务端或者守护进程发出请求,服务端或者守护进程完成所有工作返回结果,Docker提供了一个命令行工具Docker以及一整套的**Restful API**,可以在同一台宿主机器上运行Docker守护进程或者客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程

docker引擎是一个c/s结构的应用,主要组件见下图:

Docker使用C/S架构,Client 通过接口与Server进程通信实现容器的构建,运行和发布。client和server可以运行在同一台集群,也可以通过跨主机实现远程通信。

3.2 Docker镜像

Docker 镜像(Image)就是一个只读的模板。例如:一个镜像可以包含一个**完整的操作系统环境**,里面仅安装了 Apache 或用户需要的其它**应用程序**。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用

镜像(Image)就是一堆只读层(read-only layer)的统一视角,也许这个定义有些难以理解,看看下面这张图:

右边我们看到了多个**只读层**,它们重叠在一起。除了最下面一层,其它层都会有一个指针指向下一层。这些层是Docker内部的实现细节,并且能够在docker宿主机的文件系统上访问到。统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。

3.3 Docker容器

Docker 利用容器(Container)来运行应用。容器是从镜像创建的**运行实例**。它可以被**启动、开始、停止、删除**。每个容器都是相互隔离的、保证安全的平台。

可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

创建Container首先要有Image,也就是说Container是通过image创建的。

Container是在原先的Image之上新加的一层,称作**Container layer**,这一层是可读可写的(Image是只读的)。

在面向对象的编程语言中,有类跟对象的概念。类是抽象的,对象是类的具体实现。Image跟Container可以类比面向对象中的类跟对象,Image就相当于抽象的类,Container就相当于具体实例化的对象。

Image跟Container的职责区别:Image****负责APP的存储和分发,Container负责运行APP

结论:

容器 = 镜像 + 读写层。并且容器的定义并没有提及是否要运行容器

7.2 大语言模型微调语料构建

1、模型微调

微调(Fine-tuning)是指在已经预训练好的大规模模型基础上,通过进一步训练来适应特定任务或数据集的过程。这一过程体现了迁移学习的思想,即利用预训练模型在通用数据上学习到的知识,通过微调使其更好地服务于特定的应用场景.

微调的主要步骤:

  1. 选择预训练模型:从现有的大型预训练模型(如BERT、GPT、T5等)中挑选适合任务需求的模型作为基础。
  2. 准备数据集:为特定任务准备高质量的训练和验证数据集,确保数据与目标任务紧密相关。
  3. 调整模型结构 :根据任务需求,可能需要对模型结构进行微调,如增减层数、调整激活函数等。
  4. 设置训练参数:包括学习率、批处理大小、训练轮次等,这些参数将直接影响微调效果。
  5. 开始训练:在选定数据集上迭代训练模型,并观察验证集上的表现,适时调整训练策略。
  6. 评估与部署:使用测试集评估微调后的模型性能,满足要求后即可部署到实际应用中。

以上就是AI模型微调步骤,不管是模型微调和模型训练都少不了模型微调和模型训练需要的数据集。我们知道要想微调和训练模型数据集非常重要。数据集都是靠人工标注或者是通过程序来实现,对非技术人员不太友好,换句话说微调数据集制作门槛就非常高,普通小白是很难上手的。接下来我们就通过dify工作流生成大模型语料。

模型微调的语料形式一般为:

{
    'messages': [
        {'content': '你是当代大儒', 'role': 'system'},
        {'content': '应该怎么学习?', 'role': 'user'},
        {'content': '贤贤易色;事父母,能竭其力;事君,能致其身;与朋友交,言而有信。虽曰未学,吾必谓之学矣。',
         'role': 'assistant'}
    ]
}

2.工作流构成

整个流程实现了开始、文档内容解析、数据处理和、LLM 生成和结束等阶段构成,处理流程如下所示:

我们分别介绍如下:

2.1 开始节点

该节点接收用户输入,是整个工作流程的入口,控制文件类型和核心参数的输入

  • 输入参数:
  • attachments:支持本地/远程 URL 上传文档文件(限制 10MB)
  • systemprompt:必填的系统提示词输入(48 字符限制)

2.2 文档提取器

该节点解析上传文档内容。

  • 注意:不支持 Word 文档,需注意文件格式兼容性

2.3 代码执行节点

该节点进行文本预处理,解决 Dify 平台处理长文本的性能限制,但可能造成信息丢失。

代码内容为:

def main(articleSections: list) -> dict:
    try:
        # 将列表项合并为字符串
        combined_text = "\n".join(articleSections)

        # 截取前800个字符
        truncated_text = combined_text[:800]

        return {
            "result": truncated_text
        }
    except Exception as e:
        # 错误处理
        return {
            "result": ""
        }

2.4 LLM 节点

使用通义千问模型

  • Prompt 设计

  • 系统提示词定义科学家角色和生成规范

  • 动态插入截断后的文本和用户提示词
  • 通过示例强制约束 JSONL 输出格式

## 角色
你是一位LLM大语言模型科学家,参考用户提供的内容,帮助用户构造符合规范的 Fine-tune(微调)数据

## 任务
1. 对于给定的“内容”,你每次回答出 10个通俗“问题”,问题不需要输出。
2. 针对每个“问题”,引用“内容”原文及对内容的合理解释和演绎,做出“解答”
3. 并将“问题”和“解答”整理为规范的JSONL格式

## 要求
1. 问题不要直接引用“内容”,应该贴近当代现实生活;
2. 问题应该是通俗白话,避免“假、大、空”;
3. 答案应忠于原文,对于原文的解释不能脱离原文的主旨、思想;

## 输出规范
1. 输出规范的JSONL,每行一条数据
2. 每条数据应包含一个 message 数组,每个数组都应该包含 role 分别为 system、user 和 assistant 的三条记录
3. 其中 role 为 system 的数据,作为训练中的 systemprompt 格外重要,其 content 使用用户指定的|触发词」
  • 输出要求

  • 每批生成 10 个生活化问题

  • 答案必须基于原文演绎
  • 包含 system/user/assistant 三角色结构

2.5 结束节点

  • 作用:输出最终生成的 JSONL 文本
  • 输出路径:LLM.text → 标准化输出接口

3.测试工作流

执行后输出结果:

具体如下所示:

{"messages": [{"role": "system", "content": "你是一个科普达人"}, {"role": "user", "content": "在宾夕法尼亚州的青蛙溪,孩子们发现了什么神秘的东西?"}, {"role": "assistant", "content": "他们发现了一个神秘的树屋。这个树屋出现在树林里,引起了孩子们的好奇心。"}]}
{"messages": [{"role": "system", "content": "你是一个科普达人"}, {"role": "user", "content": "杰克和安妮在观察树木时注意到了哪些特征?"}, {"role": "assistant", "content": "杰克注意到了糖枫树的粗糙树皮和星形叶子。这些是树木分类的重要特征,糖枫树以其特有的树皮和叶子形状而闻名。"}]}
{"messages": [{"role": "system", "content": "你是一个科普达人"}, {"role": "user", "content": "为什么杰克说他太老了,不能玩假装游戏?"}, {"role": "assistant", "content": "这可能反映了杰克对成长的看法,他认为随着年龄的增长,应该从事更成熟的活动,而不是像小时候那样玩假装游戏。"}]}
{"messages": [{"role": "system", "content": "你是一个科普达人"}, {"role": "user", "content": "杰克和安妮在森林里争吵的原因是什么?"}, {"role": "assistant", "content": "他们争吵的原因是关于是否还适合玩假装游戏。安妮想继续玩,而杰克认为自己已经长大了,不应该再玩这种游戏。"}]}
{"messages": [{"role": "system", "content": "你是一个科普达人"}, {"role": "user", "content": "为什么说今天他们说的不重要了?"}, {"role": "assistant", "content": "这句话意味着,尽管他们之前有分歧,但今天发生的事情超越了他们之前的争执,使得之前的争论变得不再重要。"}]}
{"messages": [{"role": "system", "content": "你是一个科普达人"}, {"role": "user", "content": "安妮为什么说自己是个怪物?"}, {"role": "assistant", "content": "安妮可能在玩一个想象游戏,将自己想象成一个怪物。这是儿童常见的行为,通过角色扮演来探索世界和表达自己。"}]}
{"messages": [{"role": "system", "content": "你是一个科普达人"}, {"role": "user", "content": "杰克和安妮的关系如何?"}, {"role": "assistant", "content": "杰克和安妮是兄妹关系,他们之间有着典型的兄妹互动,包括玩耍、争吵和和解。"}]}
{"messages": [{"role": "system", "content": "你是一个科普达人"}, {"role": "user", "content": "为什么杰克会记录下树木的特征?"}, {"role": "assistant", "content": "杰克可能是在进行一种自然观察或学习活动,记录树木的特征可以帮助他更好地了解自然界,也是科学探索的一部分。"}]}
{"messages": [{"role": "system", "content": "你是一个科普达人"}, {"role": "user", "content": "这个树屋有什么特别之处?"}, {"role": "assistant", "content": "这个树屋是神秘的,它突然出现在树林中,引起了孩子们的极大兴趣。树屋通常与冒险和探索相关联,激发了孩子们的好奇心。"}]}
{"messages": [{"role": "system", "content": "你是一个科普达人"}, {"role": "user", "content": "为什么杰克和安妮会在森林里?"}, {"role": "assistant", "content": "他们可能在进行一次户外探险或自然观察活动。森林是一个充满生物多样性和自然奇观的地方,适合进行学习和探索。"}]}

7.3 Dify接入知识库

RAG(检索增强生成,Retrieval-Augmented Generation)增强检索知识库是一种结合信息检索与生成式人工智能的技术框架,旨在通过动态调用外部知识库提升大语言模型(LLM)回答的准确性、相关性和时效性。其核心在于将传统检索系统与生成模型结合,解决大模型自身训练数据局限性、知识过时及“幻觉”(虚构信息)等问题。

  1. 检索(Retrieval) 根据用户问题,从预构建的知识库(如向量数据库)中检索相关文档或信息片段。知识库通常通过离线处理将文本转换为向量表示并建立索引,支持快速相似度匹配。例如,汽车客服系统可能存储车型参数手册作为知识库,检索时匹配用户问题中的关键词或语义。
  2. 增强(Augmentation) 将检索到的信息整合为上下文,与原始问题一同输入生成模型。这一步骤通过补充外部知识,扩展模型的“记忆”范围,使其能基于最新或专有数据生成回答。例如,医疗诊断场景中,RAG可调用最新医学论文数据辅助生成诊断建议。
  3. 生成(Generation) 大语言模型结合上下文与问题生成最终回答。通过引入检索到的信息,模型输出的准确性显著提升,同时减少虚构内容。例如,企业客服系统利用内部文档生成合规性解答,避免泄露敏感数据。

1 .知识库创建

1.1 选择数据源

点击dify 最上方 知识库,点击创建知识库

进入知识库创建页面,选择数据源,选择导入已有文本。目前文本支持多种数据类型TXT、 MARKDOWN、 MDX、 PDF、 HTML、 XLSX、 XLS、 DOCX、 CSV、 MD、 HTM

选择好本地文档后,点击下一步。

1.2 分段模式

知识库支持两种分段模式:通用模式**与**父子模式。如果你是首次创建知识库,建议选择父子模式。

1.2.1 通用模式

系统按照用户自定义的规则将内容拆分为独立的分段。当用户输入问题后,系统自动分析问题中的关键词,并计算关键词与知识库中各内容分段的相关度。根据相关度排序,选取最相关的内容分段并发送给 LLM,辅助其处理与更有效地回答。

在该模式下,你需要根据不同的文档格式或场景要求,参考以下设置项,手动设置文本的**分段规则**。

  • 分段标识符,默认值为 \n,即按照文章段落进行分块。
  • 分段最大长度,指定分段内的文本字符数最大上限,超出该长度时将强制分段。默认值为 500 Tokens,分段长度的最大上限为 4000 Tokens;
  • 分段重叠长度,指的是在对数据进行分段时,段与段之间存在一定的重叠部分。这种重叠可以帮助提高信息的保留和分析的准确性,提升召回效果。建议设置为分段长度 Tokens 数的 10-25%;

文本预处理规则, 过滤知识库内部分无意义的内容。提供以下选项:

  • 替换连续的空格、换行符和制表符
  • 删除所有 URL 和电子邮件地址

配置完成后,点击“预览区块”即可查看分段后的效果。你可以直观的看到每个区块的字符数。如果重新修改了分段规则,需要重新点击按钮以查看新的内容分段。

1.2.2 父子模式

与**通用模式**相比,父子模式采用双层分段结构来平衡检索的精确度和上下文信息,让精准匹配与全面的上下文信息二者兼得。

其中,父区块(Parent-chunk)保持较大的文本单位(如段落),提供丰富的上下文信息;子区块(Child-chunk)则是较小的文本单位(如句子),用于精确检索。系统首先通过子区块进行精确检索以确保相关性,然后获取对应的父区块来补充上下文信息,从而在生成响应时既保证准确性又能提供完整的背景信息。你可以通过设置分隔符和最大长度来自定义父子区块的分段方式。

例如在 AI 智能客服场景下,用户输入的问题将定位至解决方案文档内某个具体的句子,随后将该句子所在的段落或章节,联同发送至 LLM,补全该问题的完整背景信息,给出更加精准的回答。

  • 子分段匹配查询
  • 将文档拆分为较小、集中的信息单元(例如一句话),更加精准的匹配用户所输入的问题。
  • 子分段能快速提供与用户需求最相关的初步结果。
  • 父分段提供上下文
  • 将包含匹配子分段的更大部分(如段落、章节甚至整个文档)视作父分段并提供给大语言模型(LLM)。
  • 父分段能为 LLM 提供完整的背景信息,避免遗漏重要细节,帮助 LLM 输出更贴合知识库内容的回答。

1.3 索引方法

如搜索引擎通过高效的索引算法匹配与用户问题最相关的网页内容,索引方式是否合理将直接影响 LLM 对知识库内容的检索效率以及回答的准确性。Dify提供“高质量”**与”**经济“ 两种索引方法。

1.3.1 经济模式

在经济模式下,每个区块内使用 10 个关键词进行检索,降低了准确度但无需产生费用。对于检索到的区块,仅提供倒排索引方式选择最相关的区块。

1.3.2 高质量索引

在高质量模式下,使用 Embedding 嵌入模型将已分段的文本块转换为数字向量,帮助更加有效地压缩与存储大量文本信息;使得用户问题与文本之间的匹配能够更加精准

将内容块向量化并录入至数据库后,需要通过有效的检索方式调取与用户问题相匹配的内容块。高质量模式提供向量检索、全文检索和混合检索三种检索设置。

1.4 检索方法

知识库在接收到用户查询问题后,按照预设的检索方式在已有的文档内查找相关内容,提取出高度相关的信息片段供语言模型生成高质量答案。这将决定 LLM 所能获取的背景信息,从而影响生成结果的准确性和可信度。

常见的检索方式包括基于向量相似度的语义检索,以及基于关键词的精准匹配:前者将文本内容块和问题查询转化为向量,通过计算向量相似度匹配更深层次的语义关联;后者通过倒排索引,即搜索引擎常用的检索方法,匹配问题与关键内容。

1.4.1 经济索引

在经济索引方式下,仅提供**倒排索引方式**。这是一种用于快速检索文档中关键词的索引结构,常用于在线搜索引擎。倒排索引仅支持 TopK 设置项。用于筛选与用户问题相似度最高的文本片段。系统同时会根据选用模型上下文窗口大小动态调整片段数量。系统默认值为 3 。数值越高,预期被召回的文本分段数量越多。

1.4.2 高质量索引

在高质量索引方式下,Dify 提供向量检索、全文检索与混合检索设置:

向量检索

向量化用户输入的问题并生成查询文本的数学向量,比较查询向量与知识库内对应的文本向量间的距离,寻找相邻的分段内容。

Rerank 模型: 默认关闭。开启后将使用第三方 Rerank 模型再一次重排序由向量检索召回的内容分段,以优化排序结果。帮助 LLM 获取更加精确的内容,辅助其提升输出的质量。开启该选项前,需前往“设置” → “模型供应商”,提前配置 Rerank 模型的 API 秘钥。

TopK: 用于筛选与用户问题相似度最高的文本片段。系统同时会根据选用模型上下文窗口大小动态调整片段数量。默认值为 3,数值越高,预期被召回的文本分段数量越多。

Score 阈值: 用于设置文本片段筛选的相似度阈值,只召回超过设置分数的文本片段,默认值为 0.5。数值越高说明对于文本与问题要求的相似度越高,预期被召回的文本数量也越少。

TopK 和 Score 设置仅在 Rerank 步骤生效,因此需要添加并开启 Rerank 模型才能应用两者中的设置参数。


全文检索

关键词检索,即索引文档中的所有词汇。用户输入问题后,通过明文关键词匹配知识库内对应的文本片段,返回符合关键词的文本片段;类似搜索引擎中的明文检索。

参数设置与向量检索一致。

混合检索:同时执行全文检索和向量检索,或 Rerank 模型,从查询结果中选择匹配用户问题的最佳结果。

在混合检索设置内可以选择启用 “权重设置” 或 “Rerank 模型”

1.5 知识库

1.5.1 知识库效果

当画面出现嵌入完成,表示文档向量化完成。

1.5.2 分段效果

1.5.3 召回测试

Dify 知识库内提供了文本召回测试的功能,用于模拟用户输入关键词后调用知识库内容区块。召回的区块将按照分数高低进行排序并发送至 LLM。一般而言,问题与内容块的匹配度越高,LLM 所输出的答案也就更加贴近源文档,文本“训练效果”越好。

4 .AI Agent知识库

点击创建空白页面、选择Agent ,给这个Agent 应用一个名字

进入AI Agent画面,再上下文添加已创建好的知识库。

多模型调试

添加完成知识库我们就可以针对这个知识库进行聊天和对话了。

5 .知识库工作流

5.1 创建工作流

点击创建空白页面、选择chatflow ,给这个chatflow 应用一个名字

5.2 添加知识库

进入工作流创造面板中,我们可以在大语言模型中间节点中添加“知识检索”

打开知识检索,我们点击知识库添加引用的知识库

5.3 添加LLM节点

添加完成知识库,我们对接llm大语言模型

上下文 我们选择 知识检索 result

系统提示词这里我们输入如下提示词

请根据文本内容{{#context#}}回答

其他设置都可以默认。

5.4 直接回复

添加直接回复节点

5.5 工作流测试

7.4 Dify接入外部知识库

Dify中的RAG一直被诟病,它的知识库设置不够丰富和灵活,对于不同形式的文档上传,尤其是pdf扫描版,上传识别效果不好,知识库根本回答不了PDF内的内容。为了解决这这些Dify提供了外部知识库API,这样就可以连接到 Dify 之外的知识库并从中检索知识。接下来给大家重点介绍Dify连接RAGFlow外部知识库的内容。

1.ragflow简介

RAGFlow是一款基于**深度文档理解**(deepdoc)构建的开源 RAG引擎。深度文档理解是RAGFlow对文档解析的一个解决方案,它包含两个组成部分:视觉处理和解析器。其中视觉处理是通过OCR,布局识别,表结构识别来完成图像,PDF,表格的识别的。针对PDF、DOCX、EXCEL和PPT四种文档格式,都有相应的解析器。能够从各类复杂格式的非结构化数据中提取信息,文本切片过程可视化,还支持手动调整。支持丰富的文件类型,包括 Word 文档、PPT、excel 表格、txt 文件、图片、PDF、影印件、复印件、结构化数据、网页等。

还集成了各种嵌入模型,rerank模型,提供易用的 API,可以轻松集成到各类企业系统。

安装包镜像完整下载下来,体积非常大,环境要求如下:

  • CPU >= 4 核
  • 运行内存= 16 GB
  • 硬盘 >= 50 GB
  • Docker >= 24.0.0 & Docker Compose>= v2.26.1

2.ragflow的安装方法

2.1 到github下载项目源码

可以克隆也可以直接下载

由于前面我们已经安装了Dify项目,这两个项目都依赖了redis,且web端的端口都是默认80端口,因此,为了避免冲突,我们需要修改配置文件。

2.2 修改web访问默认端口

修改文件位置:docker目录下的docker-compose文件

2.3 修改redis配置

修改.env文件

修改docker-compose-base.yml文件

2.4 启动服务

进入docker目录,右键打开命令行:

输入命令:

docker compose up -d

时间比较久,需要大家耐心等待。

2.5 打开浏览器访问

由于前面,我们把web端口设置为了8880端口,docker镜像拉取后,等待容器启动完成,在浏览器输入:127.0.0.1:8880 即可访问

至此,ragflow就安装完成了,注册完成后主页面如下:

2.6 模型配置

3.ragflow 创建知识库

3.1 知识库创建

创建好知识库,点击ragflow 创建知识库。

3.2 上传文件

我们点击新增加文件。上传我们要解析的私有化知识库文档,然后点击解析完成文档向量化。

可以单个文件解析,也可以批量解析,大家可以根据自己的需要选择使用,解析完成后可进行

3.2 分片方式

进入模型设置界面 选择好嵌入模型和解析方法

  1. General 支持的文件格式为DOCX、EXCEL、PPT、IMAGE、PDF、TXT、MD、JSON、EML、HTML。 此方法将简单的方法应用于块文件:系统将使用视觉检测模型将连续文本分割成多个片段。
  2. Q&A 支持 excel 和 csv/txt 文件格式。 如果文件是 excel 格式,则应由两个列组成 没有标题:一个提出问题,另一个用于答案, 答案列之前的问题列。多张纸是只要列正确结构,就可以接受。 如果文件是 csv/txt 格式 以 UTF-8 编码且用 TAB 作分开问题和答案的定界符。
  3. Resume 支持的文件格式为DOCX、PDF、TXT。 简历有多种格式,就像一个人的个性一样,但我们经常必须将它们组织成结构化数据,以便于搜索。 我们不是将简历分块,而是将简历解析为结构化数据。 作为HR,你可以扔掉所有的简历, 您只需与'RAGFlow'交谈即可列出所有符合资格的候选人。
  4. Manual 仅支持PDF。 我们假设手册具有分层部分结构。 我们使用最低的部分标题作为对文档进行切片的枢轴。 因此,同一部分中的图和表不会被分割,并且块大小可能会很大。
  5. Table 支持EXCEL和CSV/TXT格式文件。
  6. Paper 仅支持PDF文件。 如果我们的模型运行良好,论文将按其部分进行切片,例如摘要、1.1、1.2等。 这样做的好处是LLM可以更好的概括论文中相关章节的内容, 产生更全面的答案,帮助读者更好地理解论文。 缺点是它增加了 LLM 对话的背景并增加了计算成本, 所以在对话过程中,你可以考虑减少‘topN’的设置。
  7. Book 支持的文件格式为DOCX、PDF、TXT。 由于一本书很长,并不是所有部分都有用,如果是 PDF, 请为每本书设置页面范围,以消除负面影响并节省分析计算时间。
  8. Laws 支持的文件格式为DOCX、PDF、TXT。 法律文件有非常严格的书写格式。 我们使用文本特征来检测分割点。 chunk的粒度与'ARTICLE'一致,所有上层文本都会包含在chunk中。

4.ragflow 知识库检索

4.1 创建聊天

聊天窗口界面

聊天窗口配置有3个选项面板(助理设置、提示引擎、模型设置)

助理设置,这里最关键就是 填写助理姓名和选择指定的知识库

提示引擎 如果大家没有 Rerank模型 可以默认不选。

模型设置,这里需要填写选择一个LLM大语言模型作为推理模型使用。

以上设置完成后就可以进行聊天对话了。

以上设置我们完成了ragflow相关设置。

5.ragflow API 设置

接下来我们在dify调用这个ragflow ,需要设置一下ragflow api key.

5.1 获取API

点击系统右上角,选择 API

5.2 获取IP

API 服务器 显示ragflow 对外提供的IP, 我的显示是http://127.0.0.1:8880!

5.3 获取API key

点击上面key生成ragflow 对外提供的API

下面就是ragflow 对外提供的HTTP 请求API接口文档

6.dify配置外部知识库

6.1 dify配置外部知识库

dify 工作流管理界面,点击上面知识库。点击链接外部知识库。

6.2 配置API

击右边的外部知识库API 先把外部知识库API 配置好。

image-20250429181443473

这里我需要添加3个值

1name :随便写一个名字

2 API Endpoint 这个就是和ragflow 整合的地址

RAGflow 对外提供的是192.168.xx.xx 这里填写http://192.168.XX.XXX:9380/api/v1/dify

  1. api key 就是上面ragflow-开头的api KEY

这里的 API Endpoint 的 IP 地址一定是要宿主机网卡上的 IP 地址,不要用 127.0.0.1 或 localhost

6.3 连接知识库

这个外部知识库 ID 如何获取呢?我们回到RAGflow 知识库页面,从url中获取:

点击链接,完成ragflow和dify的链接

到这dify 和ragflow已经连接好了。

7.dify ai agent使用外部知识库

7.1 创建Agent

进入ai Agent 聊天界面,在上下文添加外部知识库。

后面就可以进行知识库检索了,检索的是调用通过工具调用知识库。

到这在dify中调用ragflow中的知识库了。

更多推荐