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가 출시되면 훨씬 간편해질 것으로 보인다. 당분간은 프롬프트 엔지니어링 노하우를 쌓는 데 집중해야겠다.