Discourse AI中的PDF支持

:bookmark: 本指南介绍了如何在 discourse-ai 中实现和使用 PDF 处理功能,包括基本的文本提取和使用 LLM 辅助的增强处理。

:person_raising_hand: 所需用户级别:管理员

摘要

discourse-ai 插件支持 RAG(检索增强生成)的 PDF 处理,有两种不同的模式:

  1. 基本文本提取
  2. 使用 LLM 分析的增强处理

基本文本提取

此模式提供基本的 PDF 处理功能:

  • 使用 pdf-reader gem 提取文本内容
  • 支持最大 100MB 的文件
  • 在插件安装后立即生效
  • 处理纯文本内容(忽略视觉元素)

使用 LLM 改进的增强处理

:information_source: 此模式需要特定配置,并提供更高级的功能。

要求:

  • 企业版订阅或自托管 Discourse
  • 在容器中安装了支持 Ghostscript 的 ImageMagick
  • 启用了 ai_rag_images_enabled 站点设置

功能:

  • 解释图像、图表和示意图
  • 提供来自视觉元素的上下文
  • 分页处理 PDF
  • 保持 100MB 的文件大小限制

实现细节

处理规范

  • 分页处理分辨率:300 DPI
  • 最大处理时间:600 秒(10 分钟)
  • 临时文件的自动清理
  • 与 RAG 文档嵌入完全集成

处理工作流程

  1. PDF 上传和验证
  2. 内容提取(基本或增强模式)
  3. 带有可配置重叠的文本分块
  4. 块嵌入和存储
  5. 通过 MessageBus 进行进度跟踪

限制

:warning: 在实现 PDF 处理时,请注意这些限制:

  • 文件大小限制:
    • 现有 PDF 处理为 100MB
    • 新的管理员界面上传为 20MB
  • 增强模式需要额外的系统资源
  • 复杂的 PDF 布局可能无法完美解释
  • 增强处理会显著增加处理时间
11 个赞

这是个非常棒的消息。谢谢团队!迫不及待地想看到增强处理完成。这将对喂养 LLM 研究论文至关重要。

另外,有没有计划允许通过在 AI 机器人私信或主题/帖子中上传 PDF 并提及机器人来实现“与你的 PDF 聊天”的 RAG?

1 个赞

@sam 你能提供一个简短的视频来解释这个很好的选项吗,因为你提到的内容还不够清楚,无法实现

我在哪里可以找到此设置

这是一个隐藏的设置,您需要使用控制台,但还需要配置容器,建议您再等几周。

3 个赞

谢谢,我非常欣赏您出色的工作

我在我的网站(阿拉伯论坛)上用阿拉伯语进行了一项测试,在第一个帖子“主题”中添加了立法,然后我用人工智能提问,但答案不准确,我认为这是因为没有进行上下文检索(Context Ragging)。

抱歉,这不是它的工作方式,您需要定义一个角色或工具,然后在此处添加上传。

关于支持“上传和提问”的讨论在这里:https://meta.discourse.org/t/upload-and-discuss-pdfs-in-composer/347542,但目前还不支持。

1 个赞

首先,非常感谢您的辛勤工作。我真的很喜欢它。

在尝试了设置并更改AI模型为Gemini-Flash-2.0后,它对我来说效果很好。以下是我的情况:

我们是一个审计师、会计师和税务顾问社区,我们需要一个工具来分享相关法律并引发关于它们的讨论。这次讨论对访客来说应该非常有益,因为我们是各自领域的专业人士。我们的目标是让AI模型检查和分析立法并回答我们的问题。伟大的实验得出的结论是,我们可以真正讨论第一个帖子中添加的上下文,如果AI模型足够智能,它将以非常高质量的输出来回答我们的问题。
再次感谢,并期待PDF支持,因为它将使Discourse成为最好的论坛软件。

3 个赞

最新的 discourse 镜像支持高级模式,如果您想进行测试的话。

2 个赞

是否必须通过控制台启用?在 UI 中看不到任何高级模式选项。

此外,我在尝试上传此 PDF 时收到错误。它的大小为 34 MB,但我已将最大附件大小设置为 100 MB(在管理员设置和 app.yml 中)。奇怪的是,我有一个压缩版本,大小为 16 MB,可以正常上传。但也许较大的 PDF 目前过于复杂?里面有很多图像、公式等。

是的,您需要在 Rails 控制台中将 SiteSetting.ai_rag_images_enabled = true 以启用它。

1 个赞

我猜这里也需要更改容器中的一些 nginx 设置,这样它就不会拒绝上传。

1 个赞

