이 포스트에는 ChatGPT API를 사용하는 방법, 적절한 프롬프트 엔지니어링, 인터렉티브하게 만드는 방법에 대해 알아보겠습니다.
ChatGPT API의 가격은 1K 토큰당 0.002 달러입니다.
https://chat.openai.com/chat 에 회원가입해서 무료로 사용할 수 가 있습니다.
OpenAI API에서 텍스트를 어떻게 토큰화하는지 이해하고, 텍스트의 총 토큰 수를 알아보려면 아래 도구(사이트)를 사용할 수 있습니다.
https://platform.openai.com/tokenizer
OpenAI API
An API for accessing new AI models developed by OpenAI
platform.openai.com
API 키 생성
ChatGPT API를 사용하기 전에는 OpenAi계정에 로그인하여 API 키를 생성해야합니다.
https://platform.openai.com/account/api-keys
OpenAI API
An API for accessing new AI models developed by OpenAI
platform.openai.com
라이브러리 설치
ChatGPT API를 사용하기 위해서는 먼저 다음 명령을 실행하여 OpenAI라이브러리를 설치해야합니다.
pip install openai
Python 에서 ChatGPT API 시작하기
official documentation에서 제공하는 code snippet입니다.
completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "Tell the world about the ChatGPT API in the style of a pirate."}
]
)
print(completion.choices[0].message.content)
OpenAI 라이브러리로 다양한 작업을 수행할 수 있지만, 오늘은 Completion Endpoint에 대해 중점적으로 살펴보겠습니다.
좀 더 정확히는 ChatCompletion입니다. gpt-3.5-turbo 는 ChatGpt에서 사용하는 것과 동일한 모델입니다.
Completion Endpoint는 사용자의 질문이나 메시지를 완성하는 데 사용되는 프로그래밍 인터페이스를 의미합니다.
ChatCompletion는 사용자가 API를 통해 ChatGpt 모델에게 데이터를 전송하고 응답을 받을 수 있는 방법을 제공합니다. 일반적으로 이러한 엔드포인트는 웹 서비스에서 RESTful API와 같은 형태로 구현되어 있으며, 사용자의 요청을 처리하고 응답을 생성하는 데 사용됩니다. 이를 통해 챗봇, 번역, 요약, 질문 응답 등 다양한 자연어 처리 작업에 활용할 수 있습니다.
# create a completion
completion = openai.Completion.create(model="ada", prompt="Hello world")
# print the completion
print(completion.choices[0].text)
OpenAI는 이전에 사용 가능했던 다른 방법들과는 약간 다르게 작동하는 새로운 API를 만들 었습니다. ChatGPT의 경우, 모델에 텍스트 프롬프트를 보내지 않습니다. 대신 메세지 리스트를 전송합니다. 각 메세지에는 role, content가 있습니다. role은 system, user, assistant, 중 하나가 될 수 있습니다. content는 메세지 내용 그자체입니다. API는 매번 전체 채팅 기록을 사용하여 다음 메시지를 생성합니다. API는 다음 메시지만 반환하므로, 더 긴 상호작용(멀티턴)을 구현하려면 메시지 기록을 직접 유지해야합니다.
completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "Tell the world about the ChatGPT API in the style of a pirate."}
]
)
print(completion.choices[0].message.content)
ChatGPT API는 대화형 챗봇을 만들 수 있는 API입니다. ChatGPT API에서 system, user, assistant는 다음과 같은 의미를 가집니다.
- system: 챗봇의 성격이나 행동 방식에 대한 지시를 전달하는 역할입니다.
- 예를 들어, "You are an assistant that speaks like Shakespeare."와 같은 문장을 system으로 보내면, 챗봇은 셰익스피어의 말투로 답변을 합니다.
- user: 챗봇과 대화하는 사람의 역할입니다.
- 예를 들어, "tell me a joke"와 같은 문장을 user로 보내면, 챗봇은 농담을 하나 말해줍니다.
- assistant: 챗봇 자신의 역할입니다. 챗봇은 user의 메시지에 따라 assistant로 답변을 합니다.
ChatGPT API는 messages라는 파라미터에 system, user, assistant의 역할과 내용이 담긴 리스트를 보내면, 그에 맞는 assistant의 메시지를 반환합니다.
아래는 예시입니다.
# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
import openai
openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"}
]
)
이라는 API를 call하면
위와 같은 포맷으로 API가 response 됩니다.
모든 response는 finish_response를 포함하고 있습니다.
ChatGPT API에서 finish_response는 생성된 텍스트의 끝을 나타내는 파라미터입니다. finish_response는 다음과 같은 값들 중 하나를 가질 수 있습니다.
- stop : 생성된 텍스트가 정상적으로 끝났음을 의미합니다. 예를 들어, 문장이 마침표로 끄탄거나 코드가 완성되었을 때 'stop'이 됩니다.
- lenght : 생성된 텍스트가 모델의 토큰 제한에 도달했음을 의미합니다.
- timeout : 생성된 텍스트가 시간 제한에 걸렸음을 의미합니다.
python에서 assistant의 답변을 추출하기 위해서는 python에서 assistant의 답변을 추출하기 위해서는 아래의 코드를 사용하면 됩니다.
response['choices'][0]['message']['content']
다양한 파라미터 예시
temperature VS top_p
temperature와 top_p는 모두 텍스트의 무작위성이나 다양성을 조절하는 파라미터입니다.
하지만 두 파라미터는 서로 다른 방식으로 작동합니다.
확률 분포란 텍스트를 생성할 때 각각의 토큰이 선택될 확률을 나타내는 것입니다.
예를 들어, "You are a funny assistant."라는 프롬프트에 대해 다음 토큰을 생성한다고 가정했을 때,
다음 토큰에 대한 확률 분포는 다음과 같이 나타낼 수 있습니다.
- “You are a funny assistant.”
- “.” : 0.6
- " and" : 0.2
- " who" : 0.1
- " with" : 0.05
- " because" : 0.03
- " but" : 0.01
- " like" : 0.005
- " unlike" : 0.0025
- " despite" : 0.0015
- " although" : 0.0005
temperature
확률 분포의 온도란 확률 분포의 모양을 조절하는 값입니다. 온도가 높으면 확률 분포가 평평해지고, 온도가 낮으면 확률 분포가 뾰족해집니다. 이는 텍스트의 예측 가능성이나 창의성에 영향을 줍니다. 온도가 높으면 예측하기 어려운 텍스트가 생성되고, 온도가 낮으면 예측하기 쉬운 텍스트가 생성됩니다.
예를 들어, 앞서 사용한 프롬프트에 대해 온도가 0.1인 경우와 0.9인 경우에 생성된 확률 분포는 다음과 같습니다.
- 온도 = 0.1: [ “.” : 0.95, " and" : 0.04], 나머지 토큰들은 거의 선택되지 않습니다.
- 온도 = 0.9: [ “.” : 0.3, " and" : 0.15, " who" : 0.1, " with" : 0.08, " because" : 0.07, " but" : 0.06, " like" : 0.05, " unlike" : 0.04, " despite" : 0.03, " although" : 0.02]
정리하자면, 온도가 0.1인 경우에는 확률이 높은 토큰들만 선택되기 때문에, 보다 예측 가능한 텍스트가 생성됩니다. 온도가 0.9인 경우에는 확률이 낮은 토큰들도 선택될 수 있기 때문에, 보다 예측하기 어려운 텍스트가 생성됩니다.
- temperature = 0.1: “You are a funny assistant. I like to make jokes and entertain people.”
- temperature = 0.9: “You are a funny assistant. I can do impressions of celebrities and animals.”
temperature가 0.1인 경우에는 프롬프트와 비슷한 텍스트가 생성되었고, temperature가 0.9인 경우에는 프롬프트와 다른 텍스트가 생성되었습니다. temperature가 0.9인 경우에는 더 창의적이고 다양한 텍스트가 생성되었지만, 논리적이지 않거나 일관성이 없을 수 있습니다.
top_p
확률 분포의 잘림 정도란 확률 분포에서 잘라낸 부분의 비율을 말합니다. 잘림 정도가 높으면 확률 분포에서 높은 확률을 가진 후보들만 선택되고, 잘림 정도가 낮으면 확률 분포에서 낮은 확률을 가진 후보들도 선택될 수 있습니다. 이는 텍스트의 다양성이나 일관성에 영향을 줍니다. 잘림 정도가 높으면 다양한 텍스트가 생성되고, 잘림 정도가 낮으면 일관된 텍스트가 생성됩니다.
예를 들어, 앞서 사용한 프롬프트에 대해 잘림 정도가 0.1인 경우와 0.9인 경우에 생성된 확률 분포는 다음과 같습니다.
- 잘림 정도 = 0.1: [“.” : 0.6, " and" : 0.2], 나머지 토큰들은 선택되지 않습니다.
- 잘림 정도 = 0.9: [“.” : 0.6, " and" : 0.2, " who" : 0.1, " with" : 0.05, " because" : 0.03, " but" : 0.01, " like" : 0.005, " unlike" : 0.0025, " despite" : 0.0015, " although" : 0.0005]
정리하자면 잘림 정도가 0.1인 경우에는 확률이 높은 토큰들만 선택되기 때문에, 보다 일관된 텍스트가 생성됩니다. 잘림 정도가 0.9인 경우에는 확률이 낮은 토큰들도 선택될 수 있기 때문에, 보다 다양한 텍스트가 생성됩니다.
- top_p = 0.1: “You are a funny assistant. I can make you laugh with my witty remarks and hilarious stories.”
- top_p = 0.9: “You are a funny assistant. I have a lot of jokes and puns in my database.”
top_p가 0.1인 경우에는 확률이 높은 후보들만 선택되었기 때문에, 보다 일반적이고 자연스러운 텍스트가 생성되었습니다. top_p가 0.9인 경우에는 확률이 낮은 후보들도 선택될 수 있었기 때문에, 보다 특이하고 독특한 텍스트가 생성되었습니다.
temperature와 top_p의 차이를 다시 설명하면 다음과 같습니다.
- temperature는 텍스트의 예측 가능성이나 창의성을 조절하는 파라미터입니다. 온도가 높으면 예측하기 어려운 텍스트가 생성되고, 온도가 낮으면 예측하기 쉬운 텍스트가 생성됩니다.
- top_p는 텍스트의 다양성이나 일관성을 조절하는 파라미터입니다. 잘림 정도가 높으면 다양한 텍스트가 생성되고, 잘림 정도가 낮으면 일관된 텍스트가 생성됩니다.
OpenAI API
An API for accessing new AI models developed by OpenAI
platform.openai.com
'임영윤' 카테고리의 다른 글
query embedding vector, document embedding vector (0) | 2023.04.06 |
---|---|
지식 그래프, 프롬포트 튜닝 논문 2편 요약 (0) | 2023.03.17 |
AI art generator를 위한 프롬프트 작성 가이드 (0) | 2023.03.10 |
ChatGPT PROMPT (0) | 2023.03.03 |
BLEU와 KLEU (0) | 2023.02.24 |