数据集服务与文档管理
数据集服务与文档管理
相关源文件
以下文件为本维基页面的生成提供了上下文:
api/controllers/console/app/annotation.pyapi/controllers/console/datasets/data_source.pyapi/controllers/console/datasets/datasets_document.pyapi/controllers/console/datasets/datasets_segments.pyapi/controllers/console/datasets/external.pyapi/controllers/console/datasets/hit_testing.pyapi/controllers/console/datasets/metadata.pyapi/controllers/service_api/app/annotation.pyapi/controllers/service_api/dataset/dataset.pyapi/controllers/service_api/dataset/document.pyapi/controllers/service_api/dataset/metadata.pyapi/controllers/service_api/dataset/segment.pyapi/services/annotation_service.pyapi/services/dataset_service.pyapi/services/entities/knowledge_entities/knowledge_entities.pyapi/services/knowledge_service.pyapi/services/metadata_service.pyapi/tests/test_containers_integration_tests/models/test_conversation_status_count.pyapi/tests/test_containers_integration_tests/services/test_metadata_service.pyapi/tests/unit_tests/controllers/service_api/app/test_annotation.pyapi/tests/unit_tests/controllers/service_api/dataset/test_dataset_segment.pyapi/tests/unit_tests/controllers/service_api/dataset/test_document.pyapi/tests/unit_tests/controllers/web/test_web_login.pyapi/tests/unit_tests/models/test_app_models.pyapi/tests/unit_tests/services/test_annotation_service.pyapi/tests/unit_tests/services/test_batch_indexing_base.pyapi/tests/unit_tests/services/test_knowledge_service.pyapi/tests/unit_tests/services/test_metadata_bug_complete.pyapi/tests/unit_tests/services/test_metadata_nullable_bug.py- [web/app/(commonLayout)/app/(appDetailLayout)/[appId]/layout.tsx](web/app/(commonLayout)/app/(appDetailLayout)/[appId]/layout.tsx)
- [web/app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/layout.tsx](web/app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/layout.tsx)
web/app/components/app-sidebar/basic.tsxweb/app/components/app-sidebar/index.tsxweb/app/components/app/configuration/dataset-config/settings-modal/index.tsxweb/app/components/app/configuration/dataset-config/settings-modal/retrieval-section.tsxweb/app/components/base/qrcode/index.tsxweb/app/components/base/sort/index.tsxweb/app/components/datasets/common/retrieval-method-config/index.tsxweb/app/components/datasets/create/step-two/index.module.cssweb/app/components/datasets/create/step-two/index.tsxweb/app/components/datasets/documents/detail/__tests__/index.spec.tsxweb/app/components/datasets/documents/detail/index.tsxweb/app/components/datasets/documents/detail/settings/__tests__/document-settings.spec.tsxweb/app/components/datasets/documents/detail/settings/document-settings.tsxweb/app/components/datasets/documents/hooks/use-document-list-query-state.tsweb/app/components/datasets/documents/index.tsxweb/app/components/datasets/documents/status-filter.tsweb/app/components/datasets/hit-testing/modify-retrieval-modal.tsxweb/app/components/datasets/metadata/hooks/__tests__/use-batch-edit-document-metadata.spec.tsweb/app/components/datasets/metadata/hooks/use-batch-edit-document-metadata.tsweb/app/components/datasets/metadata/hooks/use-check-metadata-name.tsweb/app/components/datasets/metadata/types.tsweb/app/components/datasets/settings/form/index.tsxweb/models/datasets.tsweb/service/knowledge/use-create-dataset.tsweb/service/knowledge/use-document.ts
本文档介绍了 Dify 中基于 DatasetService、DocumentService 和 SegmentService 类的知识库管理架构。Dify 实现了双 API 架构,通过两个不同的 API 接口暴露相同的底层服务层:
- 控制台 API(
/console/api/datasets/*):面向工作区成员的内部管理接口,用于通过 Dify Web 界面管理数据集。api/controllers/console/datasets/datasets_document.py:214-416。 - 服务 API(
/v1/datasets/*):面向外部开发者的 API,用于通过 API 密钥以编程方式管理数据集。api/controllers/service_api/dataset/dataset.py:145-185。
关于文档索引管线,请参见 4.2 文档索引管线。关于检索策略,请参见 4.3 检索策略与元数据过滤。
来源: api/services/dataset_service.py:121-121 api/controllers/console/datasets/datasets_document.py:1-214 api/controllers/service_api/dataset/dataset.py:1-127
数据集实体模型
Dataset 模型代表一个知识库,包含索引、检索和权限的配置信息。
来源: api/models/dataset.py:38-66 api/services/dataset_service.py:39-54
DatasetService 核心操作
DatasetService 类提供了数据集管理操作的主要接口,包括创建、更新和权限校验。
DatasetService 方法目录
图示:DatasetService 公开方法
关键操作表:
| 方法 | 来源 | 用途 |
|---|---|---|
get_datasets() | api/services/dataset_service.py:121-171 | 列出某个租户的数据集,应用 DatasetPermissionEnum 过滤器。 |
create_empty_dataset() | api/services/dataset_service.py:203-280 | 创建 Dataset 记录,并在适用时处理 ExternalKnowledgeBindings。 |
update_dataset() | api/services/dataset_service.py:415-610 | 更新元数据,并在模型或技术变更时触发 _handle_indexing_technique_change。 |
delete_dataset() | api/services/dataset_service.py:858-900 | 删除数据集记录并触发 dataset_was_deleted 事件。 |
来源: api/services/dataset_service.py:121-900
索引技术切换
当数据集的 indexing_technique 被修改时(例如从 economy 改为 high_quality),DatasetService 会通过触发后台任务来管理这一切换过程。
- 从经济模式切换到高质量模式: 调用
deal_dataset_vector_index_task,使用add动作为现有片段生成嵌入向量。api/services/dataset_service.py:756-764。 - 嵌入向量模型变更: 触发
deal_dataset_vector_index_task,使用update动作对整个数据集重新生成嵌入向量。api/services/dataset_service.py:781-792。
来源: api/services/dataset_service.py:741-840
文档管理生命周期
文档代表单个源文件。其管理由 DocumentService 负责。
文档状态与状态流转
实现细节:
- 创建:
DocumentService.save_document_with_dataset_id创建文档记录并触发add_document_to_index_task。api/services/dataset_service.py:1018-1231。 - 错误处理:
IndexingRunner._handle_indexing_error将document.indexing_status更新为error并捕获异常描述。api/controllers/console/datasets/datasets_document.py:73-73。
来源: api/services/dataset_service.py:1018-1231 api/controllers/console/datasets/datasets_document.py:1-160
片段与子片段管理
片段是检索的粒度单元。SegmentService 管理这些片段的生命周期,包括它们与向量数据库的同步。
片段操作
| 方法 | 来源 | 用途 |
|---|---|---|
multi_create_segment() | api/services/dataset_service.py:1988-2041 | 批量创建 DocumentSegment 并触发 batch_create_segment_to_index_task。 |
update_segment() | api/services/dataset_service.py:2058-2163 | 更新内容并触发 document_indexing_update_task 以重新索引。 |
delete_segment() | api/services/dataset_service.py:2165-2205 | 删除片段并触发 delete_segment_from_index_task。 |
来源: api/services/dataset_service.py:1844-2205
父子索引(子片段)
对于使用 PARENT_CHILD_INDEX 的数据集,SegmentService 会处理 ChildChunk 实体。这些是链接到父级 DocumentSegment 的更小子片段。api/services/dataset_service.py:2366-2415。
来源: api/services/dataset_service.py:2366-2415
标注服务
Dify 提供了 AppAnnotationService 用于管理问答对,以提升应用准确性。这些标注存储在 MessageAnnotation 模型中,并建立索引以供检索。api/services/annotation_service.py:89-160。
标注索引流程
来源: api/services/annotation_service.py:91-159 api/controllers/console/app/annotation.py:119-131
权限与访问控制
DatasetService.check_dataset_permission 强制执行基于角色的访问控制(RBAC)。
- ONLY_ME(仅自己): 只有
created_by用户或租户的OWNER/ADMIN可以访问。api/services/dataset_service.py:2544-2550。 - PARTIAL_TEAM(部分团队): 访问权限仅限于
DatasetPermission中列出的用户。api/services/dataset_service.py:2552-2560。 - DATASET_OPERATOR(数据集操作员): 一种特定角色,只能看到他们拥有显式权限的数据集。
api/services/dataset_service.py:134-140。
来源:
api/services/dataset_service.py:125-160api/services/dataset_service.py:2528-2570