최근 AI 기반 언어 모델은 텍스트 생성과 이해, 자연어 처리 분야에서 놀라운 성과를 이루고 있다. OpenAI의 ChatGPT는 이러한 모델 중 하나로, 사용자의 질문에 대해 자연스러운 답변을 생성할 수 있다. 이번에는 ChatGPT API를 사용하는 방법과 파이썬 예제 코드를 알아보고자 한다.
1. 필수 라이브러리 설치하기
OpenAI Python 라이브러리를 먼저 설치해야 한다.
pip install openai
2. API Key 설정하기
OpenAI에서 API Key를 먼저 발급받아야 한다.
OpenAI 사이트에서 계정을 만들고, API Key 생성 사이트에서 secret key를 생성하면 된다.
3. API Key 환경 변수 설정하기
발급받은 Key를 환경 변수로 설정해야 한다.
윈도우 환경 사용자라면 “시스템 환경 변수”에서 “시스템 변수”에 OPENAI_API_KEY="your_api_key_here"
를 등록해주면 된다.
맥 환경 사용자라면 아래 코드를 통해 환경 변수로 등록할 수 있다.
export OPENAI_API_KEY="your_api_key_here"
4. OpenAI API를 통해 질문을 보내고 답변 받기
이제 사용 준비가 완료 되었다. 간단하게 아래와 같이 get_chat_gpt_response()
함수를 만들고 사용해볼 수 있겠다.
import openai
import os
openai.api_key = os.getenv("OPENAI_API_KEY")
def get_chat_gpt_response(prompt):
response = openai.Completion.create(
engine="text-davinci-002",
prompt=f"{prompt}",
temperature=0.7,
max_tokens=150,
top_p=1,
frequency_penalty=0,
presence_penalty=0
)
return response.choices[0].text.strip()
question = "지구에서 가장 높은 산은 무엇인가요?"
answer = get_chat_gpt_response(question)
print(answer)
5. Trouble Shooting
위에 안내 한대로 했다면 아래와 같은 Error가 발생할 것이다.
"You exceeded your current quota, please check your plan and billing details."
이제 돈을 지불할 준비를 해야 한다. 1k token당 금액이 책정되어 있어서 카드 등록을 하지 않으면 못쓰게 되어있다. 이미 ChatGPT-4 사용을 위해 $20을 지불하고 있건만… OpenAI API를 쓰려면 또 등록을 해야한다.
여기 Billing overview 사이트에서 카드를 등록하면 된다.
6. 이제 진짜로 사용 가능하다
실행해보면 답변이 한방에 잘 날라온다. 분명 한글로 물어봤는데 너는 영어로 대답하는구나
7. 매개변수 셋팅
OpenAI 라이브러리로 ChatGPT를 호출할 때 여러가지 변수가 있다.
우리가 채팅의 형태로 사용할 때는 따로 변수 설정이 없지만 API를 사용하게 되면 매개변수 셋팅을 통해서 결과 텍스트의 특성을 제어하고 최적화 할 수 있다.
- temperature: 텍스트의 다양성과 무작위성을 제어한다. 값이 낮으면 일관된 텍스트를 생성하고, 값이 높으면 더 창의적이고 다양한 텍스트를 생성한다. - max_tokens: ChatGPT 모델이 생성하는 응답의 최대 토큰 수를 제한하는 기능을 수행한다. 토큰은 모델이 처리하는 텍스트의 작은 단위로, 문자, 단어, 혹은 단어의 일부가 될 수 있다. - top_p: Top-p 샘플링 또는 누적 확률 분포에서의 임계값을 설정한다. 값이 낮으면 예측 가능한 텍스트를 생성하고, 값이 높으면 더 다양한 단어와 문구가 생성된다. - frequency_penalty: 생성된 텍스트의 단어 빈도에 대한 패널티를 제어한다. 양수 값은 모델이 자주 등장하는 단어를 덜 사용하게 만들고, 음수 값은 모델이 자주 등장하는 단어를 더 선호하게 만든다. - presence_penalty: 생성된 텍스트에서 단어의 반복에 대한 패널티를 제어한다
8. 대화형으로 사용할 때와 다른 차이점은 무엇이 있을까?
매개변수 셋팅을 통해 추가로 답변을 최적화 할 수 있고, 또 다른 차이점은 무엇이 있을까?
바로, 대화의 연속성이다.
대화형으로 사용할 때는 하나의 주제로 계속 대화를 이어갈 수 있다. 이전에 답변에 대해서 다시 정리를 할 수도 있고, 이어지는 문장을 만들어 줄 수도 있다.
하지만 API 호출을 사용하게 되면 대화를 이어나가지 못한다.
바로 ChatGPT는 API 호출 간에 상태를 저장하지 않는다. 이 말은 각 API 호출이 독립적이라는 것으로, 이전 호출에서 얻은 정보를 기억하지 않는다.
그럼 대화형이 안되면 API는 기능이 반감되는 것은 아닐까?
그래서 API호출에서도 대화형으로 구현을 할수도 있지만, 제약이 있다.
방법은 이전 호출의 내용을 현재 호출의 입력으로 포함하여 대화 기록을 강제로 유지시키는 것이다.
두 개의 질문이 있고 각 질문에 대한 답변을 얻으려면, 두 번째 질문에서 첫 번째 질문과 답변을 함께 입력으로 전달하면 된다. 이렇게 하면 모델이 이전 대화의 문맥을 이해하고 적절한 응답을 생성할 수 있다.
question1 = "지구에서 가장 높은 산은 무엇인가요?"
answer1 = get_chat_gpt_response(question1)
question2 = "그 산의 높이는 얼마인가요?"
full_question2 = f"{question1}\n{answer1}\n{question2}"
answer2 = get_chat_gpt_response(full_question2)
print(answer2)
이 방법을 사용하면 이전 대화의 정보를 기억하여 모델이 일관된 응답을 생성할 수 있다. 하지만 대화가 길어질수록 입력 텍스트가 길어지므로, 모델의 최대 토큰 수를 초과하지 않도록 주의해야 한다는 점이 제약 사항이 될 것이다. 혹은 매번 긴 문장을 사용하게 되므로 token이 많아져 내가 내는 비용이 커질 수 있겠다. 이 경우 일부 정보를 생략하거나 요약해야 할 수도 있을 것이다.