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

Dify-7: RAG 知识系统

RAG(检索增强生成)知识系统是 Dify 的核心组件,支持 AI 应用检索和利用外部知识。该系统管理从文档摄入到知识检索的全流程,支持不同索引技术、文档处理方法和检索策略。

RAG 知识系统采用 提取 - 转换 - 加载(ETL) 三阶段管道处理文档,并结合复杂的检索机制实现知识访问。

数据集管理

数据集结构

数据集是 RAG 知识系统的基本组织单元,每个数据集包含文档,文档被分割为段(segment)以进行索引和检索。

  • Dataset:作为 RAG 系统的顶层元数据管理单元,存储与 “文档集合” 相关的配置信息,是整个检索流程的基础配置入口。
数据集字段类型说明
idstring唯一标识符
namestring数据集名称
descriptionstring数据集描述
indexing_techniquestring索引技术(high_quality/economy
embedding_modelstring嵌入模型名称
embedding_model_providerjson嵌入模型提供商配置
retrieval_modeljson检索模型的配置参数(如相似度阈值、top-k 数量)
built_in_field_enabledboolean是否启用内置字段(如文档的 namedoc_form)。若启用,检索时会同时基于内置字段和内容。
  • Document:管理原始文档的基础信息,记录文档的 “物理属性” 和状态(如是否可用、是否完成索引)。
文档字段类型说明
idstring唯一标识符
dataset_idstring所属数据集 ID
namestring文档名称
doc_formstring文档形式(text_model/qa_model/hierarchical_model
indexing_statusstring索引状态
word_countint文档字数统计
enabledbool是否启用(true/false)。若为 false,文档不会参与检索
archivedbool是否归档
  • DocumentSegment:存储文档拆分后的 “基础处理单元”,是 RAG 中生成嵌入向量(Embedding)的最小单位
文档片段字段类型作用
idstring片段的全局唯一标识(UUID),用于关联 ChildChunk 的 segment_id
document_idstring所属文档的 id(外键),表示该片段来自哪个文档。
dataset_idstring所属数据集的 id(外键),与文档的 dataset_id 一致(保证数据一致性)。
contentstring片段内容(原始文本,如 “空调的额定电压为 220V…”),是生成嵌入向量的核心输入。
answerstring预生成答案(可选,如 “空调额定电压 220V”),用于直接返回给用户(若检索到该片段)。
statusstring处理状态(如 “pending” 等待处理、“processed” 已生成向量、“error” 失败),用于跟踪片段处理进度。
enabledbool是否启用。若为 false,该片段不会参与检索(即使已生成向量)。
index_node_idstring向量数据库中的节点 ID(如 Weaviate 的 _id),用于关联向量数据(检索时通过此 ID 定位向量)。
index_node_hashstring向量节点的哈希值(如 SHA-256),用于校验向量数据是否与 content 一致(防止数据篡改)。
  • ChildChunk:存储片段进一步拆分后的 “更细粒度单元”,当 Segment 内容过长(如超过嵌入模型的最大 token 限制),需拆分为多个 ChildChunk 分别生成向量。
子块表字段类型作用
idstring子块的全局唯一标识(UUID)。
segment_idstring所属片段的 id(外键),表示该子块来自哪个 Segment。
contentstring子块内容,用于生成更细粒度的向量。
statusstring处理状态(如 “pending” 等待处理、“embedded” 已生成向量、“failed” 失败)。
index_node_idstring向量数据库中的节点 ID(与 Segment 的 index_node_id 逻辑一致),用于关联子块向量。
index_node_hashstring子块向量的哈希值,用于校验数据一致性(与 Segment 的 index_node_hash 逻辑一致)。
数据集创建

通过 API 创建数据集时需传入名称、描述、索引技术和检索配置等参数:

POST /datasets  

创建流程:

  1. 参数校验
  2. 创建数据集记录
  3. 配置嵌入模型(如需高质量索引)
  4. 设置检索配置
  5. 权限初始化

索引技术

系统支持两种核心索引技术:

技术说明向量数据库嵌入模型应用场景
high_quality基于嵌入模型将文本转为向量必需必需语义理解更强,处理复杂查询
economy基于关键词的倒排索引无需无需低资源消耗,精确关键词匹配

文档形式

文档可通过三种形式处理和索引:

形式说明索引方法
text_model直接嵌入全文的默认文本形式直接嵌入文档内容
qa_model问答对形式生成问答对并嵌入问题
hierarchical_model父子块分层结构创建包含父子块的层级结构

文档处理管道

处理管道遵循 ETL(提取 - 转换 - 加载) 模式:

high_qualityeconomy是否上传文档运行索引索引技术提取内容清洗/分段/格式化保存段到数据库创建关键词索引是否高质量索引?生成嵌入并保存到向量数据库跳过向量索引更新文档状态返回完成状态

提取阶段(Extract)

处理不同数据源,将不同来源内容标准化为统一文本格式:

  • 上传文件:解析 PDF、DOCX 等格式
  • Notion 导入:提取 Notion 页面内容
  • 网站爬取:提取爬取的网页内容
转换阶段(Transform)

处理步骤:

  1. 文本清洗:按规则去除空格、URL、邮箱等
  2. 分段:按配置规则将文档分割为块
    • 分隔符(默认:\n\n
    • 最大令牌数(默认:1024)
    • 块重叠令牌数(默认:50)
  3. 格式化:根据文档形式(文本 / 问答 / 分层)准备索引数据

关键的分段参数:

  • 分隔符:用于分割文本的字符序列(默认值:\n\n)
  • 最大令牌数:每个文本段的最大令牌数量(默认值:1024)
  • 块重叠:文本段之间的令牌重叠数量(默认值:50)
加载阶段(Load)

加载阶段:

1. 将文本段保存到数据库中;2. 为所有文档创建关键词索引;
3. 对于高质量索引,生成嵌入向量并将其存储到向量数据库中。

处理步骤:

  1. 为文本段创建数据库记录;
  2. 使用已配置的嵌入模型生成文本嵌入向量;
  3. 构建搜索索引(关键词索引和 / 或向量索引)。

检索系统

检索系统负责根据用户查询从索引数据集中查找相关信息。

检索方法
方法说明依赖优势
语义搜索基于向量相似度查找语义相关内容嵌入模型、向量数据库适合基于含义的查询
关键词搜索精确关键词匹配关键词索引适合精确术语搜索
全文搜索基于全文索引技术全文索引平衡查准率与查全率
混合搜索结合多种方法所有索引综合性能最优
检索策略

支持两种核心策略:

  1. 单数据集检索:使用单个数据集和 AI 模型路由查询
  2. 多数据集检索:跨多个数据集搜索,支持权重和评分配置

结果处理
  1. 格式化为文档上下文
  2. (可选)使用重排序模型重新排序
  3. 按相关性阈值过滤和评分
  4. 按相关性排序并返回调用方

与工作流集成

RAG 系统通过 知识检索节点 与 Dify 工作流系统集成:

API 集成

服务 API 端点

RAG 知识系统提供了 RESTful API,以便与客户端应用程序集成:

端点方法描述
/datasetsPOST创建一个新的数据集
/datasetsGET列出可用的数据集
/datasets/{dataset_id}GET获取数据集详情
/datasets/{dataset_id}POST更新数据集设置
/datasets/{dataset_id}DELETE删除一个数据集
/datasets/{dataset_id}/document/create-by-textPOST从文本创建文档
/datasets/{dataset_id}/document/create-by-filePOST从文件创建文档
/datasets/{dataset_id}/documents/{document_id}/update-by-textPOST通过文本更新文档
控制台 API 端点

对于控制台内部使用,还存在以下额外的端点:

端点方法描述
/console/datasets多种控制台的数据集管理
/console/datasets/{dataset_id}/documents多种文档管理
/console/datasets/{dataset_id}/documents/{document_id}/segments多种文本段管理

速率限制与资源配额

系统实施了速率限制和配额强制管理措施,尤其是在云部署环境中:

知识检索速率限制

知识检索操作会实施速率限制:

knowledge_rate_limit = FeatureService.get_knowledge_rate_limit(tenant_id)
if knowledge_rate_limit.enabled:current_time = int(time.time() * 1000)key = f"rate_limit_{tenant_id}"redis_client.zadd(key, {current_time: current_time})redis_client.zremrangebyscore(key, 0, current_time - 60000)request_count = redis_client.zcard(key)if request_count > knowledge_rate_limit.limit:
资源限制

系统对各种资源实施了限制措施:

资源描述限制实施点
向量空间限制嵌入存储量在创建文档 / 进行索引期间
文档限制文档数量在上传文档期间
知识检索速率限制检索频率在进行知识检索期间
http://www.xdnf.cn/news/990127.html

相关文章:

  • 什么是项目进度管理?项目进度管理有哪些核心功能?
  • LLM 系列(二) :基础概念篇
  • 力扣-347.前K个高频元素
  • 控制器轨迹生成
  • 编程项目学习,怎么快速掌握
  • 菜鸟带新鸟--EPlan2022创建自己的标识字母
  • 创建和运行线程
  • *res = append(*res, temp) 为什么要使用 temp 作为临时存储值
  • Hydra 工具小白入门教程指导篇
  • 18.进程间通信(四)
  • Python_day51
  • Future与CompletableFuture:异步编程对比
  • v4l2_subdev 与 /dev/videoX 的关联
  • Git不能更新以及提交代码,提示链接超时,本地凭证无问题
  • 6.11 MySQL面试题 日志 性能 架构
  • 深入理解TCP以及三次握手与四次挥手
  • 面对多个项目并行,协作机制如何建立?
  • Java 8 Stream 流详细教程 - 全面指南
  • 重塑未来的力量:人工智能的技术演进与产业变革
  • git的5种分支分别是干嘛的,git常用指令
  • git的常用方法
  • 交换机上抓包
  • 大模型与人工智能
  • 了解shell中的Fork炸弹
  • Java并发编程实战 Day 17:CompletableFuture高级应用
  • 种子音乐携手RBW 精心打造Solar颂乐首支中文单曲《Floating Free》
  • 单端的时钟阻抗设置为50欧姆,差分的时钟阻抗设置为100欧姆
  • echarts 地图 海南省全岛完整展示
  • Vuex 中Mutation 和Action介绍
  • Android SDK Manager 2025镜像,亲测好用