摘要索引生成(中文译文)
原始 DeepWiki 页面:https://deepwiki.com/langgenius/dify/4.6-summary-index-generation
翻译时间:2026-05-27T08:44:22.191Z
翻译模型:deepseek-chat
原文字符数:11154
项目:Dify (dify)
---
摘要索引生成
相关源文件
以下文件被用作生成此 Wiki 页面的上下文:
.devcontainer/Dockerfile.devcontainer/devcontainer.json.devcontainer/post_create_command.sh.devcontainer/post_start_command.sh.gitignore.vscode/launch.json.templateapi/README.mdapi/core/indexing_runner.pyapi/core/rag/index_processor/index_processor_base.pyapi/core/rag/index_processor/processor/paragraph_index_processor.pyapi/core/rag/index_processor/processor/parent_child_index_processor.pyapi/core/rag/index_processor/processor/qa_index_processor.pyapi/docker/entrypoint.shapi/services/summary_index_service.pyapi/tasks/generate_summary_index_task.pyapi/tasks/regenerate_summary_index_task.pyapi/tasks/remove_document_from_index_task.pyapi/tests/unit_tests/core/rag/indexing/processor/test_paragraph_index_processor.pyapi/tests/unit_tests/core/rag/indexing/processor/test_parent_child_index_processor.pyapi/tests/unit_tests/core/rag/indexing/processor/test_qa_index_processor.pyapi/tests/unit_tests/tasks/test_summary_queue_isolation.pydev/start-webdev/start-worker
目的与范围
摘要索引生成是一项功能,可以为数据集中的文档片段(chunks)创建由大语言模型(LLM)生成的摘要。这些摘要提供了片段内容的简洁表示,从而实现更高效的检索和理解。该系统独立于主文档索引管线运行,以防止大语言模型密集型操作阻塞文档处理。
有关更广泛的文档索引管线的信息,请参阅文档索引管线。有关可能使用摘要的检索策略,请参阅检索策略与元数据过滤。
来源: api/tasks/generate_summary_index_task.py:1-20, api/tasks/regenerate_summary_index_task.py:1-21, api/docker/entrypoint.sh:36-41
架构总览
graph TB
subgraph "配置层"
Dataset["数据集模型<br/>summary_index_setting"]
SummaryConfig["摘要配置<br/>{enable, model, prompt}"]
end
subgraph "异步任务层"
GenerateTask["generate_summary_index_task<br/>队列: dataset_summary"]
RegenerateTask["regenerate_summary_index_task<br/>队列: dataset_summary"]
end
subgraph "服务层"
SummaryService["SummaryIndexService<br/>业务逻辑"]
DatasetService["DatasetService<br/>update_dataset()"]
end
subgraph "存储层"
SegmentTable["DocumentSegment<br/>表"]
SummaryTable["DocumentSegmentSummary<br/>表"]
VectorDB["向量数据库<br/>摘要嵌入向量"]
end
subgraph "工作进程基础设施"
DatasetSummaryQueue["Celery 队列:<br/>dataset_summary"]
DatasetQueue["Celery 队列:<br/>dataset"]
end
Dataset --> SummaryConfig
SummaryConfig --> GenerateTask
SummaryConfig --> RegenerateTask
GenerateTask --> DatasetSummaryQueue
RegenerateTask --> DatasetSummaryQueue
DatasetSummaryQueue --> SummaryService
SummaryService --> SummaryTable
SummaryService --> VectorDB
DatasetService --> RegenerateTask
SegmentTable -.引用.-> SummaryTable
DatasetQueue -.隔离于.-> DatasetSummaryQueue
图:摘要索引生成系统架构
该架构将摘要生成分离到专用的 Celery 队列(dataset_summary)中,以防止大语言模型密集型操作阻塞 dataset 队列上的文档索引任务。摘要元数据存储在 DocumentSegmentSummary 中,而摘要嵌入向量存储在向量数据库中用于检索。
来源: api/tasks/generate_summary_index_task.py:17-19, api/tasks/regenerate_summary_index_task.py:19-21, api/docker/entrypoint.sh:36-41, api/services/summary_index_service.py:45-53
任务队列隔离
graph LR
subgraph "Dataset 队列 - 快速操作"
IndexingTask["文档索引"]
ChunkingTask["文本片段切分"]
EmbeddingTask["向量嵌入"]
end
subgraph "Dataset Summary 队列 - LLM 操作"
SummaryGen["摘要生成<br/>~每个片段数秒"]
SummaryRegen["摘要重新生成<br/>~数据集数小时"]
end
subgraph "工作进程池"
Worker1["工作进程 1<br/>dataset 队列"]
Worker2["工作进程 2<br/>dataset_summary 队列"]
end
IndexingTask --> Worker1
ChunkingTask --> Worker1
EmbeddingTask --> Worker1
SummaryGen --> Worker2
SummaryRegen --> Worker2
Worker1 -.X 不被阻塞.-> Worker2
图:队列隔离策略
摘要生成任务在专用的 dataset_summary 队列上运行,与主 dataset 队列分离。这种隔离至关重要,原因如下:
- 大语言模型调用开销:每个片段需要一次大语言模型调用,每个片段耗时数秒。
- 数据集规模操作:为大型数据集重新生成摘要可能需要数小时。
- 工作进程槽位阻塞:如果没有隔离,摘要任务会占用所有工作进程槽位并阻塞文档索引。
队列配置是版本感知的,并在容器入口点期间设置:
| 版本 | 队列列表包含 | 文件指针 |
|---|---|---|
| 云版 | dataset, dataset_summary, priority_dataset | api/docker/entrypoint.sh:38 |
| 社区版(自托管) | dataset, dataset_summary, priority_dataset | api/docker/entrypoint.sh:41 |
来源: api/docker/entrypoint.sh:36-44, .devcontainer/post_create_command.sh:10, dev/start-worker:24
实现与逻辑流程
摘要生成逻辑封装在 SummaryIndexService 和专门的索引处理器中。
关键服务组件
SummaryIndexService 处理摘要记录及其向量化的生命周期。
| 方法 | 作用 | 来源 |
|---|---|---|
generate_summary_for_segment | 调用大语言模型为特定片段生成摘要文本。 | api/services/summary_index_service.py:49-89 |
create_summary_record | 将摘要文本持久化到 DocumentSegmentSummary 模型中。 | api/services/summary_index_service.py:92-147 |
vectorize_summary | 将摘要文本转换为嵌入向量并加载到向量存储中。 | api/services/summary_index_service.py:150-182 |
索引处理器集成
摘要生成集成到 BaseIndexProcessor 接口中,并由具体的处理器(如 ParagraphIndexProcessor)实现。
generate_summary:ParagraphIndexProcessor中的静态方法,用于构建提示词并调用大语言模型实例api/core/rag/index_processor/processor/paragraph_index_processor.py:78-84。generate_summary_preview:允许用户在索引配置阶段查看示例摘要api/core/rag/index_processor/index_processor_base.py:59-77。
sequenceDiagram
participant Srv as SummaryIndexService
participant Proc as ParagraphIndexProcessor
participant LLM as ModelInstance
participant VDB as VectorFactory
Srv->>Proc: generate_summary(text, setting)
Proc->>LLM: invoke(prompt, messages)
LLM-->>Proc: LLMResult (summary text)
Proc-->>Srv: (summary_content, usage)
Srv->>Srv: create_summary_record()
Srv->>VDB: create(summary_document)
图:摘要生成序列
来源: api/services/summary_index_service.py:49-89, api/core/rag/index_processor/processor/paragraph_index_processor.py:78-84, api/core/rag/index_processor/index_processor_base.py:59-77
摘要生成与清理
生成流程
生成流程在文档片段创建后作为异步任务触发。generate_summary_index_task 遍历文档片段以生成基于大语言模型的摘要。
来源: api/tasks/generate_summary_index_task.py:17-20
清理任务
当文档或片段被删除时,必须从数据库和向量存储中清理关联的摘要。ParagraphIndexProcessor.clean 方法包含根据 delete_summaries 标志禁用或删除摘要的逻辑 api/core/rag/index_processor/processor/paragraph_index_processor.py:150-151。
来源: api/core/rag/index_processor/processor/paragraph_index_processor.py:145-155, api/core/rag/index_processor/processor/qa_index_processor.py:156-160
重新生成场景
regenerate_summary_index_task 处理需要刷新现有摘要的场景。这通常由嵌入向量模型变更或用户手动请求触发。
重新生成模式:
- 嵌入向量模型变更:自动触发一个任务,设置
regenerate_vectors_only=True,以刷新嵌入向量,同时保留现有的大语言模型生成的文本。 - 完全重新生成:手动触发以重新调用大语言模型生成新的摘要文本,通常在提示词或模型配置变更后。
来源: api/tasks/regenerate_summary_index_task.py:20-180, api/tasks/generate_summary_index_task.py:17-147
错误处理与重试逻辑
摘要生成任务实现了健壮的错误处理,以管理大语言模型 API 的不稳定性:
- 队列分配:任务严格路由到
dataset_summary队列api/tasks/generate_summary_index_task.py:18。 - 任务重试:Celery 处理临时网络或 API 故障的重试。
- 记录管理:如果生成失败,
DocumentSegmentSummary记录可以存储错误消息用于调试api/services/summary_index_service.py:34。 - 模型配额:大语言模型使用情况通过
LLMUsage跟踪,并从租户的配额中扣除api/services/summary_index_service.py:53。
来源: api/tasks/generate_summary_index_task.py:17-147, api/services/summary_index_service.py:29-37, api/services/summary_index_service.py:53-63