Discourse AI(RAG)의 PDF 지원

:bookmark: 이 가이드에서는 discourse-ai 내에서 PDF 처리 기능을 구현하고 사용하는 방법에 대해 설명합니다. 기본 텍스트 추출과 LLM을 활용한 향상된 처리 모두를 포함합니다.

:person_raising_hand: 필요한 사용자 권한: 관리자

요약

discourse-ai 플러그인은 RAG(검색 증강 생성)를 위해 두 가지 서로 다른 모드로 PDF 처리를 지원합니다:

  1. 기본 텍스트 추출
  2. LLM 분석을 활용한 향상된 처리

기본 텍스트 추출

이 모드는 기본적인 PDF 처리 기능을 제공합니다:

  • pdf-reader 제보를 사용하여 텍스트 콘텐츠를 추출합니다.
  • 최대 100MB까지의 파일을 지원합니다.
  • 플러그인 설치 후 즉시 사용할 수 있습니다.
  • 텍스트 전용 콘텐츠만 처리합니다(시각적 요소는 무시됨).

LLM을 활용한 향상된 처리

:information_source: 이 모드는 특정 설정이 필요하며 더 고급 기능을 제공합니다.

요구 사항:

  • 엔터프라이즈 플랜 구독 또는 자체 호스팅 Discourse
  • 컨테이너에 Ghostscript 지원이 포함된 ImageMagick 설치
  • ai_rag_images_enabled 사이트 설정 활성화 (숨겨진 설정 — Rails 콘솔을 통해 설정해야 함)
  • AI 에이전트 또는 도구에서 RAG LLM 모델 구성

기능:

  • 이미지, 차트, 다이어그램 해석
  • 시각적 요소에서 컨텍스트 제공
  • PDF를 페이지별로 처리
  • 100MB 파일 크기 제한 유지
  • LLM 기반 텍스트 추출을 통해 RAG 인덱싱을 위한 이미지 파일(png, jpg, jpeg) 업로드 활성화

구현 세부 사항

처리 사양

  • 페이지 처리 해상도: 300 DPI
  • 페이지별 이미지 변환 타임아웃: 30초
  • 임시 파일 자동 정리
  • RAG 문서 임베딩과의 완전한 통합

처리 워크플로

  1. PDF 업로드 및 검증
  2. 콘텐츠 추출(기본 또는 향상된 모드)
  3. 구성 가능한 오버랩을 가진 텍스트 청킹
  4. 청크 임베딩 및 저장
  5. MessageBus를 통한 진행 상황 추적

제한 사항

:warning: PDF 처리를 구현할 때 다음 제약 사항을 유의하십시오:

  • 파일 크기 제한:
    • 기존 PDF 처리: 100MB
    • 새 관리자 인터페이스 업로드: 20MB
  • 향상된 모드는 추가적인 시스템 리소스가 필요합니다.
  • 복잡한 PDF 레이아웃은 완벽하게 해석되지 않을 수 있습니다.
  • 향상된 처리는 처리 시간을 크게 증가시킵니다.

관련 문서:

13개의 좋아요

정말 놀라운 소식입니다. 팀 여러분, 감사합니다! 향상된 처리가 완료되는 날을 기다리고 있습니다. 이는 LLM에 연구 논문을 공급하는 데 결정적으로 중요할 것입니다.

또한, AI 봇의 개인 메시지나 토픽/게시물에 PDF를 업로드하고 봇을 멘션하여 RAG 방식의 "PDF와 대화하기"를 사용할 수 있도록 할 계획이 있나요?

2개의 좋아요

@sam 이 훌륭한 옵션을 설명하는 간단한 영상을 제공해 주실 수 있을까요? 언급하신 내용이 구현하기에 충분히 명확하지 않아서요.

1개의 좋아요

이 설정을 어디서 찾을 수 있을까요?

이것은 숨겨진 설정입니다. 콘솔을 사용해야 하며, 컨테이너도 구성해야 합니다. 몇 주 더 기다리시는 것을 권장합니다.

4개의 좋아요

감사합니다. 훌륭한 작업에 진심으로 감사드립니다.

제 웹사이트(아랍어 포럼)에서 아랍어로 테스트를 진행했습니다. 첫 번째 게시글인 "토픽"에 입법 관련 내용을 추가한 후, AI를 이용해 질문을 던졌는데, 답변이 정확하지 않았습니다. 이 문제는 컨텍스트 레거링(Context RAGging)이 제대로 적용되지 않아서라고 생각합니다.

죄송하지만 그 방식으로는 작동하지 않습니다. 페르소나나 도구를 정의한 후, 거기에 업로드를 추가해야 합니다.

