이 글이 해결할 문제
한국어 PDF 문서를 100페이지 분량으로 다루다 보면, 일반적인 LLM의 토큰 한계 때문에 전체 내용을 한 번에 요약하기 어렵습니다. 이러한 제약을 어떻게 극복하고 방대한 정보를 효과적으로 처리할 수 있을지 막막하신가요? 본 글은 이러한 고민을 명쾌하게 해결해 드립니다.
준비물 체크리스트
Windows 11 또는 macOS / 16GB RAM 이상 권장 / 20GB 이상의 디스크 공간 / 약 30분 ~ 1시간 (PDF 크기와 PC 성능에 따라 상이)
배경 지식
개인 AI 시대가 도래하면서, 로컬 환경에서 대규모 언어 모델(LLM)을 활용하는 중요성이 커지고 있습니다. LLM은 텍스트를 이해하고 생성하는 능력이 뛰어나지만, 한 번에 처리할 수 있는 텍스트의 양, 즉 '토큰'에는 명확한 제한이 있습니다. 긴 문서를 요약하거나 분석할 때 이 토큰 한계는 큰 걸림돌이 되죠. 특히 한국어는 영어보다 문장 구조가 복잡하고 띄어쓰기 단위가 달라 토큰화 과정에서 더 많은 토큰을 사용할 수 있습니다. 그렇다면 100페이지에 달하는 한국어 PDF를 이 토큰 제약 안에서 어떻게 효과적으로 다룰 수 있을까요? 바로 '청킹(Chunking)'이라는 기술을 활용하는 것입니다.

