摘要索引生成
摘要索引生成
相关源文件
本章引用的主要源码文件:
.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
架构总览
图:摘要索引生成系统架构
该架构将摘要生成分离到专用的 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
任务队列隔离
图:队列隔离策略
摘要生成任务在专用的 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。
图:摘要生成序列
来源: 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