Este guia explica como implementar e usar recursos de processamento de PDF no discourse-ai, incluindo extração básica de texto e processamento aprimorado com assistência de LLM.
Nível de usuário necessário: Administrador
Resumo
O plugin discourse-ai suporta o processamento de PDF para RAG (Retrieval-Augmented Generation) em dois modos distintos:
Extração básica de texto
Processamento aprimorado com análise de LLM
Extração básica de texto
Este modo fornece recursos fundamentais de processamento de PDF:
Extrai conteúdo de texto usando a gem pdf-reader
Suporta arquivos de até 100 MB
Funciona imediatamente após a instalação do plugin
Processa conteúdo apenas de texto (ignora elementos visuais)
Processamento aprimorado com melhorias de LLM
Este modo requer configuração específica e oferece recursos mais avançados.
Requisitos:
Assinatura do plano Enterprise ou Discourse auto-hospedado
ImageMagick com suporte a Ghostscript instalado no contêiner
Configuração do site ai_rag_images_enabled ativada
Capacidades:
Interpreta imagens, gráficos e diagramas
Fornece contexto de elementos visuais
Processa PDFs página por página
Mantém o limite de tamanho de arquivo de 100 MB
Detalhes de implementação
Especificações de processamento
Resolução de processamento de página: 300 DPI
Tempo máximo de processamento: 600 segundos (10 minutos)
Limpeza automática de arquivos temporários
Integração completa com embeddings de documentos RAG
Fluxo de trabalho de processamento
Upload e validação de PDF
Extração de conteúdo (modo básico ou aprimorado)
Divisão de texto com sobreposição configurável
Embedding e armazenamento de blocos de texto
Rastreamento de progresso via MessageBus
Limitações
Esteja ciente destas restrições ao implementar o processamento de PDF:
Restrições de tamanho de arquivo:
100 MB para processamento de PDF existente
20 MB para novos uploads na interface de administração
O modo aprimorado requer recursos adicionais do sistema
Layouts de PDF complexos podem não ser interpretados perfeitamente
O processamento aprimorado aumenta significativamente o tempo de processamento
Esta é uma notícia realmente incrível. Obrigado equipe! Mal posso esperar para que o processamento aprimorado seja concluído. Isso será fundamental para alimentar os artigos de pesquisa dos LLMs.
Além disso, há algum plano para permitir o “chat com seus PDFs” usando RAG, fazendo upload de PDFs em uma mensagem privada de bot de IA ou em um tópico/post e mencionando o bot?
No meu site (Fórum Árabe) fiz um teste em árabe adicionando legislação na primeira postagem “tópico” e depois fiz perguntas usando IA, mas as respostas não são precisas e acho que é porque não é Context Ragging
Em primeiro lugar, muito obrigado pelo seu ótimo trabalho. Eu realmente gosto.
Depois de mexer nas configurações e mudar o Modelo de IA para Gemini-Flash-2.0, funcionou muito bem para mim. Aqui está a situação que tenho:
Somos uma comunidade de Auditores, Contadores e Consultores Tributários, e precisávamos de uma ferramenta para compartilhar leis relacionadas e gerar discussões sobre elas. Essa discussão deve ser muito útil para os visitantes, pois somos profissionais em nossa área. Estamos direcionando o Modelo de IA para verificar e analisar a legislação e responder às nossas perguntas. O grande experimento levou à conclusão de que podemos realmente discutir o contexto adicionado na primeira postagem e, se o modelo de IA for inteligente o suficiente, ele responderá às nossas perguntas com um resultado de altíssima qualidade.
Muito obrigado novamente e aguardando o suporte a PDF, pois isso tornará o Discourse o melhor software de fórum.
É necessário ativá-lo via console? Não vejo nenhuma opção de modo avançado na interface do usuário.
Além disso, estou recebendo um erro ao tentar fazer o upload deste PDF. Ele tem 34 MB, mas defini meu tamanho máximo de anexo para 100 MB (nas configurações de administrador e no app.yml). O estranho é que tenho uma versão compactada que tem 16 MB e ela é carregada sem problemas. Mas talvez o PDF maior seja simplesmente muito complexo por enquanto? Há muitas imagens, equações, etc.
Olá @sam,
Estou tendo problemas para fazer upload e indexar os PDFs com este erro: Job exception: undefined method `length’ for nil.
Gostaria de saber se o erro está relacionado às configurações que discutimos acima.
A interface fica travada em 0% de indexação, sem avançar.
Os detalhes da exceção estão abaixo:
/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'
Recebo este erro quando peço ao bot para resumir o conteúdo de alguns PDFs no meu site. Não ativei o processamento aprimorado e estou usando o GPT 4.1. Alguma ideia do que estou fazendo de errado?
Desculpe, parece que nosso sistema encontrou um problema inesperado ao tentar responder.
Detalhes do erro
{
“error”: {
“message”: “Uma mensagem do assistente com ‘tool_calls’ deve ser seguida por mensagens de ferramenta respondendo a cada ‘tool_call_id’. Os seguintes tool_call_ids não tiveram mensagens de resposta: call_nrDCba5mt83oavbXfPq2BtEV”,
“type”: “invalid_request_error”,
“param”: “messages.[2].role”,
“code”: null
}
}