LLM 프롬프트 압축
LLM 프롬프트 압축을 위한 바른 분절 활용
LLM API 비용과 컨텍스트 한계는 모두 토큰 수에 달려 있습니다.
한국어 문장에는 조사·어미·접속 표현처럼 의미는 보존하면서 토큰만 차지하는 요소가 많습니다.
바른의 형태소 분석으로 이런 기능 형태소를 골라 줄이면, 의미를 크게 해치지 않으면서
프롬프트 토큰을 절감할 수 있습니다.
문제 상황
- 긴 참고 문서를 프롬프트에 넣다 보면 컨텍스트 한계를 초과합니다.
- 조사·어미가 반복되어 핵심 정보 대비 토큰 효율이 낮습니다.
- 단순히 글자를 자르면 문장이 깨져 LLM이 오해합니다.
바른을 어떻게 적용하나
핵심 정보를 담는 체언·용언 원형은 남기고, 의미 손실이 적은 조사(J)·일부 어미(E)·기호(S) 를 선택적으로 제거합니다. 어절을 이런 8대 형태 단위로 분해하기 때문에 품사 기준으로 안전하게 골라낼 수 있습니다. 압축은 "참고용 컨텍스트"에만 적용하고, 사용자에게 보여줄 최종 답변 생성에는 원문 지시를 그대로 두는 것이 안전합니다.
graph TD
DOC[원문 컨텍스트] --> TAG[바른 형태소 분석];
TAG --> KEEP[체언·용언 원형 유지];
TAG --> DROP[조사·일부 어미·기호 제거];
KEEP --> COMP[압축된 키워드 컨텍스트];
DROP --> COMP;
COMP --> LLM[LLM 프롬프트];
from bareunpy import Tagger
tagger = Tagger("koba-XXXX-...", "localhost")
# 의미 손실이 적은 기능 형태소 품사
DROP_TAGS = {"JKS", "JKC", "JKG", "JKO", "JKB", "JKV", "JKQ",
"JX", "JC", "EF", "EC", "EP", "SF", "SP", "SE"}
def compress(text: str) -> str:
"""조사·일부 어미·기호를 걷어내 컨텍스트를 압축합니다."""
res = tagger.tags([text])
kept = [m for m, t in res.pos() if t not in DROP_TAGS]
return " ".join(kept)
src = "인공지능 모델은 대규모 데이터를 학습하여 성능을 높입니다."
print("원문:", src)
print("압축:", compress(src))
핵심 명사·용언은 모두 살아 있고, 조사·종결어미가 제거되어 토큰이 줄었습니다.
결과와 이점
| 항목 | 원문 | 압축 후 |
|---|---|---|
| 핵심 의미 | 유지 | 유지 |
| 조사·어미 | 포함 | 제거 |
| 토큰 수 | 많음 | 줄어듦 |
주의
압축은 의미를 일부 잃을 수 있으므로 참고 컨텍스트에만 쓰세요. 사용자 지시문이나 정확한 인용이 필요한 부분은 원문을 유지해야 합니다.
자주 묻는 질문
Q. 토큰이 얼마나 절감되나요?
문서 성격에 따라 다르지만, 조사·어미 비중이 큰 설명문일수록 절감 폭이 큽니다. 실제 사용하는 토크나이저로 압축 전후 토큰 수를 직접 측정해 적용 여부를 정하세요.
Q. 어떤 품사를 남겨야 안전한가요?
체언(NNG, NNP 등)과 용언 원형(VV, VA), 수사·수량 표현은 남기는 것이 안전합니다. 부정·시제처럼 의미를 바꾸는 어미는 제거 목록에서 빼는 것을 권장합니다.
Q. 압축한 컨텍스트로 LLM이 답을 잘 하나요?
키워드 형태의 컨텍스트도 LLM은 잘 활용합니다. 다만 문장 구조가 중요한 작업(요약·번역)에는 압축을 약하게 적용하거나 원문을 함께 제공하세요.
관련 문서
- 형태소 분석 API(AnalyzeSyntax) — 품사 정보를 받는 분석 API
- 품사 태그표 — 남길/제거할 품사(조사·어미·기호) 판단 기준
- RAG 한국어 chunking — 검색 컨텍스트 구성에 형태소 활용
- 키워드 추출·텍스트 마이닝 — 체언 중심 키워드 구성
Q. 한국어 LLM 프롬프트 토큰 비용을 줄이는 방법이 있나요?
한국어는 조사·어미가 토큰을 많이 차지합니다. 바른 형태소 분석으로 체언·용언 원형은 남기고 의미 손실이 적은 조사·일부 어미·기호를 골라 제거하면, 참고 컨텍스트의 토큰을 줄여 API 비용과 컨텍스트 한계 문제를 함께 완화할 수 있습니다. 부정·시제처럼 의미를 바꾸는 어미는 남겨야 합니다.
도움이 되었나요?