你好 @sam
我目前在上传和索引 PDF 时遇到问题,出现此错误:Job exception: undefined method `length’ for nil。

我想知道这是否与我们上面讨论的设置有关。
界面会卡在索引 0% 不动,
异常详情如下:

/var/www/discourse/plugins/discourse-ai/app/jobs/regular/digest_rag_upload.rb:81:in `chunk_document'
/var/www/discourse/plugins/discourse-ai/app/jobs/regular/digest_rag_upload.rb:40:in `block in execute'
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/transaction.rb:616:in `block in within_new_transaction'
activesupport-7.2.2.1/lib/active_support/concurrency/null_lock.rb:9:in `synchronize'
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/transaction.rb:613:in `within_new_transaction'
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/database_statements.rb:361:in `transaction'
activerecord-7.2.2.1/lib/active_record/transactions.rb:234:in `block in transaction'
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:415:in `with_connection'
activerecord-7.2.2.1/lib/active_record/connection_handling.rb:296:in `with_connection'
activerecord-7.2.2.1/lib/active_record/transactions.rb:233:in `transaction'
/var/www/discourse/plugins/discourse-ai/app/jobs/regular/digest_rag_upload.rb:39:in `execute'
/var/www/discourse/app/jobs/base.rb:316:in `block (2 levels) in perform'
rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
rails_multisite-6.1.0/lib/rails_multisite/connection_management.rb:21:in `with_connection'
/var/www/discourse/app/jobs/base.rb:303:in `block in perform'
/var/www/discourse/app/jobs/base.rb:299:in `each'
/var/www/discourse/app/jobs/base.rb:299:in `perform'
sidekiq-7.3.9/lib/sidekiq/processor.rb:220:in `execute_job'
sidekiq-7.3.9/lib/sidekiq/processor.rb:185:in `block (4 levels) in process'
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:180:in `traverse'
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'
/var/www/discourse/lib/sidekiq/pausable.rb:132:in `call'
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse'
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'
sidekiq-7.3.9/lib/sidekiq/job/interrupt_handler.rb:9:in `call'
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse'
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:183:in `block in traverse'
sidekiq-7.3.9/lib/sidekiq/metrics/tracking.rb:26:in `track'
sidekiq-7.3.9/lib/sidekiq/metrics/tracking.rb:134:in `call'
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:182:in `traverse'
sidekiq-7.3.9/lib/sidekiq/middleware/chain.rb:173:in `invoke'
sidekiq-7.3.9/lib/sidekiq/processor.rb:184:in `block (3 levels) in process'
sidekiq-7.3.9/lib/sidekiq/processor.rb:145:in `block (6 levels) in dispatch'
sidekiq-7.3.9/lib/sidekiq/job_retry.rb:118:in `local'
sidekiq-7.3.9/lib/sidekiq/processor.rb:144:in `block (5 levels) in dispatch'
sidekiq-7.3.9/lib/sidekiq/config.rb:39:in `block in <class:Config>'
sidekiq-7.3.9/lib/sidekiq/processor.rb:139:in `block (4 levels) in dispatch'
sidekiq-7.3.9/lib/sidekiq/processor.rb:281:in `stats'
sidekiq-7.3.9/lib/sidekiq/processor.rb:134:in `block (3 levels) in dispatch'
sidekiq-7.3.9/lib/sidekiq/job_logger.rb:15:in `call'
sidekiq-7.3.9/lib/sidekiq/processor.rb:133:in `block (2 levels) in dispatch'
sidekiq-7.3.9/lib/sidekiq/job_retry.rb:85:in `global'
sidekiq-7.3.9/lib/sidekiq/processor.rb:132:in `block in dispatch'
sidekiq-7.3.9/lib/sidekiq/job_logger.rb:40:in `prepare'
sidekiq-7.3.9/lib/sidekiq/processor.rb:131:in `dispatch'
sidekiq-7.3.9/lib/sidekiq/processor.rb:183:in `block (2 levels) in process'
sidekiq-7.3.9/lib/sidekiq/processor.rb:182:in `handle_interrupt'
sidekiq-7.3.9/lib/sidekiq/processor.rb:182:in `block in process'
sidekiq-7.3.9/lib/sidekiq/processor.rb:181:in `handle_interrupt'
sidekiq-7.3.9/lib/sidekiq/processor.rb:181:in `process'
sidekiq-7.3.9/lib/sidekiq/processor.rb:86:in `process_one'
sidekiq-7.3.9/lib/sidekiq/processor.rb:76:in `run'
sidekiq-7.3.9/lib/sidekiq/component.rb:10:in `watchdog'
sidekiq-7.3.9/lib/sidekiq/component.rb:19:in `block in safe_thread'
1 个赞

谢谢这个令人惊叹的更新,
我只有一个疑问,100MB的限制是针对每个Persona AI机器人还是所有Persona的总限制?

我是 Discourse AI 的新手,但对 Discourse 总体来说很熟悉。

目前我非常希望在演示阶段为特定用例尝试一下。

我已经启用了隐藏的站点设置。

我在 SideKiq 中看不到任何东西。我该如何查看它是否在工作?

我知道这是一个预发布功能,尚未准备好投入实际使用,但能够体验和尝试一下将非常棒。

非常期待那些正在尝试此功能的人提供任何提示、技巧、截图或使用方法。

当我要求机器人总结我网站上某些 PDF 的内容时,我收到了这个错误。我没有启用增强处理,并且正在使用 GPT 4.1。有什么想法是我做错了什么吗?

抱歉,在尝试回复时,我们的系统似乎遇到了意外问题。

错误详情

{
“error”: {
“message”: “带有 ‘tool_calls’ 的助手消息之后必须是响应每个 ‘tool_call_id’ 的工具消息。以下 tool_call_ids 没有响应消息:call_nrDCba5mt83oavbXfPq2BtEV”,
“type”: “invalid_request_error”,
“param”: “messages.[2].role”,
“code”: null
}
}

请问PDF支持的当前状态如何?:face_with_peeking_eye:

1 个赞

当您在 app.yml 中配置上传大小时,它是全站范围的,因此适用于每个 persona。

1 个赞

关于此事有任何更新吗?我在与人工智能发起对话时附上了一个 PDF,但它似乎仍然无法识别。我目前正在使用 GPT。我是否应该考虑使用专门为处理 PDF 而设计的不同模型?