[node.js] ChatGPT API와 node.js로 AI 자동 글쓰기 기능 만들기

ChatGPT API를 node.js에서 사용하려면 "openai" 패키지를 설치해야 합니다. openai는 node.js에서 ChatGPT API를 사용할 수 있게 해주는 모듈입니다.

인터넷으로 검색되는 ChatGPT API 사용 코드들의 상당수가 현재 버전의 최신 openai 모듈의 사용법과 호환이 되지 않습니다. 모듈의 객체 구조가 많이 다르고, ChatGPT API의 응답 결과를 담는 데이터 구조도 조금 다릅니다.

먼저 openai 패키지를 설치합니다.

npm install openai

ChatGPT API 호출 모듈 작성

코드를 구현할 때 ChatGPT API를 호출하는 모듈은 별도의 자바스크립트 파일로 작성합니다. ChatGPT API를 호출하는 함수를 노출해서 함수가 프롬프트 질의 문자열을 받아서 결과를 반환하도록 합니다.

ChatGPT API를 호출하고 결과를 반환하는 함수의 구현 코드는 다음과 같습니다.

require('dotenv').config();
const OpenAIApi = require('openai');

const openai = new OpenAIApi({
    api_key: 'process.env.OPENAI_API_KEY'
});
  
// ChatGPT에 대화식으로 요청을 보내는 함수
async function callChatGPT(message) {

    //console.log(message)

    try {
        const response = await openai.chat.completions.create({
            model: 'gpt-3.5-turbo',
            messages: [
              { role: 'system', content: "다음 내용에서 HTML 태그를 제외한 내용을 한글 존대말로 100자 이내로 요약해주세요." },
              { role: 'user', content: message },
            ],
          });

        // 모델의 응답에서 답변 가져오기
        const answer = response.choices[0].message.content;
        //console.log('ChatGPT 답변:', answer);
    
        return answer;
    } catch (error) {
        console.error('ChatGPT 요청 중 오류:', error);
        throw error;
    }
}

module.exports = { callChatGPT };

dotenv 패키지는 "process.env"에 환경 변수 값을 ".env" 파일에 작성해서 사용할 수 있게 해줍니다. 없어도 무방하지만 보안을 위해서 중요한 키 값이나 상수 값을 별도로 관리하기 위해 사용합니다.

마찬가지로 dotenv 패키지를 설치해야 사용할 수 있습니다.

npm install dotenv

자바스크립트 파일이 있는 경로에 ".env" 파일을 만들고 ChatGPT API 키를 다음과 같은 포맷으로 작성한 후 저장합니다. 꺽쇠 괄호, (쌍)따옴표 없이 "="뒤에 키를 붙여넣으면 됩니다.

OPENAI_API_KEY=[ChatGPT API Key]

OpenAI API 키를 생성하는 방법은 끝 부분에 별도로 설명이 있습니다.

예제 코드는 블로그의 내용을 요약해서 한글로 100자 이내로 만들어 달라고 ChatGPT에게 프롬프트로 요청하는 것입니다. 본문 내용은 함수의 파라미터 변수인 message로 받아서 넘기게 됩니다.

주석 처리한 콘솔 출력 메시지 행의 주석을 제거해서 중간에 어떤 데이터가 나오는지 확인해볼 수 있습니다.

dotenv를 사용하지 않으면 openai 객체를 생성하는 환경 설정 값에 직접 ChatGPT API 키를 붙여넣으면 됩니다.

const openai = new OpenAIApi({
    api_key: 'ChatGPT API key'
});

ChatGPT에 질의를 할 때 언어 모델을 지정해서 호출할 수 있습니다. mode: "모델명"으로 표시를 합니다. "gpt-3.5-turbo", "gpt-4" 중 하나를 사용하면 됩니다. 대소문자 구분을 하지 않습니다.

이제 다른 페이지에서 앞서 모듈로 노출한 함수를 호출해서 결과를 출력하는 코드를 만들어야 합니다. gpt-3.5-turbo는 최대 토큰 길이가 4097 토큰입니다. 토큰 1개의 길이가 영문은 1단어에 가깝지만 한글은 한글 1자가 1토큰 이하입니다. 따라서 질의 내용으로 넣는 내용이 길 경우 내용을 잘라서 질의를 해야 합니다.

var {callChatGPT} = require('./chatgpt');

// ChatGPT에 대화식으로 요청 보내기
// postText가 100자 이내로 요약할 전체 내용
let gptContent = postText.length > 4000 ? postText.substring(0,4000):postText;
let gptResponse = await callChatGPT(gptContent);
if(gptResponse){
    console.log(postnum+' chatGPT API 응답: '+gptResponse)
}else{
    console.log(postnum+' chatGPT API 응답 실패!')
}

if(gptResponse != ''){
    //블로그 API로 ChatGPT API 응답 내용을 meta description에 저장
}

