문서와 논문을 요약하는 AI 연구원
PDF 문서 전처리하기
인공지능이 pdf 파일을 이용해서 뭔가를 작업하려면 전처리과정 (별도처리) 이 필요하다.
PDF 파일을 텍스트 파일로 변환하기
터미널에서 PyMuPDF 패키지를 설치한다.
$> uv add PyMuPDF
테스트용 pdf 파일을 다운로드 받아, 적당한 위치에 넣고, 전처리를 해보자.
(나는 https://ksae.re.kr/html/sub04-01.asp 여기 논문 중 아무거나 다운로드 하였고, 파일명은 sample.pdf 로 변경했다. -> 블로그에도 첨부)
import pymupdf
import os
pdf_file_path = "sample.pdf"
doc = pymupdf.open(pdf_file_path)
full_text = ''
for page in doc:
text = page.get_text()
full_text += text
pdf_file_name = os.path.basename(pdf_file_path)
pdf_file_name = os.path.splitext(pdf_file_name)[0]
txt_file_path = f"{pdf_file_name}.txt"
with open(txt_file_path, 'w', encoding='utf-8') as f:
f.write(full_text)
$> uv run sampleParse.py

그럭저럭 텍스트는 잘 뽑아줬는데, 헤더, 본문, 푸터 같은 부분들이 섞여서 정돈되지 않은듯 보인다. 헤더/푸터는 제거해 보자
import pymupdf
import os
pdf_file_path = "sample.pdf"
doc = pymupdf.open(pdf_file_path)
header_height = 80
footer_height = 80
full_text = ''
for page in doc:
rect = page.rect
header = page.get_text(clip=(0, 0, rect.width, header_height))
footer = page.get_text(clip=(0, rect.height - footer_height, rect.width, rect.height))
text = page.get_text(clip=(0, header_height, rect.width, rect.height - footer_height))
full_text += text + '\n-----------------------------------\n'
pdf_file_name = os.path.basename(pdf_file_path)
pdf_file_name = os.path.splitext(pdf_file_name)[0]
txt_file_path = f"{pdf_file_name}.txt"
with open(txt_file_path, 'w', encoding='utf-8') as f:
f.write(full_text)

clip 을 통해서, 일정 부분을 짤라내고 페이지 마다 ---------- 를 삽입했다. 근데 좌표값은 정해져 있는건가?
(이거는 그냥.. 파이썬으로 pdf 파싱하는 방법을 하는거 아닌가 -_-;; 알아야 하나)
이렇게 전처리 (pdf -> txt) 를 통해 얻어진 txt 파일을 인공지능에게 주고, 특정한 지시를 할 수 있다. 즉, 우리가 쓰는 인공지능은 텍스트가 아니면 못알아 먹는다는 의미이다. 클로드가 GPT 는 첨부파일을 통해 알아먹는 것처럼 보이지만, 그렇지 않고, 죄다 텍스트로 변환해서 확인하는 것으로 추정한다. 아마 이미지 파일도 텍스트 변환 후 인식하지 싶다.
논문을 요약해 주는 AI 연구원 완성하기
텍스트 파일을 추출 했으니, 문서내용을 요약해 보자
텍스트 요약 프롬프트 만들기
import ollama
import os
from dotenv import load_dotenv
load_dotenv()
ollama_host = os.getenv("OLLAMA_HOST", "http://localhost:11434")
def summarize_txt(file_path: str):
client = ollama.Client(host=ollama_host)
with open(file_path, 'r', encoding='utf-8') as f:
txt = f.read()
system_prompt = f'''
너는 다음 글을 요약하는 봇이다. 아래 글을 읽고, 저자의 문제 인식과 주장을 파악하고, 주요 내용을 요약하라.
작성해야 하는 포맷은 다음과 같다.
# 제목
## 저자의 문제 인식 및 주장 (15문장 이내)
============= 이하 텍스트 ================
{ txt }
'''
# print(system_prompt)
# print('====================================')
response = client.chat(
model="gemma3:4b",
options={ "temperature": 0.1, "num_ctx": 16384 },
# num_ctx (컨텐스트 윈도우): 입력 + 출력 생성을 합친 전체 토큰 한도. 물리적으로 가능한 상한선
# num_predict (생성 토큰 제한): 모델이 한번에 생성할 수 있는 최대 토큰 수 기본값 -1 (무제한). 내가 원하는 답변의 상한선
messages= [
{ "role": "system", "content": system_prompt }
]
)
return response.message.content
if __name__ == '__main__':
file_path = 'sample.txt'
summary = summarize_txt(file_path)
print(summary)
with open('./sample_summary.txt', 'w', encoding='utf-8') as f:
f.write(summary)
변환된 sample.txt 에 대한 요약본을 sample_summary.txt 로 생성지시를 했고, temperature 도 정확도를 높이는게 좋을 거 같아 0.9 에서 0.1 로 변경했다.
요약이 정확하게 됐는지는 모델마다 다를테니, 의미가 없고, 지시된 내용이 지켜줬는지 확인해보면 제목 출력하고, 요약본 밑에 추가해 주었기 때문에, 제대로 생성되었다. 신기방기

물론, 헤더푸터도 넣고, 한줄로 작성된 문서도 분기하고 등등의 문서 포맷을 다듬을 수 있겠지만, 이건 인공지능과 무관하게 파이썬 코딩실력인 것이니, 무시하겠다.