Suporte a PDF no Discourse AI

:bookmark: 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.

:person_raising_hand: 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:

  1. Extração básica de texto
  2. 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

:information_source: 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

  1. Upload e validação de PDF
  2. Extração de conteúdo (modo básico ou aprimorado)
  3. Divisão de texto com sobreposição configurável
  4. Embedding e armazenamento de blocos de texto
  5. Rastreamento de progresso via MessageBus

Limitações

:warning: 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
11 curtidas

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?

1 curtida

@sam Você pode fornecer um vídeo simples para explicar essa ótima opção, porque o que você mencionou não está claro o suficiente para implementar

Configuração do site ai_rag_images_enabled

Onde posso encontrar essa configuração

É uma configuração oculta, você precisa usar o console, mas também precisa configurar o contêiner, recomendo esperar mais algumas semanas.

3 curtidas

Obrigado, aprecio seu trabalho fantástico

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

Desculpe, mas não é assim que funciona, você precisa definir uma persona ou ferramenta e depois adicionar o upload lá.

Houve alguma discussão sobre o suporte a “upload e pergunta” aqui: Upload and discuss pdfs in composer, mas ainda não é suportado.

1 curtida

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.

3 curtidas

A imagem mais recente do discourse suporta o modo avançado, caso alguém queira testar.

2 curtidas

É 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.

Sim, você precisa definir SiteSetting.ai_rag_images_enabled = true no console do Rails para habilitá-lo.

1 curtida

Minha suposição aqui é que algumas coisas do nginx também precisam ser alteradas no contêiner para que ele não rejeite.

1 curtida

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'
1 curtida

Obrigado por esta atualização incrível,
apenas tenho uma dúvida, limite de 100MB para cada Persona AI bot ou para todas as Personas?

Sou novo no Discourse AI, mas tenho experiência com o Discourse em geral.

Estou muito interessado em experimentar isso para um caso de uso específico em forma de demonstração nesta fase.

Ativei a configuração oculta do site.

Não vejo nada no SideKiq. Como posso ver se está funcionando?

Estou ciente de que este é um recurso pré-lançamento e ainda não está pronto para uso geral, no entanto, seria ótimo poder experimentar e testar.

Estou realmente interessado em quaisquer dicas, sugestões, capturas de tela ou receitas de pessoas que estão experimentando isso.

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
}
}

Posso perguntar sobre o status atual do suporte a PDF? :face_with_peeking_eye:

1 curtida

Quando você configura os tamanhos de upload em app.yml, é para todo o site, então se aplica a cada persona.

1 curtida

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?