카카오봇 제작 - chatGPT를 메신저봇R에 내장하기

개요

메신저봇r을 이용해서 카카오봇을 만들어온게 몇일 안된거 같은데 여러모로 활용할 수 있는 방안을 만든것 같습니다. 이번에는 역시나 핫한 openAI의 chatGPT api를 이용해보려 하는데요. 구글의 bard 가 치고 올라오고 있어서 활용하는 입장에서는 두 ai 엔진을 번갈아 가며 좀 더 결과물이 좋은 쪽을 택하는게 좋지 않나 생각합니다.

바드로 진행할까 하다가 일단은 chatGPT를 이미 제가 개발해둔 카카오봇에서 활용중이라서 이 코드를 활용해 chatGPT를 내장하는 방법을 알려드리겠습니다.

 

 

본문

 개발중인 카카오봇에 chatGPT를 내장하는 방법은 정말 간단합니다.  사실 내장하는 방식을 아름답게 변경한다고 하면 서버쪽으로 호출해서 응답을 소켓으로 받거나 콜백 url을 남겨서 받거나 하는 비동기 방식을 택하면 되는데 저는 메신저봇r이 제공해주는 비동기 처리에 맛들려서 메신저봇R에 내장했습니다.

 

카카오톡 채팅을 통해 chatGPT한테 질의를 남긴 뒤 응답을 받아서 reply 하는 구조인데 구조적인 부분을 뜯어보진 않았으나 메신저봇R 에서 알람 response가 오는 족족 비동기 처리가 이루어지는것으로 판단했습니다. 그래서 과감히 chatGPT의 응답대기시간을 무시하고 내장해보았습니다.

 

근데 아직 openAI의 chatGPT API를 활용하기 위한 계정을 만들지 않았다면 그 과정이 우선되어야 합니다.

https://openai.com/ 으로 가셔서 회원가입과 과금 정책 서비스를 사용하기 위해 신용카드 정보를 기입하셔야 할거에요. 

저는 구글 계정을 이용해서 회원 가입을 진행했으며, 3개월 무료 서비스라고 해서 신용카드 정보를 넣고 가입했습니다.

 

가입이 완료되고 로그인이 진행되었다는 가정하에 설명드립니다.

 

계정 정보를 누르면 팝업 메뉴가 나타나는데 View API keys 를 눌러서 메뉴이동을 해줍니다.

 

 

이동한 화면에서 API Key 를 생성하실수 있는데 이 Key를 통해 Api call 시 인증을 성공할 수 있습니다. Access Token 개념의 Key일텐데 Refresh 개념은 없는 걸로 보입니다. 제가 잘못봤을수도 있구요.

 

 

API Key 까지 생성했다면 거의 모든 step 을 마쳤다고 볼 수 있습니다.

서비스 되는 기능들의 튜토리얼 문서를 보고 싶으시다면 아래 링크를 참고하시기 바랍니다.

https://platform.openai.com/

 

OpenAI API

An API for accessing new AI models developed by OpenAI

platform.openai.com

 

앞서 작성했었던 메신저봇R 내 response 함수안에 chatGPT API를 활용한 코드 작성이 필요합니다.

카톡 채팅창에서 /q '질문내용' or /질문 '질문내용' 과 같은 형식으로 chatGPT에게 질문을 하고 응답을 받는 방식을 취했습니다.

질문이 장황하면 chatGPT의 응답이 길고 느려질듯 해서 응답문자에 제한을 두기로 했습니다.

 

response 함수 내 분기를 태우는 코드를 작성해줍니다. 질문내용은 getChatGPTResponse 함수로 전달해서 결과값을 받도록 합니다.

if (param == "질문" || param == "q") {
    let question = msg.substr(cmdArr[0].length + 1).trim();					
    let resGpt = getChatGPTResponse(question);
    replier.reply(room, resGpt);
}

getChatGPTResponse 함수는 아래와 같이 작성되었습니다.

 

gpt-3.5-turbo 모델에 role 은 system, 그리고 content에 전문가라는 점과 친근한 인상을 줄 수 있는 설명을 넣어줬습니다. 이렇게 함으로써 더욱 친절한 chatGPT의 전문성 있는 답변을 듣게 될것입니다.

 

header 정보에 채팅 api url과 api key 값을 넣어주어야 합니다.

아래 temperature, max_tokens, top_p 등의 파라미터는 구글링을 통해 확인해보시고 조정하시면 됩니다. 저는 이정도로 설정해두고 더이상 값 변경을 하지 않고 불편함없이 그냥 사용만 하고 있는 중이네요

 

chat api url : https://api.openai.com/v1/chat/completions

function getChatGPTResponse(msg) {
    let json;
    let result;
    try {

        let data = {
            "model": "gpt-3.5-turbo",
            "messages": [{
            "role": "system",
            "content": "당신은 모든 분야에서 최고의 전문가입니다. 20대 여성처럼 친근하게 10초 이내로 답변해주세요"
        },{"role":"user","content":msg}],
            "temperature": 0.9,
            "max_tokens": 500,
            "top_p": 1,
            "frequency_penalty": 0.0,
            "presence_penalty": 0.0
        };

        let response = org.jsoup.Jsoup.connect("https://api.openai.com/v1/chat/completions")
            .header("Authorization", "Bearer " + REST_API_KEY) // Open ai 토큰값
            .header("Content-Type", "application/json")
            .requestBody(JSON.stringify(data))
            .ignoreContentType(true)
            .ignoreHttpErrors(true)
            .timeout(200000)
            .post();

        json = JSON.parse(response.text());
        result = json.choices[0].message.content;
    } catch(e){
        result = e;
        Log.e(e);
    }
    return result;

}

 

 

이렇게 기존 메신저봇에 코드를 적용하고, 저장 & 컴파일 해줍니다. 저장된 코드는 테스트 해봐야 제맛이죠

 

프로그래밍과 관련한 질문을 했는데 배우 바람직한 대답을 해주면서도 거만한 chatGPT입니다. 하지만 코드 짜는거 보면 거만할만하니 인정해줄게요

 

 

마무리

 

앞서 했었던 작업들보다는 chatGPT를 적용하는 과정은 너무 쉽습니다. 10분도 안되서 뚝딱 가능한 수준의 난이도였던거 같습니다. 처음에는 응답 시간이 느려서 파이썬 구동 서버로 보내 비동기로 처리하려 했으나 메신저봇R이 비동기 방식으로 알람처리를 하고 있는 것 같아서 다른 이슈가 없었네요. 그래도 비즈니스 로직을 한곳으로 몰아서 처리하려 한다면 통신중인 서버에 보내서 처리하는게 아름다운 디자인 패턴이 될것으로 보입니다.

 

구글의 bard도 API를 제공해주고 있는지는 확인이 필요하지만 메신저봇에 적용이 가능할거 같습니다.  조만간 구글 바드를 적용한 샘플을 들고 오도록 할게요