1. 대화 상태 관리 (Conversation State)

OpenAI의 Conversation State

OpenAI Response API는 previous_response_id를 통해 대화 이력을 자동 추적하는 기능을 제공한다.

동작 방식

요청 1: "안녕" → 응답 (response_id: abc123)
요청 2: "내 이름은 철수야" + previous_response_id: abc123 → 응답 (response_id: def456)
요청 3: "내 이름이 뭐였지?" + previous_response_id: def456 → "철수라고 하셨죠"

특징

왜 프로덕션에서는 안 쓰나?

OpenAI Conversation State 자체 DB 관리
30일 제한 무제한 보관
OpenAI에 종속 완전한 통제
유연성 낮음 커스텀 자유로움
프로토타입용 프로덕션 적합

프로덕션 권장 구조

[자체 DB]
├── conversations
│   ├── id
│   ├── user_id
│   └── created_at
└── messages
    ├── conversation_id
    ├── role (user / assistant / system)
    ├── content
    └── timestamp

[API 호출 시]
1. DB에서 최근 대화 N개 조회
2. 시스템 프롬프트 + 메시지들로 요청 구성
3. 응답 받으면 DB에 저장

2. 페르소나 (시스템 프롬프트)

기본 방식

매 요청마다 system 또는 instruction 필드에 페르소나 프롬프트를 전달한다.

{
  "model": "gpt-4o",
  "messages": [
    {
      "role": "system",
      "content": "너는 친절한 상담사야. 항상 존댓말을 사용해."
    },
    {
      "role": "user",
      "content": "안녕하세요"
    }
  ]
}

매번 보내는 게 비효율적이지 않나?

결론: 생각보다 괜찮다

LLM API는 기본적으로 stateless 설계다. 서버 측 세션 유지는 확장성 문제를 일으키기 때문.

실제 개선 방법들

방법 설명 효과
Prompt Caching 동일 프롬프트 반복 시 캐시 히트 비용 최대 90% 절감 (Anthropic)
Fine-tuning 페르소나를 모델에 학습 프롬프트 불필요, 유연성 감소
프롬프트 최적화 핵심만 압축 토큰 절약
하이브리드 코어 페르소나 + RAG 상황별 동적 주입