ChatGPT API 출시 전, OpenAI API로 챗봇 만들어보기

배경

11월 30일에 ChatGPT가 공개되면서 사내에서 챗봇 PoC 요청이 들어왔다. 하지만 ChatGPT는 웹 인터페이스만 제공하고 API는 아직 없는 상황. 기존 OpenAI API의 text-davinci-003 모델로 비슷하게 구현할 수 있을지 테스트해봤다.

구현 방식

Completion API는 상태를 저장하지 않기 때문에, 매 요청마다 이전 대화 내역을 프롬프트에 포함시켜야 했다.

const openai = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY,
});

const conversationHistory = [];

async function chat(userMessage) {
  conversationHistory.push(`User: ${userMessage}`);
  
  const prompt = `The following is a conversation with an AI assistant.

${conversationHistory.join('\n')}
Assistant:`;

  const response = await openai.completions.create({
    model: 'text-davinci-003',
    prompt: prompt,
    max_tokens: 150,
    temperature: 0.7,
    stop: ['User:', 'Assistant:'],
  });

  const reply = response.choices[0].text.trim();
  conversationHistory.push(`Assistant: ${reply}`);
  
  return reply;
}

문제점

  1. 토큰 제한: 대화가 길어지면 4096 토큰을 초과. 오래된 대화를 잘라내는 로직 필요
  2. 비용: 매번 전체 컨텍스트를 전송하니 토큰 소비가 빠름
  3. 일관성: ChatGPT만큼 대화 흐름이 자연스럽지 않음

소감

ChatGPT API가 나오면 훨씬 간단해질 것 같다. 지금은 프롬프트 엔지니어링과 컨텍스트 관리를 직접 해야 해서 번거롭다. 하지만 text-davinci-003도 충분히 쓸만한 수준이라 놀랐다.