Este guia explica como implementar e usar as capacidades de processamento de PDF dentro do discourse-ai, incluindo a extração básica de texto e o 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 (Geração Aumentada por Recuperação) 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 capacidades fundamentais de processamento de PDF:
Extrai conteúdo de texto usando a gem pdf-reader
Suporta arquivos de até 100MB
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 capacidades mais avançadas.
Requisitos:
Assinatura do plano Enterprise ou Discourse auto-hospedado
ImageMagick com suporte a Ghostscript instalado no contêiner
Configuração de site ai_rag_images_enabled ativada (oculta — deve ser definida via console Rails)
Um modelo RAG LLM configurado no agente ou ferramenta de IA
Capacidades:
Interpreta imagens, gráficos e diagramas
Fornece contexto a partir de elementos visuais
Processa PDFs página por página
Mantém o limite de tamanho de arquivo de 100MB
Permite upload de arquivos de imagem (png, jpg, jpeg) para indexação RAG via extração de texto baseada em LLM
Detalhes de implementação
Especificações de processamento
Resolução de processamento de página: 300 DPI
Tempo limite de conversão de imagem por página: 30 segundos
Limpeza automática de arquivos temporários
Integração total com embeddings de documentos RAG
Fluxo de trabalho de processamento
Upload e validação do PDF
Extração de conteúdo (modo básico ou aprimorado)
Fragmentação de texto com sobreposição configurável
Embedding e armazenamento de fragmentos
Rastreamento de progresso via MessageBus
Limitações
Esteja ciente destas restrições ao implementar o processamento de PDF:
Restrições de tamanho de arquivo:
100MB para processamento de PDF existente
20MB para novos uploads na interface de administrador
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
}
}
Há alguma atualização sobre este assunto? Estou anexando um PDF ao iniciar uma conversa com a IA, mas ela ainda não parece reconhecê-lo. Atualmente estou utilizando o GPT. Devo talvez considerar empregar um modelo diferente especificamente projetado para processamento de PDF?