ChatGPT를 내가 개발하고 있는 서비스에서 호출해서 사용하려면 어떻게 해야 할까? 현재 OpenAI에서는 Curl, Node.js 그리고 Python 이렇게 세 종류의 API를 제공하고 있으며, 이 중 Python에서 사용하는 방법을 정리해보려 한다.
API key 불러오기
먼저 실습은 MacOS, 그리고 주피터 노트북 환경에서 진행한다. API key를 불러오는 방식은 두 가지가 있다. 먼저 시스템 환경 변수에 저장해 두고 필요할 때 가져오는 방식 (보안에 강하다), 그리고 코드에서 직접 api key를 작성하여 불러오는 법이다.
먼저 터미널을 열고 해당 명령어를 실행하여 .zshrc 파일을 편집한다.
vi ~/.zshrc
.zshrc 파일 원하는 위치 아무 데다가
export OPENAI_API_KEY= "발급받은 키값을 여기에 넣기"
를 작성하고 저장해 준다.
from openai import OpenAI
import os
client = OpenAI(api_key= os.getenv("OPENAI_API_KEY"))
불러올 때는 이런 방식으로 초기화하면 되는데, 간혹 주피터 노트북으로 실습을 할 때에는 이렇게 환경 변수를 불러오는 방식이 잘 작동하지 않을 때가 있으므로, 만약 오류가 난다면 아래와 같이 직접 불러오는 방식을 사용하자.
client = OpenAI(api_key= "이곳에 키값 작성")
챗봇 방식의 요청 보내기
response = client.chat.completions.create(
model= "gpt-3.5-turbo",
messages= [
{
"role": "system",
"content": "너는 AI 전문가야."
},
{
"role": "user",
"content": "트랜스포머 구조에 대해 알려줘."
}
],
max_tokens= 50,
temperature= 1,
top_p= 1,
frequency_penalty= 0,
presence_penalty= 0
)
print(response.choices[0].message.content)
client에 api key를 올바르게 넣었다면 위와 같은 코드로 요청을 보내볼 수 있다. create() method가 지니고 있는 프로퍼티가 많지만, 우리가 필수적으로는 model, message만 작성해 주면 되고 나머지 값들은 default 값으로 반영된다. 앞서 설명한 포스팅에 각 프로퍼티가 무엇을 의미하는지 적어뒀으니 해당 포스팅을 참고하면 도움이 될 것이다.
위 코드에서는 시스템에게 AI 전문가라는 페르소나를 설정해 주었고, 트랜스포머 구조에 대해 물어보았다. api 비용을 아끼기 위해 max_tokens을 50으로 지정해 보았는데,
위와 같이 그냥 생성하다가 최대 토큰 수에 닿으면 생성을 멈춘다. 짧게 설명받기 위해서는 최대 토큰 수를 조정하는 것이 아니라 프롬프트를 작성해 주는 게 옳은 절차로 보인다.
만약 api의 기능으로 대화형 시스템을 만들고 싶다면 이렇게 GPT가 내보낸 답변을 message에 assistant로 추가해 주는 것이 중요하다.
response = client.chat.completions.create(
model= "gpt-3.5-turbo",
messages= [
{
"role": "system",
"content": "너는 AI 전문가야."
},
{
"role": "user",
"content": "트랜스포머 구조에 대해 알려줘."
},
{
"role": "assistant",
"content": "트랜스포머(Transformer)는 자연어 처리 분야에서 뛰어난 성능을 보이는 딥러닝 모델 구조로, 2017년에 발표된 "Attention is All You Need" 논문에서 처음 소개되었습니다. 트랜스포머는 순환 신경망(RNN)이나 합성곱 신경망(CNN) 없이도 시퀀스 데이터를 처리하는 데 효과적입니다. 주요 개념인 **어텐션 메커니즘(Attention Mechanism)**을 통해 입력 시퀀스의 모든 위치 간의 관계를 모델링하여 병렬 처리가 가능하고, 길고 복잡한 의존성을 다룰 수 있습니다."
},
{
"role": "user",
"content": "너무 길잖아. 짧게 부탁해."
}
],
max_tokens= 50,
temperature= 1,
top_p= 1,
frequency_penalty= 0,
presence_penalty= 0
)
print(response.choices[0].message.content)
이렇게 message 속에 GPT의 답변을 assistant로 넣어줌으로써 모델이 이전 대화 내용을 기억하고 답변에 참조할 수 있다.
문장 완성하기
response = client.completions.create(
model= "gpt-3.5-turbo-instruct",
prompt= "옛날 옛적에",
max_tokens= 50
)
print(response.choices[0].text.strip())
ChatGPT의 대화 기능이 필요한 것이 아니라면, GPT가 가진 디코더 기능에 초점을 둔 문장 생성 또한 가능하다. 앞선 문장을 주고, 뒤에 이어질 단어들을 확률에 기반하여 생성한다.
중간에 잘라서 그런데, 아마 최대 토큰 수를 지정하지 않았다면 꽤 자연스러운 문장이 생성될 것으로 보인다.
이 외에도 편집, 임베딩 생성, 파인 튜닝을 위한 파일 관리, 그리고 이미지, 음성 인식과 같이 다양한 작업을 api를 통해 해결할 수 있다. 이 정도면 이것저것 할 수 있는 기반은 다진 것 같은데, 만약 시도를 해보다 심화적인 부분에 대한 기록이 필요하다면 추가 포스팅을 진행하겠다.
'AI' 카테고리의 다른 글
[LLM] 트랜스포머 구조 파헤치기 (3) - 정규화와 피드 포워드 층 (0) | 2024.11.07 |
---|---|
[LLM] 트랜스포머 구조 파헤치기 (2) - 어텐션 (Attention) 이해하기 (2) | 2024.11.04 |
[LLM] OpenAI API (2) - Playground를 사용해 보자 (1) | 2024.11.01 |
[LLM] OpenAI API (1) - API key 발급하기 (0) | 2024.10.30 |
[LLM] 트랜스포머 구조 파헤치기 (1) - 텍스트를 임베딩 (Embedding)으로 변환하기 (3) | 2024.10.24 |