chatGPT API 내 사이트에 연결하기

H.yeong·2023년 10월 5일

_어느 회사가 제공하는 문장생성 API 를 사용하고 있었다.

...많은 문제가 발생했다.

chatGPT 기반으로 만들어졌다기에 직접 사이트에 연결하기로 했다._

🍉 OpenAI

https://platform.openai.com/docs/api-reference

🍬 API KEY 발급

OpenAI 사이트에 가입하고 결제한 후 API 호출 시 사용할 API KEY를 발급받았다.
키는 최초 발급 때만 원본을 확인하고 복사할 수 있다. 창을 닫으면 복사못함. 그래서 새로 만듦


🍬 API Model

OpenAI 에서 제공하는 모델은 아래와 같은데 모델명을 클릭하면 세부 버전을 확인할 수 있다.
내가 사용한 것은 GPT-3.5-turbo
시험 삼아 GPT-3.5의 다른 버전인 text-davinci-003 을 사용해봤는데 문장력은 turbo와 비슷한듯 하나
생성 속도가 너무 느렸다. turbo가 약 7초를 소요한다면 davinci는 24초나 잡아먹었다.


🍬 호출하기

예시 )

  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": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "Hello!"}]
    }'

사용언어는 PHP로 CURL 방식을 사용하여 API 를 호출했다.
예시를 보면 body에 담을 데이터 중 'messages'는 객체를 담고있다.
PHP 에선 클래스 만든 후에나 객체를 사용할 수 있는데 리액트를 가지고 놀다 넘어와서
아무 생각 없이 {}를 쓰고 아무것도 뜨지 않는 화면을 한참 노려봤다.
이런 바보멍청이도 돈 벌어먹고 산다.


⁍ 호출 전 기본 설정

    
	$API_KEY = '사이트에서 발급받은 API KEY';
	
    // 접속할 URL, 사용하는 모델마다 URL 다름
    $url = 'https://api.openai.com/v1/chat/completions';

    $headers = [
        'Authorization: Bearer ' . $API_KEY,
        'Content-Type: application/json'
    ];
	
    // 배열로 만든 후 객체화
    $system = ['role' => 'system', 'content' => 'GPT에게 내릴 명령'];
    $system = (object) $system;
    
    $user  = ['role' => 'user', 'content' => '재생성될 문장'];
    $user  = (object) $user;

    $data = [
        'model' => 'gpt-3.5-turbo', 
        'messages' => [$system, $user], 
        'max_tokens' => 150, 
        'temperature' => 0.7,
        'frequency_penalty' => 0,
        'presence_penalty' => 0,
        "top_p" => 1,
        'n' => 1,
        'stop' => ['\n'],
    ];



$data 옵션을 살펴보자 ❗

'model' => 'gpt-3.5-turbo'

  • 내가 사용할 GPT 모델명이다.

'messages' => [ { 'role' : 'user', 'content' : '메세지'} ]

  • chatGPT에게 요청할 메세지로 role, content 라는 두가지 속성을 필요로 한다.

    • [ content ]
      GPT에게 전달하고 싶은 메세지를 적는다.

    • [ role ]
      'user', 'system', 'assistant' 이 3가지 값 중 하나를 넣을 수 있는데 함께 보내는 메세제가 어떤 역할을 할지 정해주는 것 같다.
      🙍‍♀️ 'user'는 사용자를 의미해서 chatGPT와 챗을 하던 것처럼 대화를 하거나 직접적으로 명령을 하는 문장과 함께 보내주면 된다.

      ex) { 'role' : 'user', 'content' : '여름은 어떤 계절이야?' }
      
      답변 )
      "여름은 일반적으로 6월부터 8월까지 3개월간 지속되는 계절입니다.
      이 계절에는 일반적으로 따뜻한 날씨와 긴 주간이 특징입니다. 해변이나 수영장에 가서 물놀이를 즐기거나 야외 활동을 즐기기에 좋은 계절이기도 합니다."

      💻 'system'은 대화의 흐름을 잡아주는 역할로 답변을 어떤 형식으로 작성할지 내가 지정할 수 있다.

      ex) { 'role' : 'system', 'content' : '보고서 형식으로 작성' }
      
      답변 )
      보고서 제목: 여름에 관한 분석
      
      1. 서론
      여름은 한 해 중 가장 더운 계절로, 많은 사람들이 물놀이나 해외 여행을 즐기는 계절입니다. 이 보고서에서는 여름에 대한 자세한 분석을 통해 그 특징과 효과를 알아보고자 합니다.
      
      2. 여름의 특징
      여름은 일반적으로 높은 기온과 습도, 긴 낮과 짧은 밤을 특징으로 합니다. ... ...

