LLM을 이용해 텍스트 요약 애플리케이션 구축하기
요약
Oxlo.ai와 OpenAI SDK를 활용하여 긴 문서를 구조화된 핵심 내용으로 변환하는 텍스트 요약 애플리케이션 구축 방법을 소개합니다. 맵-리듀스(Map-Reduce) 파이프라인을 통해 컨텍스트 창 제한 문제를 해결하고 비용 효율적으로 긴 문서를 처리하는 가이드를 제공합니다.
핵심 포인트
- Oxlo.ai의 요청 기반 가격 책정을 통한 비용 절감
- OpenAI SDK 호환성을 이용한 손쉬운 클라이언트 설정
- 맵-리듀스 방식을 활용한 긴 문서 청킹 및 요약 전략
- Llama, Qwen, DeepSeek 등 다양한 모델 교체 가능성
우리는 기사, 녹취록, 보고서를 제목, 짧은 단락, 세 개의 글머리 기호로 구성된 구조화된 핵심 내용으로 변환하는 명령줄(command-line) 요약기를 만들 것입니다. 이는 대량의 텍스트를 처리해야 하지만 인프라 관리가 어려운 분석가, 제품 관리자, 개발자에게 유용합니다. 우리는 Oxlo.ai에서 이를 실행할 것입니다. 왜냐하면 요청당 고정 가격 책정이 긴 문서 청킹(long-document chunking)을 저렴하게 유지해주고, OpenAI와 호환되는 SDK 덕분에 클라이언트 라이브러리 변경이 필요 없기 때문입니다.
필요한 것들
- Python 3.10 이상
- https://portal.oxlo.ai에서 받은 Oxlo.ai API 키
- OpenAI SDK:
pip install openai
Step 1: Oxlo.ai 클라이언트 설정
summarizer.py라는 파일을 만들고 클라이언트를 초기화합니다. 엔드포인트가 활성화되었는지 확인하기 위해 간단한 호출을 할 것입니다.
from openai import OpenAI
client = OpenAI(base_url="https://api.oxlo.ai/v1", api_key="YOUR_OXLO_API_KEY")
...
Step 2: 시스템 프롬프트 작성
출력 구조를 상수로 정의하여 비즈니스 로직을 건드리지 않고도 쉽게 수정할 수 있도록 합니다. 결과가 읽기 쉽도록 제목, 한 단락 요약, 세 개의 글머리 기호를 요청합니다.
SYSTEM_PROMPT = """당신은 정밀한 요약 엔진입니다. 주어진 텍스트를 바탕으로 정확히 다음을 생성하세요:
1. 10단어 이하의 제목.
...
Step 3: 핵심 요약 함수 구축
API 호출을 재사용 가능한 summarize() 헬퍼로 감쌉니다. 저는 범용성이 뛰어난 모델인 llama-3.3-70b를 기본값으로 사용하지만, 다국어 지원이 필요하거나 무료 티어에서 실험하고 싶다면 qwen-3-32b 또는 deepseek-v3.2로 교체할 수 있습니다.
from openai import OpenAI
client = OpenAI(base_url="https://api.oxlo.ai/v1", api_key="YOUR_OXLO_API_KEY")
...
Step 4: 긴 문서 청킹 및 각 부분 요약하기
Step 4: 긴 문서 청킹 및 각 부분 요약하기
실제 문서는 종종 컨텍스트 창(context window)을 초과합니다. 표준 해결책은 맵-리듀스 파이프라인(map-reduce pipeline)입니다. 즉, 텍스트를 중첩된 청크(overlapping chunks)로 분할하고, 각 청크를 독립적으로 요약한 다음, 그 결과를 병합하는 방식입니다. Oxlo.ai에서는 이 방법이 특히 실용적인데, 플랫폼이 요청 기반 가격 책정(request-based pricing)을 사용하기 때문입니다. 짧은 프롬프트를 보내든 매우 긴 프롬프트를 보내든, 요청당 비용은 토큰 수에 따라 증가하지 않습니다. 따라서 장문의 문서를 청크로 분할해도 토큰 기반 제공업체처럼 청구서가 부풀려지지 않습니다. 현재 플랜 세부 정보는 https://oxlo.ai/pricing를 참조하세요.
def chunk_text(text: str, chunk_size: int = 3000, overlap: int = 200) -> list[str]:
words = text.split()
chunks = []
...
Step 5: 부분 요약들을 최종 결과로 통합하기
맵(map) 단계를 거치면 여러 개의 부분 요약본을 얻게 됩니다. 이 부분 요약본들을 하나의 컨텍스트 창으로 모델에 다시 입력하여 일관성 있는 결과를 도출합니다. 저는 여기서 qwen-3-32b를 사용했는데, 이는 긴 컨텍스트 추론(long-context reasoning) 처리가 뛰어나기 때문입니다. 하지만 Oxlo.ai의 어떤 모델을 사용해도 무방합니다.
REDUCE_PROMPT = """You are a senior editor. Given the following partial summaries of a longer document, write a single, unified summary. Preserve the same structure: title, one-paragraph summary, and three key takeaways. Resolve any contradictions and remove redundancy."""
def consolidate(partials: list[str], model: str = "qwen-3-32b") -> str:
...
Step 6: CLI 인터페이스 추가하기
argparse를 사용하여 어떤 .txt 파일이든 이 도구로 파이프(pipe)할 수 있게 합니다. 스크립트는 4,000단어 미만의 입력에 대해서는 자동으로 청킹을 건너뜁니다.
import argparse
def main():
...
실행하기
article.txt라는 이름으로 긴 기사를 저장한 다음, 다음 명령어를 실행하세요:
$ python summarizer.py article.txt --model llama-3.3-70b --reduce-model qwen-3-32b
예시 출력:
Processing chunk 1 of 3...
Processing chunk 2 of 3...
Processing chunk 3 of 3...
...
다음 단계
다음 단계
출력을 JSON 모드로 전환하려면 response_format={"type": "json_object"}를 설정하고, 다운스트림 도구들이 제목(title), 요약(summary), 그리고 글머리 기호(bullets)를 프로그래밍 방식으로 파싱할 수 있도록 프롬프트를 업데이트해야 합니다. 또는 FastAPI 엔드포인트 뒤에 배치하여 Oxlo.ai 무료 티어에서 deepseek-v3.2를 사용하여 호스팅할 수 있습니다. 이 모델은 하루 60개의 요청을 포함하며 선불 신용카드 등록이 필요하지 않습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기