AI Prompt Engineering · 강의

컨텍스트 압축

중요한 내용만 남기도록 컨텍스트 다듬기

레슨 3/413개 단계

컨텍스트 압축은(는) CoddyKit의 무료 AI Prompt Engineering 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AI Prompt Engineering 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AI Prompt Engineering 강의에는 총 4개의 강의가 포함되어 있습니다.

문맥을 압축하는 이유

검색된 청크에는 잡음이 많습니다. 관련 청크라도 대부분이 상투적인 내용이고 핵심이 되는 문장은 하나뿐일 수 있습니다. 문맥 압축은 검색된 텍스트가 생성기에 전달되기 전에 질의에 실제로 답하는 내용만 남기도록 줄입니다.

이 효과는 누적됩니다. 토큰 비용과 지연 시간이 줄고, 방해 요소가 감소하며, 모델이 처리해야 하는 문맥이 짧아져 중간 손실 현상도 완화됩니다.

def compress(query, chunks):
    # Goal: keep only spans that bear on the query,
    # dropping boilerplate, navigation, and off-topic sentences.
    return [extract_relevant(query, c) for c in chunks]

extractive와 추상적 압축 비교

extractive 압축은 질의와 관련된 원문 그대로의 구간(문장, 단락)을 선택하여 정확한 표현과 출처 정보를 보존합니다. 추상적 압축은 바꿔 쓰거나 요약하여 더 높은 압축률을 얻지만, 정보가 손실되거나 새로운 오류가 생길 위험이 있습니다.

인용이 포함된 사실 기반 RAG에서는 주장을 출처까지 추적할 수 있도록 extractive 방식을 우선하십시오. 충실성을 검증할 수 있을 때만 추상적 압축을 사용하십시오.

def extractive(query, chunk):
    sents = split_sentences(chunk.text)
    scored = [(s, relevance(query, s)) for s in sents]
    kept = [s for s, r in scored if r > TAU]
    return ' '.join(kept) or top1(scored)   # never return empty

문장 수준 필터링

가볍고 견고한 기법입니다. 작은 교차 인코더나 임베딩 유사도를 사용하여 각 청크의 각 문장을 질의와 비교해 점수를 매기고, 점수가 낮은 문장을 제거하십시오. 이렇게 하면 가치가 높은 문장은 보존하면서 채우기용 내용은 버릴 수 있습니다.

사실의 의미를 제공하는 주변 문장까지 제거하지 않도록 청크마다 최소한의 문맥을 유지하십시오.

def sentence_filter(query, chunk, keep_ratio=0.4):
    sents = split_sentences(chunk.text)
    scores = embed_sim_batch(query, sents)
    n_keep = max(1, int(len(sents) * keep_ratio))
    idx = sorted(range(len(sents)), key=lambda i: -scores[i])[:n_keep]
    return ' '.join(sents[i] for i in sorted(idx))  # keep original order

LLM 기반 문맥 압축

LLM은 청크별로 압축할 수 있습니다. 지시문을 작성하여 단락에서 질의와 관련된 부분만 추출하게 하고, 필요한 부분만 원문 그대로 잘라낸 결과를 반환하게 하십시오. 관련된 내용이 없으면 빈 표시를 반환하게 합니다.

이는 LangChain ContextualCompressionRetriever 패턴입니다. 임베딩 필터보다 정확하지만 청크마다 LLM 호출이 추가되므로, 중요도가 높은 pipeline에 사용하거나 일괄 처리하십시오.

def llm_compress(query, chunk):
    prompt = (
        'Extract ONLY sentences from the passage relevant to the query. '
        'If none are relevant, output NONE. Do not paraphrase.\n'
        'Query: ' + query + '\nPassage: ' + chunk.text
    )
    out = llm(prompt, temperature=0).strip()
    return None if out == 'NONE' else out

토큰 수준 가지치기(LLMLingua)

LLMLingua와 같은 방법은 작은 모델로 토큰의 정보량을 추정하고 정보량이 낮은 토큰을 제거하여 토큰 수준에서 압축합니다. 대형 모델에 필요한 신호를 보존하면서도 높은 압축률을 달성할 수 있습니다.

대신 압축된 텍스트는 사람이 읽기 어려워지므로, 사용자에게 표시하는 용도가 아니라 기계 전용 문맥에 적합합니다.

def token_prune(context, target_ratio=0.3):
    # small LM estimates per-token information (perplexity-based);
    # drop the least informative tokens down to target_ratio length
    scores = small_lm_token_importance(context)
    return keep_top_fraction(context, scores, target_ratio)

질의 인식형과 질의 비의존형

질의 인식형 압축은 이 질의와 관련된 내용을 유지하므로 가장 밀도 높은 문맥을 만들 수 있지만, 요청마다 실행해야 합니다. 질의 비의존형 압축(미리 계산한 청크 요약)은 요청 시 비용이 저렴하지만 특정 질문에 맞춰 집중할 수 없습니다.

하이브리드 방식에서는 오프라인에 압축된 청크 버전을 저장하고 온라인에서 가벼운 질의 인식형 다듬기를 적용합니다.

# Offline: precompute a dense summary per chunk (query-agnostic)
chunk.summary = summarize(chunk.text)
# Online: query-aware trim over summaries (cheap) then verify on full
ctx = [sentence_filter(query, Chunk(c.summary)) for c in top_chunks]

정보 손실 방지

과도한 압축은 중요한 조항 하나를 삭제할 수 있습니다. 재현율 확인으로 대비하십시오. 압축된 문맥이 여전히 answer를 뒷받침하는지 확인하거나, 압축기가 의심스러울 정도로 적은 내용을 반환할 때 압축되지 않은 청크를 사용하는 대체 경로를 유지하십시오.