모델마다 최대 허용 토큰 길이가 다르므로 모델에 맞춰서 질의 내용 길이를 줄여야 합니다.

허용 최대 길이를 초과하면 응답 대신 다음과 같은 에러 메시지를 반환합니다.

This model’s maximum context length is 4097 tokens. However, you requested 5369 tokens (3869 in the messages, 1500 in the completion). Please reduce the length of the messages or completion.

Error Code 429 문제

무료 5$ 충전액에 소진되면 ChatGPT API를 호출할 때 다음과 같은 에러메시지가 표시됩니다.

RateLimitError: 429 You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.

과거에 ChatGPT API를 무료 충전액으로 사용했던 경험이 있으면 일정 시간이 경과하면 무료 충전액이 소멸됩니다. 처음 사용자에게는 5$는 충분한 ChatGPT API 사용 경험을 할 수 있는 금액이지만 충전 금액이 무한정 제공되는 것은 아니니 주의해야 합니다.

무료 충전액은 일정 기간이 지나면 Expired 되고 사용할 수 없게 됩니다.

ChatGPT API로 대량의 배치 작업을 할 때는 과금 설정에서 "Auto credit balance" 옵션을 꺼서 자동 재충전이 되지 않도록 해야 합니다. 코딩 실수로 대량의 과금이 되는 재앙을 맞게될 수도 있으므로 ChatGPT가 제공하는 여러가지 과다 과금 방지 옵션들을 사용하는 것을 추천합니다.

ChatGPT API에서 사용할 수 있는 언어 모델은 GPT 3.5 turbo와 GPT 4 2가지입니다. GPT4가 훨씬 더 자연스럽고 풍부한 답변을 하지만 사용 요금도 그만큼 비쌉니다.

생각보다 과금 차이가 크므로 GPT 4를 사용할 때는 질의를 할 때 신중하게 해야 합니다. GPT 3.5 turbo로 얻은 결과를 추가로 가공하거나, 결과가 만족스럽지 않을 때 GPT 4를 사용하는 것을 권장합니다.

세련된 결과물을 원하는 것이 아니면 GPT 3.5 turbo 만으로도 충분히 좋은 결과를 얻어낼 수 있습니다.

GPT 3.5 turbo 125 모델이 1K 토큰 과금액. 입력과 출력이 모두 과금되는 구조입니다.

충전 후에는 사용 한도를 정해서 월단위로 정한 한도 금액 이상 충전이 되지 않도록 해야 합니다. ChatGPT API는 충전을 할 때 정한 금액 단위로 자동 충전을 할 수 있도록 설정할 수 있는데, Usage limits 에서 월단위 한도를 크게 설정해놓으면 한도까지 계속 자동 충전이 되므로 자동 충전을 끄거나 월 단위 한도를 감당할 수 있는 수준 이하로 설정해서 무한 과금이 되지 않도록 해야 합니다.

ChatGPT API 사용을 할 때는 사용 중간 중간 사용하는 모델이 얼마만큼의 금액을 사용하고 있는지 실시간으로 사용할 수 있습니다. ChatGPT API 홈페이의 Usage 메뉴에서 실시간으로 사용량 통계를 확인할 수 있습니다.

직접 개발을 해서 ChatGPT API를 호출할 때는 배치 작업으로 대량의 질의를 하게 되는 경우가 있습니다. 이럴 경우 배치 작업 한 번에 많은 금액이 소진될 수도 있고, 개발한 코드가 중간에 에러가 나서 중단될 경우 중단점부터 다시 시작할 수 있는 코드를 구현해야 처음부터 다시 배치 작업을 진행해서 과금이 이중 삼중으로 되는 문제를 피할 수 있습니다.

코드를 작성할 때는 콘솔 출력이나, 로그 파일에 작업이 어디까지 진행되었는지를 알 수 있는 로그를 남겨서 배치 작업을 처음부터 다시하는 번거로움을 피할 수 있도록 해야 합니다.

OpenAI API 키 생성

OpenAI API 홈페이지로 로그인합니다. OpenAI는 웹에서 대화형으로 인공지능을 사용하는 ChatGPT와 API를 사용하기 위한 웹 사이트가 구분되어 있습니다.

https://platform.openai.com/

왼쪽 메뉴를 펼친 후 "API keys"를 선택합니다.

"Create new secret key" 버튼을 눌러 새 API 키를 생성 화면을 엽니다.

사용할 이름을 입력한 후 "Create secret key"를 눌러 키를 생성합니다.

키가 생성되어 표시되면 "Copy" 버튼을 눌러 복사합니다. API키는 공유하면 안됩니다. 모르는 사용자가 내 API 키를 사용하면 내 계정으로 ChatGPT를 사용하는 것과 같습니다.

창을 닫으면 다시 키를 복사할 수 없으므로 창을 닫지 말고 API 키를 복사해야 합니다. API 키는 무제한으로 생성할 수 있으므로, API 키를 분실했으면 다시 생성해서 사용하면 됩니다.