本指南介绍了如何在 discourse-ai 中实现和使用 PDF 处理功能,包括基本的文本提取和使用 LLM 辅助的增强处理。
所需用户级别:管理员
摘要
discourse-ai 插件支持 RAG(检索增强生成)的 PDF 处理,有两种不同的模式:
- 基本文本提取
- 使用 LLM 分析的增强处理
基本文本提取
此模式提供基本的 PDF 处理功能:
- 使用
pdf-readergem 提取文本内容- 支持最大 100MB 的文件
- 在插件安装后立即生效
- 处理纯文本内容(忽略视觉元素)
使用 LLM 改进的增强处理
此模式需要特定配置,并提供更高级的功能。
要求:
- 企业版订阅或自托管 Discourse
- 在容器中安装了支持 Ghostscript 的 ImageMagick
- 启用了
ai_rag_images_enabled站点设置功能:
- 解释图像、图表和示意图
- 提供来自视觉元素的上下文
- 分页处理 PDF
- 保持 100MB 的文件大小限制
实现细节
处理规范
- 分页处理分辨率:300 DPI
- 最大处理时间:600 秒(10 分钟)
- 临时文件的自动清理
- 与 RAG 文档嵌入完全集成
处理工作流程
- PDF 上传和验证
- 内容提取(基本或增强模式)
- 带有可配置重叠的文本分块
- 块嵌入和存储
- 通过 MessageBus 进行进度跟踪
限制
在实现 PDF 处理时,请注意这些限制:
- 文件大小限制:
- 现有 PDF 处理为 100MB
- 新的管理员界面上传为 20MB
- 增强模式需要额外的系统资源
- 复杂的 PDF 布局可能无法完美解释
- 增强处理会显著增加处理时间
这是个非常棒的消息。谢谢团队!迫不及待地想看到增强处理完成。这将对喂养 LLM 研究论文至关重要。
另外,有没有计划允许通过在 AI 机器人私信或主题/帖子中上传 PDF 并提及机器人来实现“与你的 PDF 聊天”的 RAG?
@sam 你能提供一个简短的视频来解释这个很好的选项吗,因为你提到的内容还不够清楚,无法实现
我在哪里可以找到此设置
这是一个隐藏的设置,您需要使用控制台,但还需要配置容器,建议您再等几周。
谢谢,我非常欣赏您出色的工作
我在我的网站(阿拉伯论坛)上用阿拉伯语进行了一项测试,在第一个帖子“主题”中添加了立法,然后我用人工智能提问,但答案不准确,我认为这是因为没有进行上下文检索(Context Ragging)。
抱歉,这不是它的工作方式,您需要定义一个角色或工具,然后在此处添加上传。
关于支持“上传和提问”的讨论在这里:https://meta.discourse.org/t/upload-and-discuss-pdfs-in-composer/347542,但目前还不支持。
首先,非常感谢您的辛勤工作。我真的很喜欢它。
在尝试了设置并更改AI模型为Gemini-Flash-2.0后,它对我来说效果很好。以下是我的情况:
我们是一个审计师、会计师和税务顾问社区,我们需要一个工具来分享相关法律并引发关于它们的讨论。这次讨论对访客来说应该非常有益,因为我们是各自领域的专业人士。我们的目标是让AI模型检查和分析立法并回答我们的问题。伟大的实验得出的结论是,我们可以真正讨论第一个帖子中添加的上下文,如果AI模型足够智能,它将以非常高质量的输出来回答我们的问题。
再次感谢,并期待PDF支持,因为它将使Discourse成为最好的论坛软件。
最新的 discourse 镜像支持高级模式,如果您想进行测试的话。
是否必须通过控制台启用?在 UI 中看不到任何高级模式选项。
此外,我在尝试上传此 PDF 时收到错误。它的大小为 34 MB,但我已将最大附件大小设置为 100 MB(在管理员设置和 app.yml 中)。奇怪的是,我有一个压缩版本,大小为 16 MB,可以正常上传。但也许较大的 PDF 目前过于复杂?里面有很多图像、公式等。
是的,您需要在 Rails 控制台中将 SiteSetting.ai_rag_images_enabled = true 以启用它。
我猜这里也需要更改容器中的一些 nginx 设置,这样它就不会拒绝上传。
你好 @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'
谢谢这个令人惊叹的更新,
我只有一个疑问,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支持的当前状态如何?![]()
当您在 app.yml 中配置上传大小时,它是全站范围的,因此适用于每个 persona。
关于此事有任何更新吗?我在与人工智能发起对话时附上了一个 PDF,但它似乎仍然无法识别。我目前正在使用 GPT。我是否应该考虑使用专门为处理 PDF 而设计的不同模型?
