daily

23.05.26. openAI API + node.js, express로 연결해보기[0]

Juhyuck 2023. 5. 27. 10:40
728x90

openAI에서 제공하는 API를 연결하는 것은 openAI에서 제공하는 기술문서에 친절하게 설명되어 있어서 파이썬으로는 기술문서를 따라 쉽게 연결했었는데 node.js로는 어떻게 하는지 기술문서를 보며 따라해봤다.

 

1. 라이브러리 설치

openai 기술문서를 보면, node.js에서 어떻게 구현하는지 예제코드가 친절하게 나와있다.

코드 예제 우측 상단에 curl, node.js, python 세가지 예시를 제공해주고 있다.

requir('openai')를 보니, 패키지를 설치해야 하는 것 같아서 찾아보니, 여기에서 openai npm 라이브러리를 확인할 수 있다. 

그리고, API키는 .env 파일로 저장하는것이 안전하니.. dotenv도 설치해주고, 편리한 express도 같이 설치해주자.

npm i openai dotenv express

API키를 발급받는 방법은 워낙 많은 글에 있으니 생략. (참조)

 

2. 서버 구현

파일 구조는 심플하게 아래와 같다. app.js에서 서버를 실행하고, chatgpt.js에서 openai API와 연결하는 코드를 구현하는 방식이다. 

├─ app.js
├─ chatgpt.js
├─ package-lock.json
└─ package.json

먼저 app.js에는

const express = require("express");
const router = express.Router();
const { callChatGPT } = require("./chatgpt");

const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// post 메서드로 /ask 주소로 요청 시 callChatGPT 함수를 실행 후 응답을 반환
router.post("/ask", async (req, res) => {
    const { ask } = req.body;
    const response = await callChatGPT(ask);

    if (response) {
        res.status(200).json({ response });
    } else {
        res.status(500).json({
            error: "Failed to get response from ChatGPT API",
        });
    }
});

app.use("/", router);

// 서버 실행
const port = process.env.PORT;
app.listen(port, () => {
    console.log(`Server is running on port ${port}`);
});

chatGPT.js 는,

// openai 라이브러리 임포트
const { Configuration, OpenAIApi } = require("openai");
// API key를 가져오기 위해 dotenv 실행
require("dotenv").config();

async function callChatGPT(ask) {
    // API 설정
    const configuration = new Configuration({
        // dotenv API key 값 가져오기
        apiKey: process.env.OPENAI_API_KEY,
    });
    
    // openAIApi 객체 만들어서, 들어온 질문을 보내기
    try {
        const openai = new OpenAIApi(configuration);
        const response = await openai.createChatCompletion({
            model: "gpt-3.5-turbo",
            messages: [{ role: "user", content: ask }],
        });
        return response.data.choices[0].message;
    } catch (error) {
        console.error("Error calling ChatGPT API:", error);
        return null;
    }
}

// 모듈 익스포트
module.exports = { callChatGPT };

서버를 실행해서, post 메서드로 ask를 보내면 아래와 같이 답을 준다.

 

3. 간단한 프롬프트 세팅

채팅 모델에게 지시할 때, 사용자 메세지 앞에 지시하는 메시지를 부여해서 결과를 일관성 있게 하거나 유도하는 결과를 얻을 수 있게 할 수 있다고 한다. ChatGPT에서는 일부 모델에 아래와 같은 메시지를 붙인다고 알려준다.

You are ChatGPT, a large language model trained by OpenAI. Answer as concisely as possible. Knowledge cutoff: {knowledge_cutoff} Current date: {current_date}

또 이런 프롬프트 세팅 외에도, request body에 설정값을 통해 답변의 형태를 조정할 수 있다.

 

request body 설정은 다음으로 하고, 간단하게 사용자 질문 앞에 프롬프트를 추가해서 아래와 같이 변경했다.

그냥 물어보는 답을 길게하면서 대화가 이어질 때 토큰이 많이 필요해지고, 돈이 많이 든다.

이를 방지하기 위해 답을 간단하게 해서 대화가 길어져도 돈이 적게 들게 할 수 있고, 사용자가 흥미를 잃게 해서도 돈을 적게 쓸 수 있도록 프롬프트를 추가했다.물론 프롬프트가 길면... 누적되면.. 음.

 

이 다음은 대화를 이어나갈 수 있도록 기존 대화를 넣어주는 것을 해볼 예정.