Artificial Intelligence

Open AI의 chatGPT API를 기다리며 | Node.js로 내 CLI 속 GPT-3 챗봇 만들기 (openAI API 사용하기)

Gray Park 2023. 2. 9. 08:30
728x90
반응형

GPT-3 란?

GPT-3(Generative Pre-trained Transformer 3)은 OpenAI에서 개발한 인공 지능 언어 모델입니다. 대규모 딥 러닝 시스템을 사용하여 인간과 유사한 텍스트를 생성합니다. 수백만 개의 웹 페이지와 책으로 구성된 데이터 세트에서 훈련되었으며 주어진 주제에 대한 텍스트를 생성할 수 있습니다. GPT-3는 사람이 쓴 텍스트와 거의 구별할 수 없는 텍스트를 생성할 수 있습니다. 따라서 텍스트 완성, 질문 답변, 요약 및 번역과 같은 다양한 작업에 사용할 수 있습니다. GPT-3는 또한 극소수의 예에서 일반화하는 능력이 있어 언어 이해가 필요한 다양한 작업에 유용합니다.

 

Open AI API 톺아보기

이번 포스팅에서는 openAI의 API, 그 중에서도 GPT-3 API를 이용해서 Node.js로 구동하는 CLI 챗봇을 만들어봅니다. 간단하게 구조를 살펴보면 다음과 같습니다.

  1. CLI prompt에 input text 입력
  2. CLI에 결과 출력

이 과정을 위해 필요한 npm 패키지는 다음과 같습니다.

  • openai
  • dotenv
  • readline

dotenv는 환경변수를 위해, readline은 CLI 입력을 위해 사용했으며, 오늘의 메인 주제는 openai가 되겠습니다. openAI API docs로 이동해 살펴보면, 다음과 같이 접근하게 정리되어 있습니다.

function generatePrompt(animal) {
  const capitalizedAnimal = animal[0].toUpperCase() + animal.slice(1).toLowerCase();
  return `Suggest three names for an animal that is a superhero.

Animal: Cat
Names: Captain Sharpclaw, Agent Fluffball, The Incredible Feline
Animal: Dog
Names: Ruff the Protector, Wonder Canine, Sir Barks-a-Lot
Animal: ${capitalizedAnimal}
Names:`;
}

const completion = await openai.createCompletion({
  model: "text-davinci-003",
  prompt: generatePrompt(req.body.animal),
  temperature: 0.6,
});

요약하자면 createCompletion 메소드를 이용해 GPT-3 모델 중 하나인 text-davinci-003 에 input text를 전달합니다. 위 코드에서 input text는 generatePrompt의 결과물입니다. 다르게 말해, 위 코드에서 propmt의 내용만 변경하면 얼마든지 GPT-3에 input text를 전달할 수 있다는 말입니다.

 

이제 대충 어떻게 API를 호출하면 되는지 감이 오나요? 순서대로 진행하면서 코드를 완성해보겠습니다.

 

OPEN AI 시작하기

먼저 API reference로 이동해 openai 패키지를 설치하겠습니다.

저는 nodejs 환경이므로 npm을 이용해 패키지를 설치했습니다.

GPT-3 API도 openai의 API이기 때문에 너무나 당연하게도 API key가 필요합니다. 같은 페이지(API reference)의 Authentication에 있는 API Keys를 클릭합니다.

Scecret key가 없다면, 아래의 Create new secret key 버튼을 클릭해 새로운 키를 생성합니다. 이때 생성된 Secret key는 .env 파일에 잘 기록해둡니다.

 

별거 안했는데 벌써 절반이나 했습니다. 이제 여기서 생성한 api key를 가지고 개발환경으로 돌아갑니다. 앞서 언급한 것처럼 dotenv와 readline 라이브러리를 설치합니다.

npm install dotenv readline --save

각 라이브러리를 순서대로 쌓아 진행하겠습니다. 먼저 환경변수를 설정합니다.

코드를 작성할 파일을 열고 패키지를 불러옵니다. dotenv와 readline 라이브러리의 사용법은 npm을 참조하세요.

import * as dotenv from "dotenv";
import { createInterface } from "readline";

dotenv.config();

let prompt = "Hi";

const rl = createInterface({
  input: process.stdin,
  output: process.stdout,
});

rl.on("line", (line) => {
  prompt = line;
  rl.close();
});

rl.on("close", () => {
  process.exit();
});

간단히 설명하자면 dotenv.config()를 통해 .env 파일의 변수에 접근할 수 있습니다. readline 라이브러리를 통해 CLI 환경에서 프롬프트에 입력한 내용을 텍스트 형식으로 받아올 수 있습니다.

 

기본적인 셋업이 끝났으니, openai API를 사용해 보겠습니다. 우리는 openai에 존재하는 여러 객체 중에서 Configuration 과 OpenAIApi를 사용합니다.

import { Configuration, OpenAIApi } from "openai";
import * as dotenv from "dotenv";

dotenv.config();

const configuration = new Configuration({
  apiKey: process.env.OPENAI_API_KEY,
});

const openai = new OpenAIApi(configuration);

(async () => {
  try {
    const res = await openai.createCompletion({
      prompt: "Hi",
      model: "text-davinci-003",
      max_tokens: 160,
      temperature: 0.7,
      stream: false,
    });
    console.log(res.data.choices[0].text);
    return;
  } catch (e) {
    console.log("Error");
    return;
  }
})();

createCompletion 메소드의 파라미터 객체에 들어가는 request body에 들어가는 내용에 대해서는 openai 문서를 참조하세요.

 

위 코드에서 15번 줄의 prompt를 readline에서 CLI로부터 읽어온 값으로 변경하면 Node.js - CLI 환경에서 GPT-3를 사용할 수 있습니다. 앞서 소개한 코드와 합쳐주면 다음과 같은 코드가 완성됩니다.

import * as dotenv from "dotenv";
import { createInterface } from "readline";
import { Configuration, OpenAIApi } from "openai";

dotenv.config();

const rl = createInterface({
  input: process.stdin,
  output: process.stdout,
});

let prompt = "Hi";

rl.on("line", (line) => {
  prompt = line;
  rl.close();
});

const configuration = new Configuration({
  apiKey: process.env.OPENAI_API_KEY,
});

const openai = new OpenAIApi(configuration);

rl.on("close", () => {
  (async () => {
    try {
      const res = await openai.createCompletion({
        prompt,
        model: "text-davinci-003",
        max_tokens: 160,
        temperature: 0.7,
        stream: false,
      });
      console.log(res.data.choices[0].text);
      process.exit();
      return;
    } catch (e) {
      console.log("Error");
      process.exit();
    }
  })();
});

실행 결과

openai의 api를 사용하면서 느낀 점은 두가지가 있습니다.

  1. 공식문서에 레거시가 생각보다 많다.
  2. 최신 버전에서는 추상화, 일반화가 많이 진행되어 있다.

1번은 조금 아쉽지만, 2번을 통해 1번이 해소되는 느낌입니다. 추측컨데 chatGPT API가 나온다고 하더라도, model 이름만 변경되지 않을까 생각합니다. 이것으로 이 포스팅은 마무리하겠습니다.

728x90
반응형