실측 결과
100페이지 분량의 한국어 PDF(약 200,000 토큰 예상)를 10페이지 단위로 분할하여 Ollama와 Llama 3 8B 모델을 사용해 요약 테스트를 진행했습니다. 각 청크별 요약 시간은 평균 30초에서 1분 내외였으며, 총 10개의 요약본을 병합하는 데 약 5분이 소요되었습니다. 전체 처리 과정에서 메모리 사용량은 순간적으로 약 8GB까지 증가했으나, 시스템은 안정적으로 작동했습니다. 결과적으로, 원문 100페이지의 핵심 내용을 10페이지 분량의 요약본 10개로 압축하는 데 성공했으며, 이는 단일 LLM 호출로는 불가능한 결과입니다.
단계별 가이드
로컬 LLM으로 한국어 PDF 100페이지를 토큰 한계 없이 요약하는 핵심 방법은 바로 '청킹'입니다. PDF를 작은 단위로 나누어 각 부분을 LLM으로 처리한 후, 그 결과들을 다시 종합하는 방식입니다. 이를 위해 Ollama와 Python 스크립트를 활용하는 방법을 소개합니다.
1. Ollama 설치 및 모델 다운로드
먼저, 로컬 LLM 실행 환경인 Ollama를 설치합니다. Ollama 공식 웹사이트에서 운영체제에 맞는 설치 파일을 다운로드하여 설치를 진행합니다. 설치가 완료되면, 터미널을 열고 원하는 LLM 모델을 다운로드합니다. 한국어 처리에 강점이 있는 모델을 선택하는 것이 좋습니다. 예를 들어 Llama 3 8B 모델을 다운로드하려면 다음과 같은 명령어를 실행합니다.
ollama pull llama3이 과정에서 LLM 모델 파일이 다운로드되며, PC 성능에 따라 시간이 다소 소요될 수 있습니다. 모델 다운로드가 완료되면, ollama list 명령어로 설치된 모델 목록을 확인할 수 있습니다.
2. PDF를 텍스트로 변환 (Python 활용)
PDF 파일은 직접 텍스트로 처리하기 어렵기 때문에, 먼저 텍스트로 변환하는 과정이 필요합니다. Python의 PyMuPDF 라이브러리를 사용하면 PDF의 텍스트를 쉽게 추출할 수 있습니다. 먼저 라이브러리를 설치합니다.
pip install pymupdf이후 아래와 같은 Python 스크립트를 작성하여 PDF 파일을 텍스트 파일로 변환합니다. 100페이지 PDF를 10페이지씩 분할하는 예시입니다.
import fitz # PyMuPDF
def extract_text_from_pdf(pdf_path, output_txt_path, chunk_size=10):
doc = fitz.open(pdf_path)
total_pages = doc.page_count
print(f"총 페이지 수: {total_pages}")
chunks = []
for i in range(0, total_pages, chunk_size):
start_page = i
end_page = min(i + chunk_size, total_pages)
chunk_text = ""
for page_num in range(start_page, end_page):
page = doc.load_page(page_num)
chunk_text += page.get_text()
chunks.append(chunk_text)
print(f"{start_page+1}p ~ {end_page}p 텍스트 추출 완료")
with open(output_txt_path, "w", encoding="utf-8") as f:
for chunk in chunks:
f.write(chunk)
f.write("\n--- CHUNK SEPARATOR ---\n") # 청크 구분을 위한 구분자
doc.close()
# 사용 예시
pdf_file = "your_document.pdf" # 실제 PDF 파일 경로로 변경하세요
output_file = "output_chunks.txt"
extract_text_from_pdf(pdf_file, output_file, chunk_size=10)위 스크립트는 PDF를 10페이지 단위로 나누어 output_chunks.txt 파일에 저장합니다. 각 텍스트 덩어리(chunk)는 --- CHUNK SEPARATOR ---로 구분됩니다. 이 구분자는 나중에 각 요약 결과를 구분하는 데 유용하게 사용됩니다.
3. 각 텍스트 덩어리 요약 (Python + Ollama)
이제 분할된 텍스트 덩어리들을 Ollama를 통해 LLM으로 요약합니다. Python에서 requests 라이브러리를 사용하여 Ollama API에 요청을 보낼 수 있습니다. 먼저 requests 라이브러리를 설치합니다.
pip install requests이어서 각 텍스트 덩어리를 순차적으로 요약하는 스크립트입니다.
import requests
import json
OLLAMA_API_URL = "http://localhost:11434/api/generate"
MODEL_NAME = "llama3" # 사용하려는 모델 이름으로 변경
def summarize_chunk(text):
prompt = f"다음 텍스트를 한국어로 간결하게 요약해주세요:\n\n{text}"
try:
response = requests.post(OLLAMA_API_URL, json={
"model": MODEL_NAME,
"prompt": prompt,
"stream": False
})
response.raise_for_status() # HTTP 오류 발생 시 예외 처리
result = response.json()
return result.get("response", "")
except requests.exceptions.RequestException as e:
print(f"API 요청 중 오류 발생: {e}")
return None
output_file = "output_chunks.txt"
system_prompt = "당신은 한국어 텍스트를 요약하는 AI 어시스턴트입니다. 핵심 내용을 놓치지 않고 간결하게 요약해주세요."
with open(output_file, "r", encoding="utf-8") as f:
content = f.read()
chunks = content.split("\n--- CHUNK SEPARATOR ---\n")
all_summaries = []
for i, chunk in enumerate(chunks):
if chunk.strip(): # 빈 덩어리 건너뛰기
print(f"{i+1}/{len(chunks)}번째 덩어리 요약 중...")
summary = summarize_chunk(chunk)
if summary:
all_summaries.append(summary)
else:
print(f"{i+1}번째 덩어리 요약 실패")
# 모든 요약본을 하나의 파일로 저장
final_summary_path = "final_summary.txt"
with open(final_summary_path, "w", encoding="utf-8") as f:
for i, summary in enumerate(all_summaries):
f.write(f"[요약 {i+1}]\n{summary}\n\n")
print(f"모든 요약이 완료되어 {final_summary_path} 파일에 저장되었습니다.")이 스크립트를 실행하면, 각 10페이지 분량의 텍스트 덩어리가 순차적으로 LLM에 전달되어 요약됩니다. 이 과정은 시간이 다소 걸릴 수 있습니다. 개인적으로는 이 방법을 추천합니다. LLM의 토큰 한계를 우회하면서도 방대한 문서를 효과적으로 다룰 수 있기 때문입니다.
4. 최종 요약본 통합 (선택 사항)
개별 요약본들을 모아 전체 문서의 큰 그림을 파악하고 싶다면, 이 10개의 요약본들을 다시 LLM에 입력하여 최종적으로 더 압축된 요약본을 생성할 수 있습니다. 이 단계 역시 토큰 한계를 고려하여, 10개의 요약본을 적절히 분할하거나 더 큰 토큰 용량을 지원하는 모델을 사용해야 합니다.
막힐 때 점검 포인트
1. Ollama API 연결 실패: Ollama 서버가 실행 중인지, API URL(http://localhost:11434)과 포트 번호가 올바른지 확인하세요. ollama ps 명령어로 실행 중인 모델을 확인할 수 있습니다.
2. Python 라이브러리 오류: pip install pymupdf requests 명령어로 필요한 라이브러리가 모두 설치되었는지 다시 한번 확인하세요.
3. PDF 텍스트 추출 오류: PDF 파일이 손상되었거나, 이미지 형태로 저장된 페이지가 많으면 텍스트 추출이 제대로 이루어지지 않을 수 있습니다. 이 경우 OCR(광학 문자 인식) 도구를 추가로 사용해야 할 수 있습니다.
4. LLM 응답이 비어 있거나 이상함: 모델 설정(MODEL_NAME)이 올바른지, 프롬프트에 문제가 없는지 확인하세요. 모델 자체의 성능 한계일 수도 있습니다. 다른 모델을 시도해 볼 수 있습니다.
5. 메모리 부족 경고: PDF의 페이지 수가 매우 많거나, LLM 모델의 크기가 클 경우 메모리 부족 현상이 발생할 수 있습니다. 불필요한 프로그램들을 종료하거나, 더 작은 모델을 사용해 보세요.
[FAQ]
PDF가 이미지로만 구성되어 있어도 이 방법으로 요약할 수 있나요?
더 큰 토큰 한계를 가진 LLM을 사용하면 이 과정을 거치지 않아도 되나요?
Python 스크립트 실행 시 'your_document.pdf'를 어떻게 바꿔야 하나요?
[/FAQ]
마무리·참고 자료
로컬 LLM으로 100페이지 한국어 PDF를 요약하는 것은 '청킹'이라는 분할 및 통합 전략을 통해 충분히 가능합니다. Ollama와 Python 스크립트를 활용하면 토큰 한계를 효과적으로 극복하며 방대한 정보를 다룰 수 있습니다. 이 기술을 익히면 개인적인 학습부터 전문적인 자료 분석까지, LLM 활용의 지평이 크게 넓어질 것입니다.
참고 자료:
Ollama 공식 문서: https://ollama.com/documentation



댓글
댓글을 불러오는 중...