ChatGPT API 출시 전, GPT-3 API로 챗봇 구현하기

배경

11월 초 ChatGPT가 공개되면서 사내에서도 AI 챗봇 도입 검토 요청이 들어왔다. 하지만 ChatGPT는 웹 인터페이스만 제공하고 API는 아직 없는 상태다. 기존 GPT-3 API의 text-davinci-003 모델을 활용해 유사한 대화형 경험을 구현해보았다.

구현 방식

기본적으로 GPT-3는 completion 방식이라 대화 맥락을 직접 관리해야 한다.

interface Message {
  role: 'user' | 'assistant';
  content: string;
}

const buildPrompt = (messages: Message[]): string => {
  let prompt = 'The following is a conversation with an AI assistant.\n\n';
  
  messages.forEach(msg => {
    const prefix = msg.role === 'user' ? 'Human: ' : 'AI: ';
    prompt += `${prefix}${msg.content}\n`;
  });
  
  prompt += 'AI: ';
  return prompt;
};

대화 히스토리를 문자열로 연결해 프롬프트를 만들고, OpenAI API에 전달한다.

const response = await openai.createCompletion({
  model: 'text-davinci-003',
  prompt: buildPrompt(conversationHistory),
  max_tokens: 500,
  temperature: 0.7,
  stop: ['\nHuman:', '\nAI:'],
});

마주친 문제들

1. 토큰 제한

GPT-3의 최대 토큰은 4096개다. 대화가 길어지면 초반 맥락을 잘라내야 한다. 최근 5~6개 메시지만 유지하는 방식으로 해결했다.

2. 응답 일관성

ChatGPT와 달리 프롬프트 구조에 따라 응답 품질이 크게 달라진다. system 역할 정의를 명확히 하고, few-shot 예시를 추가하니 개선됐다.

3. 비용

text-davinci-003는 1K 토큰당 $0.02다. 대화 10턴이면 약 $0.1 정도 소요된다. 프로덕션에선 캐싱과 요약 전략이 필수일 것 같다.

결론

GPT-3 API로도 대화형 경험 구현이 가능하지만, 컨텍스트 관리 오버헤드가 크다. ChatGPT API가 출시되면 훨씬 간편해질 것으로 보인다. 당분간은 프롬프트 엔지니어링 노하우를 쌓는 데 집중해야겠다.