본문 바로가기
Agentic AI/Memory

1. [Short-term Memory] 대화 이력 자동 압축 및 요약 시스템

by 아톨 2026. 8. 31.
반응형

대화가 길어질 때 발생하는 토큰 사용량 증가와 비용 문제를 해결하기 위해, 이전 대화 내용(History)을 OpenAI 모델을 통해 핵심만 3줄로 자동 요약해주는 파이썬 스크립트입니다.

 

#Context_Window (문맥 창) 및 토큰 관리: 대화가 길어질수록 전달되는 텍스트(토큰)량이 늘어나 비용이 급증합니다. 이를 해결하기 위해 오래된 대화를 요약하여 압축(Summarization)하는 기법이 필수적입니다.

 

1. 환경 설정 및 라이브러리 로드

import os
from dotenv import load_dotenv
from openai import OpenAI

load_dotenv()
API_KEY = os.getenv("OPENAI_API_KEY")
MODEL_NAME = os.environ.get("MODEL_NAME", "gpt-5.4-mini")
  • load_dotenv(): 실행 환경의 .env 파일에 작성된 환경변수를 읽어옵니다.
  • os.getenv("OPENAI_API_KEY"): 보안을 위해 코드에 직접 작성하지 않고 환경변수에서 API 키를 안전하게 가져옵니다.
  • MODEL_NAME: 사용할 LLM 모델명을 설정합니다. 환경변수에 지정된 값이 없으면 기본값(gpt-5.4-mini)을 사용합니다.

2. OpenAI 클라이언트 생성

client = OpenAI(api_key = API_KEY)
  • 가져온 API 키를 전달하여 OpenAI 서비스와 통신할 클라이언트 객체를 초기화합니다.

3. 오래된 대화 요약 함수 (summarize_old_messages)

이 코드의 핵심 기능이 담긴 함수입니다.

def summarize_old_messages(old_messages):
    # ① 대화 리스트를 단일 문자열로 변환
    conversation_text = "\n".join(
        f"{m['role'].upper()}: {m['content']}" 
        for m in old_messages
    )
    print("\n[요약 전 대화]")
    print(conversation_text)

    # ② OpenAI 모델에 요약 요청
    response = client.responses.create(
        model = MODEL_NAME,
        input = [
            {
                "role": "system",
                "content": (
                    "아래 대화의 핵심 내용을 3줄 이내로 압축 요약하세요."
                    "사용자가 언급한 상황, 방향 또는 중요한 요청 사항을 중심으로 정리하세요."
                ),
            },
            {"role": "user", "content": conversation_text}
        ],
    )
    return response.output_text
  • ① 텍스트 변환 (join): 딕셔너리 형태의 대화 리스트([{'role': ..., 'content': ...}])를 AI가 읽기 편한 하나의 텍스트 문서(USER: ... \n ASSISTANT: ...) 형태로 이어 붙입니다.
  • ② API 호출 (client.responses.create):
    • system 역할: AI에게 "핵심을 3줄 이내로 압축 요약하라"는 구체적인 규칙을 지시합니다.
    • user 역할: 변환된 전체 대화 텍스트(conversation_text)를 전달합니다.
  • response.output_text: 모델이 요약하여 생성한 최종 결과 텍스트를 반환합니다.

4. 테스트 대화 데이터 작성 및 실행

# 4. 테스트용 대화 리스트 구성
messages = [
    {
        "role": "user",
        "content": "나는 AI Agent를 공부하고 있어."
    },

    {
        "role": "assistant",
        "content": "좋습니다. Python으로 간단한 Agent부터 만들어볼 수 있습니다."
    },

    {
        "role": "user",
        "content": "나는 코드 설명을 아주 친절하고 자세하게 듣는 것을 좋아해."
    },

    {
        "role": "assistant",
        "content": "알겠습니다. 앞으로 코드의 전체 흐름과 각 줄의 역할을 자세히 설명하겠습니다."
    },

    {
        "role": "user",
        "content": "OpenAI API를 이용해서 실제 Agent를 만들고 싶어."
    },

    {
        "role": "assistant",
        "content": "좋습니다. Tool Calling, History 관리, Retry 기능까지 단계적으로 구현할 수 있습니다."
    },
]

# 5. 요약 함수 실행
summary = summarize_old_messages(messages)

# 6. 결과 출력
print("\n" + "=" * 60)
print("[요약 결과]")
print("=" * 60)
print(summary)
  • 사용자와 AI 간에 오간 총 6개의 대화 턴(Turn)을 시뮬레이션 데이터로 선언하고, 함수를 통해 요약 결과를 받아온 후 콘솔 화면에 깔끔하게 출력합니다.
반응형