agentic_huge_data_base / wiki
页面 Paperless-ngx · 8.2 Docker 部署·DeepWiki 中文全文译文

8.2 · Docker 部署(Docker Deployment)

文档归档与消费管道 · 聚焦本章的模块关系、源码依据与实现要点。

项目Paperless-ngx 章节8.2 状态全文译文 模块文档对象与元数据、安装与启动、测试、发布与运维、界面与交互
源码线索
  • .github/workflows/ci.yml
  • .pre-commit-config.yaml
  • Dockerfile
  • src/documents/bulk_download.py
  • src/documents/caching.py
模块标签
  • 文档对象与元数据
  • 安装与启动
  • 测试、发布与运维
  • 界面与交互
  • 配置治理

章节正文

AI 驱动的文档建议

AI 驱动的文档建议

相关源文件

以下文件为本维基页面的生成提供了上下文:

  • src-ui/src/app/components/document-detail/document-detail.component.html
  • src-ui/src/app/components/document-detail/document-detail.component.scss
  • src-ui/src/app/components/document-detail/document-detail.component.spec.ts
  • src-ui/src/app/components/document-detail/document-detail.component.ts
  • src/documents/filters.py
  • src/documents/serialisers.py
  • src/documents/tests/test_api_custom_fields.py
  • src/documents/tests/test_api_documents.py
  • src/documents/tests/test_api_filter_by_custom_fields.py
  • src/documents/views.py
  • src/paperless/urls.py

Paperless-ngx 中的 AI 驱动文档建议系统可在用户审阅文档过程中提供智能元数据推荐。该系统通过利用大语言模型(LLM)和传统机器学习(ML)分类器,可以建议可能的通信方、标签和文档类型,并直接从文档内容中提取标题。

概述与架构

建议引擎通过一个专用的 API 操作来运行,该操作会聚合来自多个分类后端的结果。当用户打开文档详情视图时,前端会根据文档内容和现有元数据请求建议。

系统数据流

下图展示了从 Angular UI 到 Django 后端以及底层 AI/ML 实体的请求-响应流程。

图:建议请求管线

Paperless-ngx · 系统数据流 · 图 1
Paperless-ngx · 系统数据流 · 图 1

来源: src-ui/src/app/components/document-detail/document-detail.component.ts:1331-1340(组件结构) src/documents/views.py:88-106(操作装饰器和视图集) src/documents/classifier.py:120-120(分类器加载)

后端实现

核心逻辑位于 UnifiedSearchViewSet 中的 ai_suggestions 操作内。该端点负责协调标准分类器和基于 LLM 的提取。

ai_suggestions API 操作

触发时,后端会执行以下步骤:

  1. 缓存检查: 尝试使用 get_llm_suggestion_cache 从缓存中检索先前计算过的建议 src/documents/views.py:112-112
  2. 分类器预测: 使用训练好的 DocumentClassifier 根据文档内容预测元数据 src/documents/views.py:120-120
  3. LLM 提取: 如果配置了 AI 后端,则调用 AIClient 执行"文档信息提取"。
  4. 结果聚合: 将预测结果和提取结果合并为统一的模式。
数据结构

系统使用特定的模式来确保 LLM 输出与内部数据库之间的一致性。

实体类 / 模式用途
建议集DocumentSuggestions前端接口,用于保存建议 ID 的数组。
LLM 输出DocumentClassifierSchema类似 Pydantic 的模式,用于强制 LLM 返回结构化的 JSON。

来源: src/documents/views.py:88-106(API 操作定义) src-ui/src/app/data/document-suggestions.ts:1-10(前端数据模型)

基于 LLM 的提取

与依赖历史模式的标准分类器不同,LLM 后端(Ollama 或兼容 OpenAI 的接口)会"阅读"文档文本来提取特定字段。

提取逻辑

系统会将文档的 content 传递给 LLM,并附带指令以识别:

  • 标题: 文档的简洁摘要。
  • 日期: 文档的创建或签发日期。
  • 通信方: 发件人或组织。
  • 标签: 相关分类。

图:LLM 实体映射

Paperless-ngx · 提取逻辑 · 图 2
Paperless-ngx · 提取逻辑 · 图 2

来源: src/documents/views.py:88-106(视图集交互) src/paperless_ai/client.py(提取逻辑的实现)

前端集成

前端在 DocumentDetailComponent 中展示建议。

UI 组件
  1. SuggestionsDropdownComponent: 位于详情视图的工具栏中 src-ui/src/app/components/document-detail/document-detail.component.html:131-141。在获取建议时会显示加载旋转图标。
  2. 视觉指示器: 建议会在元数据字段(通信方、文档类型、标签)中高亮显示。用户可以点击建议立即应用。
交互逻辑

DocumentDetailComponent 中,当用户点击建议按钮时会调用 getSuggestions() 方法:

  • 它会将 suggestionsLoading 设置为 true src-ui/src/app/components/document-detail/document-detail.component.ts:1331-1340
  • 它会调用 this.documentService.getSuggestions(id) src-ui/src/app/services/rest/document.service.ts
  • 收到响应后,它会更新 suggestions 可观察对象,SuggestionsDropdownComponent 会订阅该对象。

来源: src-ui/src/app/components/document-detail/document-detail.component.ts:1331-1340(组件逻辑) src-ui/src/app/components/document-detail/document-detail.component.html:131-141(模板集成)

缓存与性能

为了最小化 LLM API 的成本和延迟,建议会被缓存。

  • 缓存键: 建议按文档 ID 进行缓存。
  • 失效策略: 当文档内容发生变化或用户手动请求重新扫描时,缓存会被刷新。
  • 函数: set_llm_suggestions_cacheget_llm_suggestion_cache 在 Django 缓存后端中管理这些条目 src/documents/views.py:112-117

来源:

  • src/documents/views.py:112-119(缓存工具导入)