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에 저장
매 요청마다 system 또는 instruction 필드에 페르소나 프롬프트를 전달한다.
{
"model": "gpt-4o",
"messages": [
{
"role": "system",
"content": "너는 친절한 상담사야. 항상 존댓말을 사용해."
},
{
"role": "user",
"content": "안녕하세요"
}
]
}
결론: 생각보다 괜찮다
LLM API는 기본적으로 stateless 설계다. 서버 측 세션 유지는 확장성 문제를 일으키기 때문.
실제 개선 방법들
| 방법 | 설명 | 효과 |
|---|---|---|
| Prompt Caching | 동일 프롬프트 반복 시 캐시 히트 | 비용 최대 90% 절감 (Anthropic) |
| Fine-tuning | 페르소나를 모델에 학습 | 프롬프트 불필요, 유연성 감소 |
| 프롬프트 최적화 | 핵심만 압축 | 토큰 절약 |
| 하이브리드 | 코어 페르소나 + RAG | 상황별 동적 주입 |