여기서 “업로드 및 질문” 기능에 대한 논의가 이루어지고 있습니다: Upload and discuss pdfs in composer 하지만 아직 해당 기능이 지원되지 않습니다.

1개의 좋아요

우선, 정말 훌륭한 작업에 감사드립니다. 정말 마음에 듭니다.

설정을 이것저것 조정해 보고 AI 모델을 Gemini-Flash-2.0으로 변경한 후, 제 환경에서는 아주 잘 작동했습니다. 현재 저희 상황은 다음과 같습니다:

저희는 감사인, 회계사, 세무 컨설턴트로 구성된 커뮤니티이며, 관련 법규를 공유하고 이에 대한 논의를 촉발할 도구가 필요했습니다. 저희가 해당 분야 전문가이므로, 이러한 논의는 방문자들에게 매우 유용할 것입니다. 저희는 AI 모델이 법규를 검토하고 분석하며, 저희의 질문에 답변하도록 설정했습니다. 이 훌륭한 실험을 통해 첫 번째 게시물에 추가된 맥락에 대해 실제로 논의할 수 있으며, AI 모델이 충분히 지능적이라면 매우 높은 품질의 출력으로 저희 질문에 답변할 수 있다는 결론에 도달했습니다.
다시 한번 감사드리며, PDF 지원이 추가되면 Discourse가 최고의 포럼 소프트웨어가 될 것이라고 생각합니다.

3개의 좋아요

최신 discourse 이미지는 고급 모드를 지원합니다. 테스트를 원하시는 분은 자유롭게 시도해 보세요.

2개의 좋아요

콘솔을 통해 활성화해야 하나요? UI에서 고급 모드 옵션을 찾을 수 없습니다.

또한, 이 PDF를 업로드하려고 할 때 오류가 발생합니다. 파일 크기는 34MB이지만 최대 첨부 파일 크기는 100MB로 설정되어 있습니다(관리자 설정과 app.yml 모두). 이상한 점은 압축 버전(16MB)은 정상적으로 업로드된다는 것입니다. 하지만 아마도 더 큰 PDF가 현재로서는 너무 복잡하기 때문일까요? 이미지, 수식 등이 많이 포함되어 있습니다.

네, 활성화하려면 Rails 콘솔에서 SiteSetting.ai_rag_images_enabled = true를 설정해야 합니다.

1개의 좋아요

컨테이너 내에서도 nginx 설정을 변경해야 거부되지 않을 것 같습니다.

1개의 좋아요

Hi @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 자체에는 꽤 익숙합니다.

현재 단계에서는 특정 사용 사례를 데모 형태로 직접 체험해 보고 싶습니다.

hidden 사이트 설정을 활성화해 두었습니다.

SideKiq에서 보이는 것이 아무것도 없습니다. 이것이 실제로 작동하는지 어떻게 확인할 수 있을까요?

이것이 아직 정식 출시 전의 기능이며 본격적인 사용을 위한 준비가 되지 않았다는 점은 알고 있습니다. 하지만 직접 경험하고 테스트해 볼 수 있다면 좋겠습니다.

이 기능을 시험해 보고 계신 분들의 힌트, 팁, 스크린샷, 또는 레시피(구체적인 설정 방법)를 정말 많이 기대하고 있습니다.

사이트에 있는 몇 가지 PDF의 내용을 요약해 달라고 봇에게 요청할 때 이 오류가 발생합니다. 향상된 처리(enhanced processing)는 활성화하지 않았고, GPT 4.1을 사용 중입니다. 제가 어디를 잘못하고 있는지 아이디어가 있으신가요?

죄송합니다. 시스템이 답변을 시도하는 동안 예상치 못한 문제가 발생했습니다.

오류 세부 정보

{
“error”: {
“message”: “‘tool_calls’가 포함된 어시스턴트 메시지 다음에는 각 ‘tool_call_id’에 응답하는 도구(tool) 메시지가 따라와야 합니다. 다음 tool_call_id에 대한 응답 메시지가 없습니다: call_nrDCba5mt83oavbXfPq2BtEV”,
“type”: “invalid_request_error”,
“param”: “messages.[2].role”,
“code”: null
}
}

PDF 지원 기능의 현재 상태를 여쭤봐도 될까요? :face_with_peeking_eye:

1개의 좋아요

app.yml에서 업로드 크기를 설정하면 사이트 전체에 적용되므로, 각 Persona에 적용됩니다.

1개의 좋아요

이 문제에 대해 업데이트가 있나요? AI와 대화를 시작할 때 PDF를 첨부하고 있지만, 여전히 인식되지 않는 것 같습니다. 현재 GPT를 사용 중인데, PDF 처리를 위해 특별히 설계된 다른 모델을 고려해야 할까요?

1개의 좋아요