본문 바로가기
C.W.K.
Stream
Lesson 05 of 06 · published

대화 요약은 무엇을 버릴지 정하는 손실 압축이야

~12 min · summarization, memory, compression

Level 0Observer
0 XP0/64 lessons0/13 achievements
0/150 XP to next level150 XP to go0% complete

원문 이력은 끝없이 자라

오래 이어지는 채팅에서 모든 턴을 계속 보내면 비용과 집중 부담이 함께 커져. 오래된 구간을 압축된 도우미 메모로 바꾸고 최근 턴은 원문으로 남기면 필요한 사실을 유지하면서 토큰을 줄일 수 있어.

사실과 약속, 미완료 일을 남겨

좋은 요약은 사용자가 밝힌 사실, 명시한 선호, 아직 끝나지 않은 작업, 함께 도달한 결론을 보존해. 인사와 잡담, 모델의 반복 사과는 대개 버려도 돼. 요약 프롬프트에 보존 항목을 구체적으로 적어야 압축기가 중요도를 제멋대로 정하지 않아.

요약을 거듭할수록 흐려져

압축할 때마다 세부와 확실성이 조금씩 사라져. 전체를 같은 세기로 요약하지 말고 최근 N개 턴은 원문, 중간 구간은 가벼운 요약, 가장 오래된 구간은 강한 요약으로 층을 나눠. 중요한 원본은 외부 기록에 그대로 남겨야 해.

원칙: 요약은 손실 압축이야. 압축기를 부르기 전에 반드시 남겨야 할 정보를 먼저 정해.

Code

Tiered 요약·python
VERBATIM = 8
SUMMARIZED = 24

def tiered(history: list[dict]) -> list[dict]:
    if len(history) <= VERBATIM:
        return history
    recent = history[-VERBATIM:]
    middle = history[-(VERBATIM + SUMMARIZED):-VERBATIM]
    older = history[:-(VERBATIM + SUMMARIZED)] if len(history) > VERBATIM + SUMMARIZED else []

    middle_summary = summarize(middle, depth="light") if middle else ""
    older_summary = summarize(older, depth="heavy") if older else ""

    notes = []
    if older_summary:
        notes.append({"role": "user", "content": f"<early_summary depth='heavy'>{older_summary}</early_summary>"})
    if middle_summary:
        notes.append({"role": "user", "content": f"<recent_summary depth='light'>{middle_summary}</recent_summary>"})
    return notes + recent

External links

Exercise

50턴 대화에 층별 요약을 넣고 요약 전후의 총 입력 토큰과 초기 사실을 묻는 탐침 질문의 품질을 비교해.
Hint
탐침이 실패한다면 요약 프롬프트가 보존해야 할 사실을 버린 거야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.