外部知识库集成
外部知识库集成
相关源文件
本章引用的主要源码文件:
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/console/datasets/rag_pipeline/datasource_auth.pyapi/controllers/console/workspace/trigger_providers.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/attachment_service.pyapi/services/dataset_service.pyapi/services/entities/knowledge_entities/knowledge_entities.pyapi/services/external_knowledge_service.pyapi/services/knowledge_service.pyapi/services/plugin/plugin_parameter_service.pyapi/services/retention/workflow_run/restore_archived_workflow_run.pyapi/services/trigger/trigger_provider_service.pyapi/services/trigger/trigger_subscription_builder_service.pyapi/tests/test_containers_integration_tests/models/test_conversation_status_count.pyapi/tests/test_containers_integration_tests/services/test_trigger_provider_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/auth/test_jina_auth_standalone_module.pyapi/tests/unit_tests/services/hit_service.pyapi/tests/unit_tests/services/retention/workflow_run/test_restore_archived_workflow_run.pyapi/tests/unit_tests/services/test_annotation_service.pyapi/tests/unit_tests/services/test_batch_indexing_base.pyapi/tests/unit_tests/services/test_external_dataset_service.pyapi/tests/unit_tests/services/test_knowledge_service.pyapi/tests/unit_tests/services/test_message_service.pyapi/tests/unit_tests/services/test_metadata_bug_complete.pyapi/tests/unit_tests/services/test_metadata_nullable_bug.pyapi/tests/unit_tests/services/test_operation_service.pyapi/tests/unit_tests/services/test_trigger_provider_service.pyapi/tests/unit_tests/services/test_website_service.py
目的与范围
本文档记录了 Dify 的外部知识库集成系统。该系统使数据集能够从基于外部 HTTP API 的知识源检索信息,而非依赖内部存储的文档。内部数据集使用 Dify 的索引管线(参见文档索引管线),而外部数据集则将存储和检索委托给第三方系统。
外部知识集成使组织能够:
- 将 Dify 连接到现有的知识管理系统(例如 AWS Bedrock 知识库)。
- 通过 API 直接查询外部源,避免数据重复。
- 在利用 Dify 的编排和检索增强生成(RAG)能力的同时,保持数据主权。
架构总览
外部知识集成采用基于模板的架构。通过可复用的 API 配置(ExternalKnowledgeApis),多个数据集可以借助 ExternalKnowledgeBindings 连接到不同的外部知识源。
组件图
来源:api/services/dataset_service.py:39-54, api/services/external_knowledge_service.py:27-28, api/models/dataset.py:15-19
数据模型与领域实体
外部知识 API 模板
ExternalKnowledgeApis 模型存储可复用的 API 配置。这些模板定义了与外部提供方通信所需的端点和认证信息。
关键设置结构: settings 字段是一个 JSON 字符串(通过 settings_dict 属性以字典形式处理),通常包含:
endpoint:目标 API URL。api_key:认证凭证。
在创建模板之前,ExternalDatasetService 会通过 ssrf_proxy 向提供的 URL 的 /retrieval 端点发送 POST 请求,执行连通性检查。
来源:api/services/external_knowledge_service.py:59-75, api/services/external_knowledge_service.py:78-103, api/models/dataset.py:17-17
外部数据集绑定
ExternalKnowledgeBindings 模型充当标准 Dataset 实体与外部提供方之间的桥梁。
来源:api/models/dataset.py:39-54, api/services/external_knowledge_service.py:170-185
外部数据集生命周期
创建流程
外部数据集通过服务 API 或控制台创建,需要指定 external_knowledge_api_id 和具体的 external_knowledge_id(外部系统中的标识符)。
实现逻辑:
- 调用
DatasetService.create_empty_dataset,并将provider设置为external。 - 如果提供了
external_knowledge_api_id,系统会验证该 API 模板是否存在。 - 创建一个
Dataset记录,其DatasetRuntimeMode为EXTERNAL。 - 初始化一个
ExternalKnowledgeBindings记录,将 Dify 数据集与外部提供方的 API 及特定知识库 ID 关联起来。
来源:api/services/dataset_service.py:203-280, api/controllers/service_api/dataset/dataset.py:43-54, api/models/enums.py:56-56
检索与命中测试
与通过 VectorService 查询本地向量数据库的内部数据集不同,外部数据集通过 ExternalDatasetService 使用 HTTP 客户端获取结果。
执行流程:
- 系统获取与
Dataset关联的ExternalKnowledgeBindings。 - 检索
ExternalKnowledgeApis模板以获取endpoint和api_key。 - 构建检索请求,目标路径为
{endpoint}/retrieval。 - 使用
ssrf_proxy.post执行请求,传递查询和检索参数。 - 结果以外部源返回的片段列表形式呈现。
来源:api/services/external_knowledge_service.py:170-205, api/services/external_knowledge_service.py:78-103, api/core/helper/ssrf_proxy.py:1-20
服务层实现
ExternalDatasetService 函数
api/services/external_knowledge_service.py 中的 ExternalDatasetService 类处理外部集成的核心逻辑。
| 函数 | 作用 | 来源 |
|---|---|---|
create_external_knowledge_api | 校验设置并持久化新的 API 模板。 | api/services/external_knowledge_service.py:59-75 |
check_endpoint_and_api_key | 使用 ssrf_proxy 执行主动连通性测试。 | api/services/external_knowledge_service.py:78-103 |
get_external_knowledge_binding | 获取特定数据集的绑定详情。 | api/services/external_knowledge_service.py:170-185 |
delete_external_knowledge_api | 删除未使用的模板。 | api/services/external_knowledge_service.py:138-149 |
DatasetService 集成
DatasetService 在数据集管理过程中集成了外部逻辑:
| 函数 | 作用 | 来源 |
|---|---|---|
get_datasets | 过滤数据集,包括 provider='external' 的数据集。 | api/services/dataset_service.py:121-160 |
create_empty_dataset | 处理创建 ExternalKnowledgeBindings 的条件逻辑。 | api/services/dataset_service.py:203-280 |
对比:外部 vs 内部
| 特性 | 内部(vendor) | 外部(external) |
|---|---|---|
| 数据存储 | Dify 向量数据库(例如 Pinecone、Milvus) | 第三方系统(通过 API) |
| 索引状态 | 通过 IndexingRunner 管理 | 由外部提供方管理 |
| 文档处理 | IndexingRunner 提取-转换-加载(ETL)管线 | 由外部提供方管理 |
| 检索机制 | VectorFactory / VectorService | 通过 ssrf_proxy 发送 HTTP POST 请求 |
| 凭证存储 | 模型提供方设置 | ExternalKnowledgeApis.settings |
来源:api/services/external_knowledge_service.py:78-103, api/models/enums.py:55-57
安全与隔离
- 租户隔离:对
ExternalKnowledgeApis或ExternalKnowledgeBindings的每次查询都包含tenant_id过滤器,以防止跨租户数据泄露。api/services/external_knowledge_service.py:32-36,api/services/external_knowledge_service.py:105-110 - SSRF 保护:所有对外部知识端点的出站调用都通过
core.helper.ssrf_proxy路由,以降低服务端请求伪造(SSRF)风险。api/services/external_knowledge_service.py:94-94 - 基于角色的访问:对外部数据集配置的访问权限受与内部数据集相同的
TenantAccountRole逻辑控制,需要相应的权限。api/services/dataset_service.py:134-150
来源:api/services/external_knowledge_service.py:32-36, api/services/external_knowledge_service.py:105-110, api/services/dataset_service.py:134-150