검색
검색
공개 노트 검색
회원가입로그인
ChatGPT API로 챗봇 만들기

ChatGPT API 요청 사용해보기 (개발)

이제 첫 번째 API 요청을 해보겠습니다.

curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
     "model": "gpt-3.5-turbo",
     "messages": [{"role": "user", "content": "Say this is a test!"}],
     "temperature": 0.7
   }'

이 부분을 보시면 기본적으로 데이터가 있는 HTTP POST 요청임을 알 수 있습니다. 특이한 점은 헤더에 API KEY를 넣어 인증을 한다는 점입니다. POST 요청은 데이터를 전송해서 새로운 리소스를 생성하는 HTTP 요청입니다. HTTP 요청은 5가지가 있는데 이 부분은 추가 노트를 참고해 주세요.

VSCODE 설치 하기 및 설정

이번 시간부터는 실습을 진행할 예정입니다. 코드 에디터가 없으시다면 이 노트를 활용해서 비주얼 스튜디오 코드를 설치해 주세요.

폴더 만들기

curl을 통해서 요청을 날릴 수 도 있지만 node에서 axios를 활용해서 요청을 보내보도록 하겠습니다.

커맨드 라인 (윈도우의 cmd 또는 power shell) 또는 터미널에서 다음을 입력해서 먼저 폴더를 만들어 줍니다. (직접 만드셔도 됩니다.)

mkdir chatgpt-api

cd chatgpt-api

server 폴더를 만들어 나중에 만들 front와 구분을 해주겠습니다.

mkdir server

cd server

이제 npm 을 초기화 해주겠습니다. npm은 node.js의 패키지매니저입니다. 이를 활용해 여러 패키지들을 쉽게 설치하고 관리할 수 있습니다.

npm init -y

-y option을 주면 기본값으로 자동으로 세팅하게 됩니다.

axios 요청하기

axios 는 HTTP 요청을 보내기 쉽게 만들어 놓은 패키지입니다. node 서버에 설치를 해주겠습니다.

npm i axios dotenv

npm i 는 npm install의 약식 명령어입니다.

dotenv는 .env 파일에 있는 환경 변수값을 node에 안전하게 불러와 처리하는 역할을 합니다. .env 에는 API Key 값을 저장할 예정입니다.

먼저 simple-axios.js 파일을 만들고 다음과 같이 입력하겠습니다.

code simple-axios.js 또는 직접 만들기

const axios = require("axios");
// dotenv는 .env 파일을 읽어서 process.env에 설정해 줍니다.
const dotenv = require("dotenv");

dotenv.config();

axios
  .post(
    "https://api.openai.com/v1/chat/completions",
    {
      model: "gpt-3.5-turbo",
      messages: [{ role: "user", content: "안녕 AI" }],
    },
    {
      headers: {
        "Content-Type": "application/json",
        Authorization: `Bearer ${process.env.OPENAI_API_KEY}`,
      },
    }
  )
  .then((response) => {
    console.log(response.data);
    console.log(response.data.choices[0].message.content);
  })
  .catch((error) => {
    console.error(error);
  });

그리고 서버 폴더의 루트에 .env 파일을 만들고 다음과 같이 API KEY를 입력합니다.

OPENAI_API_KEY=API

API 키는 비밀키이기 때문에 항상 안전하게 처리해야 합니다. 예를 들어 프론트엔드의 코드에 이 키를 직접 입력하거나 github 에 올려서는 안됩니다. 지금 우리가 한 것처럼 서버를 통해서 사용자가 접근할 수 있게 처리해야 합니다.

저장을 한 후 터미널에서 node simple-axios.js 를 입력합니다. 처음으로 ChatGPT API 요청을 날려보았습니다!

에러가 날 수 도 있는데 에러의 response 부분이 401이면 api key의 문제이고, 400이면 보내는 데이터의 형식이 잘못됐을 때의 문제입니다.

공식 OpenAI Package로 요청하기

이제 node.js 공식 OpenAI package를 설치해 봅시다. OpenAI 패키지를 사용하면 axios 등을 활용할 필요없이 내장된 기능으로 요청을 보낼 수 있습니다.

npm install openai

이제 app.js 파일을 만들고 코드 에디터를 이용해서 파일을 열어보겠습니다.

code app.js

app.js

import OpenAI from "openai"
import dotenv from "dotenv"
dotenv.config();

const openai = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY,
})
const response = await openai.chat.completions.create({
  model: "gpt-3.5-turbo",
  messages: [
    { role: "system", content: "You are the philosopher Socrates specialized in answering philosophical questions. Talk in friendly manner." },
    { role: "user", content: "What is the meaning of life?" },
    {
      role: "assistant",
      content: "You have to find meaning of your life. it's good to live.",
    },
    { role: "user", content: "How can I find the meaning?" },
  ],
});
console.log(response)

현재 import 구문을 사용했기 때문에 node.js의 package에서 type을 module로 바꿔주면 됩니다.

package.json

{
  "type": "module",
  "dependencies": {
    "dotenv": "^16.0.3",
    "openai": "^3.2.1"
  }
}