재순위화기가 청크를 관련성이 높다고 평가했는데도 압축으로 청크가 빈 내용이 되도록 하지 마십시오. 이는 관련성이 없다는 뜻이 아니라 압축기 오류를 나타냅니다.

def safe_compress(query, chunk):
    out = llm_compress(query, chunk)
    if out is None and chunk.rerank_score > 0.7:
        return chunk.text          # trust re-ranker over compressor
    return out or chunk.text

출처 정보 보존

압축할 때는 출처 귀속을 온전히 유지해야 합니다. 유지한 각 구간에 청크와 문서 ID를 표시하여 생성기가 인용할 수 있게 하십시오. 메타데이터를 압축 과정에서 제거하면 검증 가능성과 환각을 감지하는 능력을 잃게 됩니다.

ID는 자유 형식 텍스트가 아니라 구조화된 필드로 pipeline 전체에 전달하십시오. 자유 형식 텍스트는 압축 과정에서 제거될 수 있습니다.

def compress_with_ids(query, chunks):
    out = []
    for c in chunks:
        span = safe_compress(query, c)
        out.append({'id': c.id, 'doc': c.meta['doc_id'], 'text': span})
    return out   # generator cites id; provenance preserved

압축과 토큰 예산

압축을 사용하면 재현율을 위해 더 많은 후보를 검색하면서도 최종 프롬프트는 작게 유지할 수 있습니다. 문맥 창에 토큰 예산을 설정하고, 예산에 도달할 때까지 가치가 가장 높은 압축 구간을 탐욕적으로 pack하십시오.

이렇게 하면 검색하는 양과 생성에 지출하는 양이 분리되어 핵심적인 효율성 개선 수단이 됩니다.

def pack(spans, budget_tokens, tok):
    spans = sorted(spans, key=lambda s: -s['score'])
    used, packed = 0, []
    for s in spans:
        t = tok(s['text'])
        if used + t > budget_tokens:
            continue
        packed.append(s); used += t
    return packed

압축 품질 측정

세 가지 수치를 추적하십시오. 압축률(절약한 토큰 수), answer 정확도(품질이 유지되었는지), 충실성(압축기가 사실을 바꾸지 않았는지)입니다. 목표는 answer 정확도를 저하시키지 않는 가장 높은 압축률입니다.

압축 강도를 여러 수준에서 시험하고, 품질 손실 없이 비용 목표를 충족하는 파레토 지점을 선택하십시오.

def eval_compression(eval_set, levels):
    return {
        lvl: {
            'ratio': mean_ratio(eval_set, lvl),
            'acc':   answer_accuracy(eval_set, lvl),
            'faith': faithfulness(eval_set, lvl),
        } for lvl in levels
    }

압축을 고려한 pipeline

처음부터 끝까지의 과정은 다음과 같습니다. 폭넓게 검색하고, 재순위화하고, 남은 각 청크를 출처 정보와 함께 압축(extractive 또는 LLM 기반)하고, 과도한 축약을 방지하고, 토큰 예산에 맞춰 pack한 다음, 인용을 포함해 생성합니다.

압축은 높은 재현율의 검색을 감당할 수 있게 하고 생성기가 중요한 내용에 집중하도록 만드는 계층입니다.

def pipeline(query):
    top = rerank(query, hybrid_retrieve(query, 50))[:12]
    spans = compress_with_ids(query, top)
    spans = [s for s in spans if s['text']]
    packed = pack(spans, budget_tokens=2000, tok=count_tokens)
    return generate_with_citations(query, packed)

빠른 확인

사실에 근거하고 인용을 포함하는 RAG 시스템에 적합한 압축 방식을 선택하십시오.

요약

핵심 요점:

  • 압축은 검색된 청크에서 질의와 관련된 내용만 남겨 비용, 지연 시간, 방해 요소를 줄입니다.
  • 인용이 포함된 사실 기반 RAG에서는 추상적 압축보다 extractive 방식(원문 그대로이며 추적 가능)을 우선하십시오. 토큰 수준 가지치기는 기계 전용 문맥에 적합합니다.
  • 질의 인식형 압축은 가장 밀도 높지만 요청마다 실행해야 합니다. 효율성을 위해 오프라인 요약과 결합하십시오.
  • 정보 손실을 방지하고 인용을 위해 청크와 문서의 출처 정보를 보존하십시오.
  • 압축을 사용하여 폭넓게 검색하면서도 프롬프트는 작게 유지하고, answer 정확도를 잃지 않는 최대 압축률을 목표로 조정하십시오.
무료로 시작

AI 튜터와 함께 AI Prompt Engineering을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
53
레슨
199

자주 묻는 질문

“컨텍스트 압축” 강의는 무료인가요?

네 — “컨텍스트 압축” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AI Prompt Engineering 강의 전체를 잠금 해제할 수 있습니다. AI Prompt Engineering 강의에는 총 4개의 강의가 포함되어 있습니다.

“컨텍스트 압축”에서 뭘 배우나요?

중요한 내용만 남기도록 컨텍스트 다듬기 브라우저에서 직접 실행하는 실습 코드로 AI Prompt Engineering을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

AI Prompt Engineering을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 AI Prompt Engineering은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“컨텍스트 압축” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 AI Prompt Engineering 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 AI Prompt Engineering 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 단순한 RAG를 넘어서
  2. 검색된 청크 재순위화
  3. 컨텍스트 압축
  4. 질의 재작성과 HyDE
← AI Prompt Engineering(으)로 돌아가기