{ 'role' : 'user' , 'content' : '여름은 어떤 계절인지 보고서 형식으로 작성해줘.' }
이렇게 하나로도 비슷한 답을 얻을 수 있긴 한데 나중에 수정이 용이하려면 구분해놓는게 좋을 것 같다.


'max_tokens' => 150

  • 최대 토큰을 지정한다. 글자 수 제한과 같다.

'temperature' => 0.7

  • 1과 가까울 수록 주제에 대한 다양한 답변을 주고 0과 가까울 수록 일관성이 있는 답변을 생성한다는데 값이 너무 높으면
    엉뚱한 답을 할 수도 있으니 적절한 조절이 필요하다.

'frequency_penalty' => 0

  • 똑같은 대답을 하지 않도록 설정한다. -2.0~ 2.0 사이로 설정할 수 있다.
    모델이 기존 텍스트를 참고하여 똑같은 대답을 하는 빈도수

'presence_penalty' => 0

  • GPT가 새로운 주제에 대해 떠들 가능성을 설정하는 옵션이라고 이해했다.
    0으로 해야 딴소리 안하는 듯?


⁍ 이제 호출을 해보자

	// CURL 셋팅
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url); //요청 URL 'https://api.openai.com/v1/chat/completions'
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //호출 결과값을 문자열로 반환하여 변수에 저장할 수 있게 됨
    curl_setopt($ch, CURLOPT_POST, 1); // POST로 전송 ~
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); // POST로 보낼 나의 데이터 ~
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 헤더 설정

    $response = curl_exec($ch); // 호출 결과값
OpenAI 플랫폼 - API Reference 페이지 내 호출결과 예시 복사해 왔음

{
  "id": "chatcmpl-abc123",
  "object": "chat.completion",
  "created": 1677858242,
  "model": "gpt-3.5-turbo-0613",
  "usage": {
      "prompt_tokens": 13,
      "completion_tokens": 7,
      "total_tokens": 20
  },
  "choices": [
      {
          "message": {
              "role": "assistant",
              "content": "\n\nThis is a test!"
          },
          "finish_reason": "stop",
          "index": 0
      }
  ]
}
    if (curl_errno($ch)) {
        echo 'Error:' . curl_error($ch);
    } else {
        $decoded_response = json_decode($response, true);

        if (isset($decoded_response['choices'])) { // 위 결과를 살펴보면 choices 내에 내가 바라는 값이 담겨져있다!
            $answer = $decoded_response['choices'][0]['message']['content'];
            
           return  $answer; // 문장만 return!

        } else {

            return 'error.';
        }
    }

    curl_close($ch);
    


📝 마무리

위 코드들을 정리해서 하나의 함수로 만든 후 함수들을 모아놓은 php 파일에 따로 저장하고 필요할 때마다 함수를 호출해서 쓰고 있다.
ChatGPT를 내 사이트로 연결하기? 여타 다른 오픈 API 호출 할때와 크게 다를 것 없었다.
공식 문서만 봐도 충분히 해결할 수 있는 문제였는데 성격 급해서 구글링부터 했다가 조금 헤매긴 했다.

+PlayGround 에서 옵션들을 셋팅하고 테스트해 보고 호출코드 짜기
https://platform.openai.com/playground

profile
어떻게든 되겠지!

0개의 댓글