참고로 import 는 모듈 시스템으로 ES modules (ESM) 라고 부르며 프론트 환경에서 많이 사용됩니다. 반면에 require 를 사용하는 시스템은 CommonJS라고 부르고 node 서버 환경에서 많이 사용합니다. 하지만 node도 타입을 지정해 주면 import 구문을 사용할 수 있습니다.

그리고 터미널에서 실행을 해보겠습니다.

node app.js

프롬프트 추가 설명

역할(role)은 system, user,assistant. 중 하나입니다. system은 챗봇의 전체적인 역할과 방향을 정해 줍니다. user 는 사용자의 메시지이고 assistant는 ChatGPT의 응답입니다. 예시처럼 ChatGPT의 응답을 요청값에 보내면 ChatGPT가 응답할 때 맥락을 고려할 수 있게 됩니다.

system은 ChatGPT에게 전체적인 지시사항을 줄 수 있지만 현재 모델은 이 system 메시지를 강력하게 인식하지는 않습니다. 그래서 만약 지시 사항을 확실하게 하려면 user 에 명령을 담는 것도 좋습니다. 차후 system 메시지를 강하게 참고할 수 있도록 바꾼다고 합니다.

다음은 자주 쓰이는 옵션값에 대해 알아보겠습니다. 이 옵션값들은 필수는 아닙니다.

temperature는 0과 2사이의 값이며 숫자가 클 수록 창의적인 응답(랜덤한 응답)을 하게 되고 낮을 수록 사실적이고 확정적인 응답을 하게 됩니다. 기본값은 1입니다. 만약 특정한 응답이 변하지 않고 나와야 하는 경우 0과 같이 값을 작게 주면 됩니다.

max_tokens : 입력과 출력값을 합한 토큰의 최대 토큰 수를 제한합니다.

stream : SSE (Server-Sent Events) 로 응답값을 실시간으로 보여주느냐의 값입니다. 기본은 false 이며 결과를 기다렸다 응답을 주게 됩니다. true로 하면 결과가 생성되는대로 프론트에 보여줄 수 있습니다.

아래는 결과의 예시입니다.

{
  id: 'chatcmpl-7P87s3VFIdBHnFiAw7OOYU3nTx4ew',
  object: 'chat.completion',
  created: 1686223792,
  model: 'gpt-3.5-turbo-0301',
  usage: { prompt_tokens: 69, completion_tokens: 110, total_tokens: 179 },
  choices: [ 
    message: {
        role: 'assistant',
        content: "As a philosopher, I believe that the meaning of life is a question that has puzzled humanity for centuries. While there is no one definitive answer, I believe that the meaning of life is something that each individual must discover for themselves. It is a personal journey that involves exploring one's own values, beliefs, and purpose. Some people find meaning in their relationships with others, while others find it in their work, hobbies, or spirituality. Ultimately, the meaning of life is something that each person must define for themselves based on their own experiences and perspectives."
    },
    finish_reason: 'stop', 
    index: 0 
  ]
}

prompt token 부분을 보시면 질문을 할 때 69 토큰, 응답에 110 토큰이 사용되었음을 알 수 있습니다.

보통 문맥을 이해시키기 위해 여태까지의 질문과 대답을 히스토리로 다음 요청에 보내게 됩니다.

gpt 3.5 turbo의 토큰 제한은 4096 토큰입니다. 질문에 4000 토큰을 썼다면 응답에는 96토큰만 사용할 수 있습니다.

그렇기 때문에 지금까지의 채팅 히스토리를 보낼 때 내용이 너무 길어진다면, 이 토큰 제한이 넘지 않게 적절하게 '토큰 관리'를 해주는 것이 좋습니다. 이건 나중에 다루어 보겠습니다.

finish_reason 은 stop 이 나오는데 이는 응답이 정상적으로 종료되었음을 의미합니다. finish reason은 총 4가지가 있는데 알아두면 좋습니다.

  • stop : 정상적으로 응답을 완료함.

  • length : 토큰 제한이나 max_tokens 때문에 응답을 완료하지 못함.

  • content_filter : 콘텐트 필터에 걸려 응답이 생략됨.

  • null : API 요청이 아직 진행 중이거나 완료하지 못함.

현재 모델은 gpt-3.5-turbo를 사용했습니다. 만약 gpt-4를 사용하고 싶으시다면 'gpt-4'라고 명시하시면 됩니다. gpt-4는 open ai에서 한 번 이상 결제 이력이 있는 사람이면 누구나 사용할 수 있습니다. gpt-4의 기본 모델 외 32k 등 다양한 모델은 이 링크를 참고해 주세요.

역시 openai의 패키지로 사용을 했지만 기본 원리는 API POST 요청이란 것을 이해해 주시면 될 것 같습니다.

이제 ChatGPT의 원리를 알았으니 이를 바탕으로 간단한 프론트엔드와 백엔드를 구현해 보도록 하겠습니다.


공유하기
카카오로 공유하기
페이스북 공유하기
트위터로 공유하기
url 복사하기