1. 리소스 관리: 비용과 시간을 방어하는 SHA 중복 체크
대용량 파일(300p+) 분석은 CPU 자원과 AI 토큰 비용을 대량으로 소모합니다. 엔지니어링의 첫 번째 원칙은 **'하지 않아도 될 일을 하지 않는 것'**입니다.
- 문제 상황: 유저가 동일한 파일을 실수나 확인 차 재업로드할 때마다 분석 엔진(3분 이상 소요)이 중복 가동됨.
- 해결 로직: File Fingerprinting (SHA-256)
- 파일 업로드 즉시 고유한 해시값(SHA)을 추출하여 DB와 대조.
- Hit: 기존 분석 결과를 즉시 반환 (대기 시간 0.1초).
- Miss: 신규 분석 프로세스 진행.
- 인사이트: 인프라가 제한적인 홈서버 환경에서 가장 강력한 방어 로직은 '캐싱'과 '중복 제거'입니다.
2. 사용자 경험: Blocking을 피하는 비동기(Async) 설계
사용자는 10초만 응답이 없어도 서비스가 죽었다고 판단합니다. 3분의 분석 시간을 견디게 하는 것은 기술이 아니라 설계의 묘입니다.
- 문제 상황: 파일 업로드 후 분석 완료까지 HTTP 커넥션을 유지할 경우 타임아웃 발생 및 유저 이탈.
- 해결 로직: Non-blocking 통신 아키텍처
- Java 백엔드가 파일을 수신하고 즉시 접수 ID 발행 후 응답.
- @Async를 통해 백그라운드 스레드에서 Python FastAPI 서버와 통신 시작.
- 분석 완료 시 DB 상태값을 업데이트하거나 알림 전달.
- 인사이트: 무거운 작업은 유저의 시야 밖에서 처리하고, 유저에게는 즉각적인 피드백을 주는 것이 현대 UX의 기본입니다.
3. 기술 스택의 결단: Java의 안정성 vs Python의 분석력
도구에 매몰되지 않고 문제 해결에 가장 적합한 대안을 찾는 과정이 돋보이는 구간입니다.
- 시행착오: 처음엔 Java(PDFBox, Tabula)로 섹션 기반 추출을 시도했으나, 공시 정보 특유의 복합 표(Complex Table) 구조에서 데이터가 완전히 깨짐.
- 의사결정: 라이브러리 내부 소스를 수정하며 시간을 버리는 대신, 분석 엔진을 Python FastAPI 기반의 마이크로서비스로 분리.
- 결과: PDF 파싱 생태계가 압도적인 파이썬 도입을 통해 **'분석 퀄리티'**라는 본질적인 목표 달성.
4. 성능 최적화: 10분에서 3분으로, '데이터 다이어트'
홈서버라는 물리적 한계를 소프트웨어적 전략으로 돌파한 과정입니다.
- 문제 상황: 300페이지 분석 시 Docling 엔진이 10분 이상 소요됨.
- 최적화 전략:
- OCR 비활성화: 텍스트 레이어가 있는 디지털 PDF이므로 픽셀 분석 과정을 과감히 생략.
- Selective Parsing: 유저가 원하는 '요약'과 '전망' 섹션이 포함된 페이지만 타겟팅하여 물리적 처리량(Workload)을 1/10로 감소.
- 결과: 정확도는 유지하면서 처리 시간을 3분 내외로 약 70% 단축.
5. 데이터 엔지니어링: AI의 이해도를 높이는 메타데이터 주입
단순히 글자를 뽑는 것을 넘어, AI가 문맥을 이해할 수 있는 구조를 만드는 과정입니다.
- 전략: 전체 데이터를 단순히 던지지 않고 [부모주제 / 자식주제 / 타이틀] 형식을 메타데이터에 포함.
- 효과: RAG(Retrieval-Augmented Generation) 환경에서 AI가 특정 데이터의 위치와 위계를 명확히 파악하여 답변의 질(Hallucination 방지)이 향상됨.
고민점 및 문제 기록 list
1. 중복해서 파일을 올리면 어떻게 해결할것인가.
-> sha로 중복을 걸러낸다. -> 그리고 그 정보로 이미 있는 결과를 뱉어준다.
2. upload하고 유저는 응답을 기다릴 수 없다. -> 비동기 처리한다.
3. 데이터 정제를 어떻게하면 질 좋게 할 수 있는지 고민했다.
- 전체 데이터에서 섹션을 분리하는건 유효하다고 생각했다.
- 부모주제 / 자식주제 / 타이틀을 메타데이터에 넣어 데이터의 질을 높이고자했다.
3. PDF추출 관련해서 맨처음에는 text와 표를 pdfbox, Tabula를 썻다. 하지만 수치 정보가 중요한 공시정보 표 추출에는 한계가 명확했다.
- 복잡한 표를 추출하지 못했다. 전략적으로 접근이 필요해 사용하기 어렵다.
- 그럼에도 불구하고 위 2가지를 써보려했다. 처음 시도는 섹션 기반 추출이였다.
- 그러나 섹션이 또 길어지는 경우는 문제가 생기며 표가 잘 들어가지도 않았다.
- 문제 원인을 파악했을때 내부 라이브러리를 확인해야했는데 내부로직을 확인하는것보다 더 좋은 도구인 fastAPI를 넣는게 시간 효율이 좋아서 위의 2개를 버리기로했다.
- 버리고 파이썬으로 fastAPI를 통해 결과를 받았다. 외부 라이브러리는 파이썬이 압도적으로 성능이 좋은것같다. 여기서 성능은 분석 퀄리티를 말한다.
4. 파이썬 docling은 반기/분기 공시는 300페이지가 넘어서 PDF를 분석하는데 10분이상 걸렸다.
- 그래서 이를 빠르게 하기위해 옵션을 좀 만지고 page 자체를 줄였다. 내가 원하는건 요약과 전망정도였으니 그와 관련된 섹션만 가져와서 읽으면되고 또 ocr문서는 취급하지 않을것이기 때문에 ocr기능도 껏다.
- 이러면 약 3분정도 걸렸다. 컴퓨터 성능이 빵빵하면 서버를 늘려 배치처리하며 빠르게 추출할텐데 홈서버라 우선 보수적으로 접근했다.
다음에 기억할것
- AI에게서 어떤 일을 시킬지 또 AI에게 무엇을 데이터로 줄지 정제하는 과정이 필요하다. 전부 다 해주는 AI는 아직 없다.
- 300페이지를 ai로 분석하는건 엄청 비용이 비싸다 컴퓨터가 좋다면 빠르게 훅훅하겠지만 앞으로 아무거나 막 넣지말고 내가 하고자 하는 기능에 AI혹은 코드로 1차 필터링을 해야한다. 성능 좋은 컴터있어도 쓸데 없는걸 넣을 이유는 없으니까!
'Archive(완료된 내용) > 포트폴리오 강화' 카테고리의 다른 글
| [Stock101] 프론트를 재정비하자.- 8일차 (1) | 2026.01.29 |
|---|---|
| [stock101] 프론트앤드 구조를 잘 만들어야 관리가 쉽다. (0) | 2026.01.29 |
| [Stock101]PDF 내용 요약 구현 - 7일차 (1) | 2026.01.27 |
| [Stock101] RAG PDF내용 요약과 전망을 도출하자 - 6일차 (0) | 2026.01.26 |
| [Stock101] PDF 데이터 추출이 1회 만에 멈췄던 이유 - 5일차 (0) | 2026.01.26 |