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

Dify笔记 知识库

一、知识库操作

1、创建知识库

dify支持文档级别的元数据,在知识库添加元数据key,在每个文档上配置对应的key-value元数据。在知识检索节点开启元数据过滤功能,可以实现自定义文档文档过滤

2、添加文件

1、分段设置

选择本地文件上传,设置文档分块方式。在这一步之前,需要对文档进行预处理:

PDF用pdfplumber和PyMuPDF,docx使用python-docx。

根据需求制定分块规则,将原始文档解析、分块,在块之间插入自定义分隔符,比如

$$$$

结果保存为txt或者markdown。

dify上传文本时分段标识符选择自定义分隔符

$$$$

分段最大长度=4000

2、索引方式

选择合适的embedding模型,一般选择bge系列

3、知识库使用

在工作流中设置知识检索节点,并将输出结果作为LLM节点的入参

二、源码分析

1、文件上传

接口:http://127.0.0.1/console/api/files/upload?source=datasets

# api\controllers\console\__init__.py
bp = Blueprint("console", __name__, url_prefix="/console/api")
api = ExternalApi(bp)# File
api.add_resource(FileApi, "/files/upload")

经过条件判断之后,最终执行FileService.upload_file

if source == "datasets" and extension not in DOCUMENT_EXTENSIONS:raise UnsupportedFileTypeError()

可知:dify只支持在DOCUMENT_EXTENSIONS列表的文件拓展名

经过文件名、文件后缀名、文件大小判断之后,调用storage.save将该文件以对应存储方式保存

 # save file to storagestorage.save(file_key, content)

最后,创建UploadFile对象实例,将其保存到数据库。

2、文件处理

根据用户选择的分块、索引方式完成分档分块和向量化

# api\controllers\console\datasets\datasets_document.py
api.add_resource(DatasetDocumentListApi, "/datasets/<uuid:dataset_id>/documents")

验证用户权限, 解析请求参数

KnowledgeConfig -> DocumentService.document_create_args_validate(knowledge_config)

调用 DocumentService.save_document_with_dataset_id,进行文档保存

FeatureService.get_features(...) 专门用于处理与“功能开关”或“特性配置”相关的业务逻辑。

用于进行文档个数校验,默认最大20个

 if knowledge_config.original_document_id:document = DocumentService.update_document_with_dataset_id(dataset, knowledge_config, account)documents.append(document)batch = document.batch

检查是否提供了原始文档 ID;如果有,则调用服务更新该文档的内容与配置

lock_name = "add_document_lock_dataset_id_{}".format(dataset.id)
with redis_client.lock(lock_name, timeout=600):

获取Redis 分布式锁,开启

position = DocumentService.get_documents_position(dataset.id)

为新添加的文档分配一个递增的顺序编号(position),保证文档在知识库中的顺序性。

遍历上传的文件,创建Document对象,document_ids保存文档id。

 document_indexing_task.delay(dataset.id, document_ids)

当所有的规则处理完成以后,会把任务通过document_indexing_task.delay(dataset.id, document_ids)推到队列中。

在tasks目录下,有一个document_indexing_task.py进行异步解析。异步celery task,执行完成后将结果保存到数据库和向量数据库

核心逻辑在IndexingRunner.run

 # api\tasks\document_indexing_task.pyindexing_runner = IndexingRunner()indexing_runner.run(documents)

这里用了模板方法+工厂+策略模式实现

  1. 首先对数据集进行校验,不存在,直接终止

  2. 获取处理规则,没有处理规则也直接终止

  3. 根据索引类型IndexProcessorFactory,获取对应的索引处理器: ParagraphIndexProcessor(通用)QAIndexProcessor(问答)ParentChildIndexProcessor(父子分段)

  4. 获取文档内容_extract,解决了不同文档的差异性

    支持三种数据源类型

    统一返回Document对象列表

    自动更新处理进度

  5. 转换阶段 _transform

    执行文本清洗(根据处理规则)

    分块处理(自定义或自动分块)

    语言处理(国际化支持)

    向量化准备(高质量索引模式)

  6. 分段处理 _load_segments

    使用DatasetDocumentStore管理分段

    支持父子文档结构

    原子化状态更新

  7. 索引构建 _load

    高质量模式:使用嵌入模型并行处理

    经济模式:构建关键词倒排索引

    状态一致性管理

http://www.dtcms.com/a/411531.html

相关文章:

  • 模板建站服务器网页打不开的解决方法
  • 女生做网站前台设置自动删除的wordpress
  • 苏州市吴江太湖新城建设局网站微信手机网站设计6
  • 单片机开发中的队列数据结构详解,队列数据结构在单片机软件开发中的应用详解,C语言
  • 邯郸网站推广wordpress 页面生成
  • 搭建本地代理服务器
  • USB4接口防护,ESD管与TVS管怎么选?-ASIM阿赛姆
  • LazyLLM部署日志
  • 祝贺职业教育网站上线网站的前端和后台
  • 第三人称:角色攻击
  • 怎么理解GO中的context
  • 国内永久免费建站哈尔滨网站设计有哪些步骤
  • 运动控制教学——5分钟学会样条曲线算法!(三次样条曲线,B样条曲线)
  • HTTP 错误 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容——错误代码:0x00000000
  • 备案 多个网站上海网站制作建设是什么
  • 和的区别?
  • 【LLM LangChain】AgentExecutor 创建带工具的Agent+加入BufferMemory+支持多用户记忆 demos
  • 图书馆网站建设教程专业网站建设咨询
  • Qwen2.5 0.5b转换到iree上支持的文件
  • 做网站和平台多少钱网络营销seo是什么
  • Qt常用控件之QCalendarWidget
  • 做金属小飞机的网站怎么做网络推广网站
  • 利用php做网站教程吃货盒子 wordpress
  • 行政事业单位网站建设直播网站如何做
  • 安装xdebug调试工具(docker容器+vscode编辑器+xdebug)
  • 成都seo培训学校济宁网站建设seo
  • SpringBoot邮件发送的5大隐形地雷与避坑实战指南
  • 撼动GPT-5地位?阿里万亿参数Qwen3-Max模型发布,使用教程来了
  • 三亚市住房和城乡建设厅网站防城港网站设计
  • 西安网址开发 网站制作网站后台管理系统设计